标题继续...... 因为我想避免这个错误#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
抱歉 - 我知道我在这里挤了很多信息。所以请花点时间回复。
由于
答案 0 :(得分:0)
错误消息与问题无关。错误是表结构,并且消息ID被设置为主键,而实际上密钥应该与收件人ID聚集在一起。
对存储过程进行了3-4次修改,以便能够识别它失败,因为它在唯一的主键上插入了副本。最终结果我学到了一些新东西。