从数组构建预准备语句并传递变量来执行

时间:2012-09-04 10:57:44

标签: php prepared-statement

如何在循环中传递变量来执行??? 这里有一个答案的例子......

$placeholders = array_fill(0, count($array), '?');

$keys = $values = array();
foreach($array as $k => $v) {
    $keys[] = $k;
    $values[] = !empty($v) ? $v : null;
}

$stmt = $mysqli->stmt_init();
$query = 'INSERT INTO `'.DB_TABLE_PAGES.'` '.
         '('.implode(',', $keys).') VALUES '.
         '('.implode(',', $placeholders).')';
$stmt->prepare($query);

call_user_func_array(
    array($stmt, 'bind_param'), 
    array_merge(
        array(str_repeat('s', count($values))),
        $values
    )
);

$stmt->execute();

但是多个数组怎么样?我想添加db 10000值,但不是每次传递都构建和绑定语句.. 可能吗 ? 所以我想从数组构建语句,绑定params(我不知道如何)。比在循环传递变量(由键标识)并执行...

如果我不为每个表写一个语句(只是创建列名和变量数组),那就是普遍的东西

1 个答案:

答案 0 :(得分:0)

当使用预处理语句和mysqli时,您需要做的就是更改存储在绑定参数中的值并再次运行execute。这是绑定参数的点,允许多次执行语句而不需要重新发送查询的开销(本质上也是一个很好的安全性,但这不是重点。)

以例如:

$param1 = '';
$param2 = '';
$param3 = '';
$param4 = '';
$query = 'INSERT INTO table VALUES (?, ?, ?, ?)';
$format = 'ssss';
$params = array(&$param1, &$param2, &$param3, &$param4);
$stmt = $mysqli->stmt_init();
$stmt->prepare($query);
$params = array_merge(array($format), $params); #set up format and parameters for binding
call_user_func_array(array($stmt, 'bind_param'), $params); #parameters specified so bind them


foreach($data as $data_point){
    $param1 = $data_point[0];
    $param2 = $data_point[1];
    $param3 = $data_point[2];
    $param4 = $data_point[3];
    $stmt->execute();
}

这将准备你的语句,然后遍历存储在$ data中的数据,获取每个值,将其放入准备好的参数中,然后使用新参数执行语句。

此特定代码的里程会有所不同,因为它不会对sql错误语句进行任何检查,而且对于许多应用程序,在一个插入中执行多行可能效率更高。