使用参数化查询和IN子句 - CodeIgniter

时间:2015-02-17 12:14:04

标签: php mysql codeigniter

我有IN子句的查询,我想将它用作参数化查询。这是代码

$order_ids = array(1, 2, 3);
$q = " SELECT * FROM orders WHERE order_store_id IN(?)";
$order_items = $this->db->query($q, array(implode(", ", $order_ids))  );

但它仅使用ID 1加载订单。

但如果我写WHERE order_store_id IN(implode(", ", $order_ids)),它会完全加载所有订单。

我也试过

$order_ids = array(1, 2, 3);
$q = " SELECT * FROM orders WHERE order_store_id IN(?)";
$in_val = implode(", ", $order_ids);
$order_items = $this->db->query($q, array($in_val )  );

但它也只加载订单ID 1

那么如何将参数化查询与IN子句一起使用?

4 个答案:

答案 0 :(得分:0)

准备好的语句可以被认为是应用程序想要运行的SQL的一种编译模板,可以使用变量参数进行自定义。

$order_ids = array(1, 2, 3);
$stmt = $dbh->prepare("SELECT * FROM orders WHERE order_store_id IN(?)");
$stmt->execute($order_ids);

如果这无济于事,请参阅详情here

答案 1 :(得分:0)

查询函数会相应地处理传递给它的项目,在您的情况下,爆炸数组的结果是一个字符串,因此引用它,如SELECT * FROM orders WHERE order_store_id IN('1, 2, 3')。当发生这种情况时,MySQL会将报价之间的所有内容视为一个值,并将第一个数字(即1)视为丢弃。如果您真的想要使用CodeIgniter的查询绑定,请使用','作为内幕语句中的粘合剂,这样,数组中的所有项都会在查询SELECT * FROM orders WHERE order_store_id IN('1', '2', '3')或您中引用可以在不使用查询绑定的情况下将数组内爆到IN子句中,而不必担心引号。

答案 2 :(得分:0)

我使用FIND_IN_SET MySQL函数来解决这个问题。

例如:

$order_store_id_str = '1,2,3';

$query = "SELECT * FROM orders WHERE FIND_IN_SET(order_store_id, ?)";

$this->db->query(
    $query,
    array($order_store_id_str)
);

答案 3 :(得分:-1)

发现this为某人工作:

$array = array("first", "second", "third");
$list = "'". implode("', '", $array) ."'";
echo $list; // Outputs: 'first', 'second', 'third';

你可以测试它。