MySQLi Bind Param 与 IN 的数组 [重复]
Posted
技术标签:
【中文标题】MySQLi Bind Param 与 IN 的数组 [重复]【英文标题】:MySQLi Bind Param with an array for IN [duplicate] 【发布时间】:2011-08-28 12:52:07 【问题描述】:我正在尝试将数组作为 IN 变量传递给 $stmt->bind_param
。我该怎么做?
$values = array('a','b','c','d');
$values = '"' . implode('","', $values) . '"';
$stmt->prepare('SELECT value1, value2 FROM table1 WHERE value3 IN (?)');
$stmt->bind_param('s', $values);
我无法让它为我的生活工作。有什么想法吗?上面的代码只是一个示例。
【问题讨论】:
可以单独绑定吗? 我认为这是你内爆的方式。 mysql 不喜欢"
(双引号)。你试过用单引号吗?
@jason 我用单引号试过了,但是不行。
【参考方案1】:
它可以但不应该这样做,因为它是难以维护(阅读、理解、调试、更改)的代码。
一种方法是使用动态变量来提供可自动引用的变量,并使用 call_user_func_array 为回调/方法 $stmt->bind_param()
提供动态数量的参数。
<?php
$values = array('a','b','c','d');
$s = substr( str_repeat( ' , ?' , count( $values ) ) , 2 );
$stmt->prepare('SELECT value1, value2 FROM table1 WHERE value3 IN (' . $s . ')');
# OR array_map in case of different datatypes
$typeDefintions = str_repeat( 's' , count( $values ) );
$params = array( $typeDefinitions );
foreach ( $values as $k => $v )
$ 'varvar' . $k = $v;
$params[] = &$ 'varvar' . $k ;# provide references
call_user_func_array( array( $stmt , 'bind_param' ) , $params );
【讨论】:
【参考方案2】:在这种情况下这样做是不合适的。您正在构建实际的 SQL(这就是逗号和引号的含义),并将其作为参数传递。它基本上评估为value3 IN ('...')
,其中...
是$values
的全部。
这也是一个很好的关于报价的电话。 MySQL 使用单引号。
您需要单独使用字符串连接来构建 SQL,或者使用多个参数。
编辑
举个例子:
$values = array('a','b','c','d');
$values = "'" . implode("','", $values) . "'";
$stmt->prepare('SELECT value1, value2 FROM table1 WHERE value3 IN (' . $values . ')');
【讨论】:
能否提供一些代码示例或链接,以便我了解更多信息? 谢谢,我需要担心这种方法的SQL注入吗?我实际工作中的$values
是用户生成的。
@ATLChris,在这种情况下,是的。在将其直接插入查询之前,您应该自己使用 mysqli->real_escape_string()
预先转义这些值。
请删除此答案。它仍然包含一个 SQL 注入,这只是在 cmets 中提到的。这太危险了,差不多9年了。
@RolandIllig 如果没有数据来自用户,则不是“注入”。如果编码器信任输入,则此解决方案可以正常工作。如果没有,您上面的 cmets 已经解决了正确的处理问题。请停止关注拖钓。以上是关于MySQLi Bind Param 与 IN 的数组 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
mysqli_stmt_bind_param():变量的数量与绑定参数中准备好的语句中的参数数量不匹配
mysqli_stmt::bind_param():类型定义字符串中的元素数与绑定变量数不匹配
php,mysqli-stmt.bind-param]:类型定义字符串中的元素数与绑定变量数不匹配
如何将mysqli :: bind_param与数组一起用作第二个参数
call_user_func_array() - 警告:mysqli_stmt::bind_param():变量数与准备语句中的参数数不匹配