如何使用字符串ID为存储过程插入多个记录?

时间:2013-11-18 16:03:42

标签: php mysql stored-procedures

标题继续...... 因为我想避免这个错误#2014 - 命令不同步;你现在不能运行这个命令

环境:5.6.11 - MySQL,Apache / 2.4.4(Win32)OpenSSL / 1.0.1e PHP / 5.5.3

尝试将邮件副本发送给多个收件人。这是以前工作,我只是调试它,由于某种原因第二次执行失败,但我没有提到任何异常,但我发现一个问题服务器端(详见下文)

可以使用循环对PDO执行语句进行多次调用吗?如果不是为什么?我以前有这个工作,现在所有连续的电话都失败了。

是否有更好的方法将一个或多个收件人的数组发送到存储过程,以便可以为每个收件人执行插入语句?

如果我发送一串1,2。返回的回复是:

发送给'1'的消息
消息未能发送到'2'

下面包含函数insert_recipient和存储过程add_recipient

//connection to db, setting up of execption handling
$this->_dbh = new PDO("mysql:host=$this->_host;dbname=$this->_dbname", $this->_dbusername, $this->_dbpassword);
$this->_dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);

//method of inserting recipient, currently each recipient is added individually
//second call to this method currently fails to execute... why?
//is there a better method of sending a string of common separated values 
//and allow the stored procedure to insert all the records at once?

public function insert_recipient($recipientStr)
{
    try
    {
     // separate the csv
        $recipient_array = explode(",", $recipientStr);

        //bind a recipient and execute the statement / stored procedure
        foreach($recipient_array AS $recipient )
        {

            $statement =  $this->_dbh->prepare("Call add_recipient(?)");              
            $statement->bindParam(1, $recipient);                
            if($statement->execute()){
                echo "Message sent to '".$recipient."'.<br />";
            }else{
                echo "Message failed to be sent to '".$recipient."'. ";
                var_dump($statement);
            }

        }

    }
    catch(PDOException $e)
    {
       echo $e->getMessage();
    }
}

这是存储过程...

DELIMITER //
DROP PROCEDURE IF EXISTS `add_recipient`//

CREATE PROCEDURE `add_recipient`(
   IN recipientID BIGINT(20)
)
BEGIN
   INSERT INTO message_recipient(message_id, recipient_id, is_read ) VALUES (LAST_INSERT_ID(), recipientID, 0);
   SELECT thread_id FROM message WHERE message_id = LAST_INSERT_ID();
END//

我尝试删除SELECT语句但仍然失败。我开始认为LAST_INSERT_ID()可能是问题...因为当我将第一个收件人插入此表时没有auto_increment但是不知何故插入新记录正在删除之前的id。这听起来不错吗?原因文档告诉我,此功能应该基于上一个自动索引字段,这是我目前使用它的方式。

服务器端问题:

我在phpmyadmin的mysql控制台上运行了以下内容,并收到以下错误消息:

call send_message("test123","test123",1);
call add_recipient(2);
call add_recipient(3);

SQL query:

call add_recipient( 3 ) ;

MySQL said: Documentation
#2014 - Commands out of sync; you can't run this command now 

抱歉 - 我知道我在这里挤了很多信息。所以请花点时间回复。

由于

1 个答案:

答案 0 :(得分:0)

错误消息与问题无关。错误是表结构,并且消息ID被设置为主键,而实际上密钥应该与收件人ID聚集在一起。

对存储过程进行了3-4次修改,以便能够识别它失败,因为它在唯一的主键上插入了副本。最终结果我学到了一些新东西。