准备多个插入mysqli

时间:2013-02-26 16:18:51

标签: php mysql mysqli

请在结束前阅读完整的问题:) 我正在寻找带有 mysqli 的预备声明(重要的是,不是PDO,因为我无法使用它,也无法将一些PDO代码传输到mysqli。),我可以在长查询中插入很多价值观(约2000)。但是必须准备好查询。

<小时/> 所以我开始是这样的:

$array = array("a1", "a2", "a3","a5", "a7", "a5","a9", "a32", "a3", "a4"); 
// AND SO ON UP TO 2000
$type = "s";
$end = count($array);

$query = "INSERT INTO table (value) VALUES (?)";
for ($i = 0; $i <= $end - 1; $i++) 
{
    $query  .= ", (?)";
    $type   .= "s";
}

$stmt = $conn->prepare($query); 
$stmt->bind_param("$type", /* PROBLEM */); // HERE IS THE PROBLEM!!!
$stmt->execute();
$stmt->close();

<小时/> 但是现在我的问题是,如何在“bind_param”中动态绑定变量?
请不要在“执行”中向我显示类似for循环的内容,因为对于2000插入来说这太慢了。)。

我的意思是

$allvalues = "";
foreach ($array as $value) 
{
    $allvalues .= "$value ";
}
$stmt->bind_param("$type", $allvalues);

但当然,我无法约束它。

2 个答案:

答案 0 :(得分:4)

使用call_user_func_array使用数组调用该函数。

或者只是将所有变量传递给执行,然后你甚至不需要使用bind_param

答案 1 :(得分:1)

我花了很长时间试图找到一个简单而优雅的解决方案来解决这个问题,并找到了一些完美的方法(在php5.6及以上版本中有效)。

$array = array("a1", "a2", "a3", "a4", "a5", "a6"); 

$type = str_repeat("s", 6);

$query = "INSERT INTO table (value) VALUES (?)" . str_repeat(", (?)", 6);

$stmt = $conn->prepare($query); 
$stmt->bind_param($type, ...$array);
$stmt->execute();
$stmt->close();

... $ array称为splat operator。当我尝试插入多个行时遇到了一个问题-因为它没有以正确的顺序给出值-因此只需要创建一个包含所有行的单个数组即可。