MySQLi绑定Param与IN的数组

时间:2011-05-19 02:48:01

标签: php arrays mysqli

我正在尝试将数组作为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);

我无法让它为我的生活而工作。有什么想法吗?上面的代码只是一个示例。

2 个答案:

答案 0 :(得分:2)

了解一些信息(另见:https://stackoverflow.com/a/13253440/165330)。

可以不应该

一种方法是使用动态变量来提供自动引用变量,并使用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 );

答案 1 :(得分:1)

这种情况下这样做是不合适的。您正在构建实际的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 . ')');