很抱歉问这个问题。我读过很多类似的书,但从未找到一个可以成功实现的解决方案。我发现的所有提示和技巧对我来说都没有用。
我有一个包含数据的大型关联数组,我想使用带有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(),以及connection属性,但没有成功。我还试着为每个电话做一个新的声明:
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
我想出来的东西都试过了。请帮我想办法让它发挥作用。
在执行循环中获取所有结果后,应获取下一个行集,然后关闭光标,然后再尝试执行存储过程。试试这个:
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正在返回第二个行集,在同一连接上执行第二个(及后续)存储过程之前,您需要访问该行集。
使用未命名参数进行动态查询比使用命名参数更简单。
即插入
$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 (?, ?, ?)