我正在检查表中是否已经存在记录,如果不存在,我想执行插入。。。使用事先准备好的语句。有人能告诉我下面出了什么问题吗?我写的代码带有错误检查,它基本上说查询是poo:)当涉及到SQL和几乎任何与编程相关的东西时,我都很糟糕,所以我真的很感激在这个看起来不可靠的任务中分享的任何智慧。。。谢谢
$mysqli = mysqli_connect($config['host'], $config['user'], $config['pass'], $config['db']);
$timestamp = time();
$stmt = $mysqli->prepare("IF NOT EXISTS (SELECT id FROM course_licence_cart WHERE userid = ? AND courseid = ? AND lmsid = ?) BEGIN INSERT INTO course_licence_cart (lmsid, userid, courseid, assigned_by, assigned_on) VALUES (?, ?, ?, ?, ?) END");
foreach($_POST['assignTo'] as $assignTo){
$stmt->bind_param('iiiiiiii', $assignTo, $_POST['course'], $core['id'], $core['id'], $assignTo, $_POST['course'], $userInfo['id'], $timestamp);
$stmt->execute();
}
仅供参考:这发生在表单提交之后,我检查了所有的变量,它们都很好,流程本身运行得很好(我让它在没有IF NOT EXISTS
的情况下运行),正是这种新的查询类型与准备好的语句混合在一起,让我完全失望了。
-更新--
我直接运行了以下内容:
IF NOT EXISTS (SELECT `id` FROM `course_licence_cart` WHERE `userid` = '175' AND `courseid` = '1' AND `lmsid` = '1') BEGIN INSERT INTO `course_licence_cart` (`lmsid`, `userid`, `courseid`, `assigned_by`) VALUES ('1', '175', '1', '175') END
在其中我得到了错误:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IF NOT EXISTS (SELECT `id` FROM `course_licence_cart` WHERE `userid` = '175' AND' at line 1
首先错误的根源与准备好的语句无关。只是不能在存储例程(过程、函数、触发器、事件)的范围之外使用IF
、BEGIN ... END
块和其他构造。
为了防止重复,您可以像一样利用INSERT IGNORE
$stmt = $mysqli->prepare("INSERT IGNORE INTO course_licence_cart (lmsid, userid, courseid, assigned_by, assigned_on) VALUES (?, ?, ?, ?, ?)");
foreach($_POST['assignTo'] as $assignTo){
$stmt->bind_param('iiiiiiii', $assignTo, $_POST['course'], $core['id'], $core['id'], $assignTo, $_POST['course'], $userInfo['id'], $timestamp);
$stmt->execute();
}
为了实现这一点,您必须定义一个唯一的约束。
CREATE UNIQUE INDEX index_name
ON course_licence_cart (userid, courseid, lmsid);
这是SQLFiddle演示
现在,您的代码(在更正语法后)可以在类似的存储过程中工作
DELIMITER //
CREATE PROCEDURE add_to_cart(IN _lmsid INT, IN _userid INT, _courseid INT, IN _assigned_by INT, IN _assigned_on DATETIME)
BEGIN
IF NOT EXISTS (SELECT *
FROM course_licence_cart
WHERE userid = _userid
AND courseid = _courseid
AND lmsid = _lmsid) THEN
INSERT INTO course_licence_cart (lmsid, userid, courseid, assigned_by, assigned_on)
VALUES (_lmsid, _userid, _courseid, _assigned_by, _assigned_on);
END IF;
END//
DELIMITER ;
这是SQLFiddle演示
在这种情况下,php代码看起来像
$stmt = $mysqli->prepare("CALL add_to_cart (?, ?, ?, ?, ?)");
foreach($_POST['assignTo'] as $assignTo){
$stmt->bind_param('iiiiiiii', $assignTo, $_POST['course'], $core['id'], $core['id'], $assignTo, $_POST['course'], $userInfo['id'], $timestamp);
$stmt->execute();
}
由于您使用PHP进行编码,需要考虑的一件事是从该表对SELECT
执行sql查询,如果没有返回任何内容,则运行插入查询。
我确信它可以通过SQL实现,但我个人不知道如何实现。
祝你好运,如果没有帮助的话,很抱歉。
在MYSQL中,有4种类型的插入可用。1) 插入2)插入忽略3)插入重复的密钥4)替换
请探究它们。据我所知,您的具体情况可以通过INSERT IGNORE命令来处理。
注意:我在这里假设Mysqli与MYSQL 相同
更新:现在我知道mysqli是MYSQL的接口。但是insert-ignore的概念仍然是一样的。理解INSERT IGNORE用法的示例考虑下表。
CREATE TABLE person_tbl(last_name CHAR(20)NOT NULL,last_name CHAR(20)NOT NULL,sex CHAR(10),PRIMARY KEY(last_name,first_name));
此处为firstname&姓氏形成主密钥
现在我们运行查询
mysql>插入person_tbl值('Jay','Thomas');
它将在表中添加一行
如果我们要运行上面的sql,它将失败,并出现重复的记录异常。为了防止这种异常,我们有两个选项
1) 检查记录是否已存在,如果不存在,则插入记录。。。。我们必须激发select,然后插入查询。
2) fire INSERT IGNORE SQL。。它将检查表中是否存在记录如果存在则不插入记录,如果不插入则插入记录。
例如如果我们运行查询
mysql>将IGNORE插入person_tbl值('Jay','Thomas');
此sql不会插入任何记录。。由于记录已存在
但是
mysql>将IGNORE插入person_tbl值('Vijay','Thomas');
它将在表中插入一条记录。