SQL = IF NOT EXISTS在准备好的声明中?

时间:2014-04-13 02:02:48

标签: php sql mysqli prepared-statement exists

我试图检查我的表中是否已存在记录,以及是否我想要使用预准备语句执行插入操作。任何人都可以告诉我下面的错误是什么?我已经用错误检查编写了代码,它基本上说查询是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

3 个答案:

答案 0 :(得分:2)

首先错误的根与预准备语句无关。只是你不能在存储例程(过程,函数,触发器,事件)的范围之外使用IFBEGIN ... 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)

在MYSQL中,有4种类型的插入可用。 1)INSERT 2)INSERT IGNORE 3)INSERT ON DUPLICATE KEY 4)REPLACE

请探讨他们。 据我所知,您的具体案例可以通过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;);

它会在表格中插入一条记录。