我很抱歉提出这个问题。我已经阅读了很多,但从未找到我成功实施的解决方案。我发现的所有提示和技巧都对我毫无用处。
我有一个大的关联数组,其中包含我想使用PDO存储过程插入mysql数据库的数据。
$data_arr = {a lot of data with keys: Name, Nbr, Val} //This is really 41 columns
$inputs = array('Name','Nbr','Val');
$query = 'CALL add_edit_standard(:Name,:Nbr,:Val)';
$stmt = $db->prepare($query);
foreach($inputs AS $Akey => $Aval){
$values[$Aval]=0;
$stmt->bindParam(':'.$Aval,$values[$Aval]);
}
foreach($data_arr AS $key => $val){
$values = $val;
$stmt->execute();
$res = $stmt->fetchAll();
}
这对于$ data_arr中的第一行完全正常,但第二行和其他行引发错误:
警告:PDOStatement :: execute():SQLSTATE [HY000]:常规错误:2014在其他未缓冲的查询处于活动状态时无法执行查询。考虑使用PDOStatement :: fetchAll()。或者,如果您的代码只是针对mysql运行,则可以通过设置PDO :: MYSQL_ATTR_USE_BUFFERED_QUERY属性来启用查询缓冲。
我尝试过fetchAll(),以及没有运气的连接属性。 我还尝试为每个电话做一个新的声明:
foreach($data_arr AS $key => $val)
{
$values = $val;
$stmt = $db->prepare($query);
foreach($inputs AS $Akey => $Aval)
{
$stmt->bindValue(':'.$Aval,$values[$Aval]);
}
$stmt->execute();
$res = $stmt->fetchAll();
$stmt->closeCursor();
}
同样,这适用于第一行,但随后会抛出以下错误:
警告:数据包乱序。预计1收到57.数据包大小= 7
我已经尝试过我想出的一切。请帮我找到一种方法让它发挥作用。
答案 0 :(得分:1)
使用未命名参数进行动态查询比使用命名参数更简单。
即INSERT
$columnNames = array("id","name","address");
$columnStr ='';
foreach ($columnNames as $value)
{
$columnStr .= $value.",";
}
$columnStr = substr($columnStr, 0, -1);
$values = array(1,"john","Home");
$params = str_repeat('?, ', count($values) - 1) . '?';
$sql = "INSERT INTO table1 ($columnStr) VALUES ($params) ";
$stmt = $dbh->prepare($sql);
$stmt->execute($values);
生成查询
INSERT INTO table1 (id,name,address) VALUES (?, ?, ?)
答案 1 :(得分:1)
在执行循环中获取所有结果后,应该获取下一个行集,然后在尝试再次执行存储过程之前关闭游标。试试这个:
foreach($data_arr AS $key => $val){
$values = $val;
$stmt->execute();
$res = $stmt->fetchAll();
$stmt->nextRowset(); // NEW: Get the next rowset after fetching your results
$stmt->closeCursor(); // NEW: Close the cursor
}
这里真正重要的是对nextRowSet()的呼唤。在引擎盖下,PDO返回第二个 rowset ,您需要在同一连接上执行第二个(和后续的)存储过程之前访问它。