我试图检查我的表中是否已存在记录,以及是否我想要使用预准备语句执行插入操作。任何人都可以告诉我下面的错误是什么?我已经用错误检查编写了代码,它基本上说查询是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
答案 0 :(得分:2)
首先错误的根与预准备语句无关。只是你不能在存储例程(过程,函数,触发器,事件)的范围之外使用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();
}
答案 1 :(得分:0)
由于您使用PHP进行编码,因此需要考虑的一件事是从该表对SELECT
执行sql查询,如果没有返回任何内容,则运行插入查询。
我确信它可以通过SQL完成,但我个人不知道如何。
祝你好运,抱歉,如果这没有帮助。答案 2 :(得分:0)
请探讨他们。 据我所知,您的具体案例可以通过INSERT IGNORE命令来处理。
注意:我在这里假设Mysqli与MYSQL相同
更新:现在我知道mysqli是MYSQL的接口。但是insert ignore的概念仍然是相同的。 示例了解INSERT IGNORE的使用 请参考下表。
CREATE TABLE person_tbl(first_name CHAR(20)NOT NULL,last_name CHAR(20)NOT NULL,sex CHAR(10),PRIMARY KEY(last_name,first_name));
这里firstname&amp; lastname形成主键
现在我们运行查询
的MySQL&GT; INSERT INTO person_tbl VALUES(&#39; Jay&#39;,&#39; Thomas&#39;);
它会在表格中添加一行
如果我们将运行上面的sql,它会因重复记录异常而失败。为防止此异常,我们有2个选项
1)检查记录是否已经存在,如果没有则插入记录....我们必须激活select然后插入查询。
2)触发INSERT IGNORE SQL ..它将检查表中是否存在if记录,如果存在则不会插入记录,如果没有则插入记录。
例如如果我们运行查询
的MySQL&GT; INSIGN IGNORE INTO person_tbl VALUES(&#39; Jay&#39;,&#39; Thomas&#39;);
这个sql不会插入任何记录..asas记录已经存在
但是
的MySQL&GT; INSIGN IGNORE INTO person_tbl VALUES(&#39; Vijay&#39;,&#39; Thomas&#39;);
它会在表格中插入一条记录。