作者: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
------------正 文 已 结 束, 感 谢 您 的 阅 读 (折雨的天空)--------------------
转载请注明本文标题和链接:《记录点防SQL注入有用的代码,后面要用》
发表评论