我有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
子句一起使用?
答案 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';
你可以测试它。