1

请在关闭它之前阅读完整的问题:)
我正在寻找一个带有mysqli的准备好的语句(重要,不是 PDO,因为我不能使用它并且不能将一些 PDO 代码传输到 mysqli。),我可以在其中插入 long查询有很多值(大约 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);

但是,当然,我不能绑定它。

4

2 回答 2

4

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

或者只是传递所有变量来执行,那么你甚至不需要使用bind_param

于 2013-02-26T16:21:07.587 回答
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 运算符。当我尝试插入多行时遇到问题 - 因为它没有以正确的顺序给出值 - 所以只需要创建一个包含所有行的数组。

于 2018-11-12T16:16:51.327 回答