作者:eechen
链接:https://www.zhihu.com/question/20076383/answer/149180990
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
<?php
//id IN ($ids) 占位符生成
function app_place_holders(array $params) {
//http://php.net/manual/zh/pdostatement.execute.php
return implode(',', array_fill(0, count($params), '?'));
}
// var_export(app_in_pdo(array(1, 3, 5)));
function app_in_pdo(array $ids) {
global $app;
$db = app_db();
$table = $app['db_prefix'].'post';
$place_holders = app_place_holders($ids);
$sql = "SELECT * FROM `{$table}` WHERE `id` IN ({$place_holders})";
$stmt = $db->prepare($sql);
$stmt->execute($ids); //所有id都当做字符串处理,值传递.
return $stmt->fetchAll(PDO::FETCH_ASSOC);
}
// var_export(app_in_mysqli(array(1, 3, 5))); 要求使用PHP内置的mysqlnd驱动
function app_in_mysqli(array $ids) {
global $app;
$db = app_mysql();
$table = $app['db_prefix'].'post';
$place_holders = app_place_holders($ids);
$sql = "SELECT * FROM `{$table}` WHERE `id` IN ({$place_holders})";
$stmt = $db->prepare($sql);
//MySQLi自动化"引用绑定"参数(因为mysqli的execute不像pdo的execute支持参数数组传递,所以显得麻烦些)
$params = array_merge(array(str_repeat('s', count($ids))), $ids); //array('sss', 1, 3, 5)
foreach($params as $k => $v) { $params[$k] = &$params[$k]; } //因为bind_param要求传递引用.
call_user_func_array(array($stmt, 'bind_param'), $params); //相当于$stmt->bind_param('sss', $ids[0], $ids[1], $ids[2]);
$stmt->execute();
return $stmt->get_result()->fetch_all(MYSQLI_ASSOC);
}
估计后面的开发要用到,或者要用类似的思想,所以先记录一下。
原文地址:
https://www.zhihu.com/question/20076383