我一直在使用pdo和下面的函数一次插入1000个块的多个记录。现在我使用的是一个使用mysqli的系统,我想知道是否可以稍微修改我的函数来使用mysqli,但是我注意到mysqli execute不接受数组作为参数。以下功能在PDO中运行得非常好和快速:
$sub_data = array_chunk($data, 1000);
for ($b = 0; $b < count($sub_data); $b++)
{
$insert_values = array();
for ($a = 0; $a < count($sub_data[$b]); $a++)
{
$insert_values = array_merge($insert_values, array_values($sub_data[$b][$a]));
$placeholder[] = '(' . implode(', ', array_fill(0, count($sub_data[$b][$a]), '?')) . ')';
}
$sql2 = "INSERT INTO $table_name (" . implode(",", array_keys($sub_data[$b][0])) . ") VALUES " . implode(',', $placeholder) . "";
$prepare = $db->prepare($sql2);
try
{
$prepare->execute($insert_values);
}
catch (mysqli_sql_exception $e)
{
echo "<pre>";
print_r($sub_data[$b]);
echo "</pre>";
echo $e->getMessage();
print_r($db->errorInfo());
}
unset($insert_values);
unset($placeholder);
}
谢谢您!
最佳答案
你发现人们对mysqli扩展有更大的不满。pdo使用一个令牌绑定系统,在这个系统中,您可以传递一系列参数和密钥,pdo会将它们结合起来。mysqli使用了一个更加模糊的绑定系统,当要传递给数组的元素数量不确定时,可能会导致问题。
一个主要的问题是mysqli想知道第一个参数是什么类型的数据。如果你不关心这个级别的过滤,你可能会滑冰,只要声明所有的字符串。如果这不起作用,请添加一些逻辑以在字符串和整数之间进行更改。为此,我们将在开始时向$insert_values
添加另一个参数,以便我们可以将适当数量的字符串作为第一个参数传入
$insert_values = array(0 => '');
for ($a = 0; $a < count($sub_data[$b]); $a++)
{
$insert_values = array_merge($insert_values, array_values($sub_data[$b][$a]));
$placeholder[] = '(' . implode(', ', array_fill(0, count($sub_data[$b][$a]), '?')) . ')';
$insert_values[0] .= 's';
}
$insert_values[0]
现在应该类似于ssssss
(与数组中的元素数目相同)。我假设在不重构s
的情况下执行此操作,这可能会导致问题。该字符串必须是第一个,因为它将成为mysqliarray_merge
调用的第一个参数。然后我们可以使用反射类来进行绑定
$reflect = new ReflectionClass('mysqli_stmt');
$method = $reflect->getMethod('bind_param');
$method->invokeArgs($prepare, $insert_values);
$prepare->execute();
关于php - 如何使用类似于pdo的mysqli一次插入多个记录,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26284766/