【问题标题】:sql prepared statment don't work with WHERE <column> IN clause [duplicate]sql 准备好的语句不适用于 WHERE <column> IN 子句 [重复]
【发布时间】:2020-06-06 08:11:39
【问题描述】:

所以我有这个 sql preparted 语句:

SELECT carName, modelName 
FROM cars 
INNER JOIN model ON cars.idCar = model.idCar 
WHERE carName IN (?)`

$input = " 'toyota','honda' "

我正在尝试将其放入 sql 语句中,但它给出了零行。我已经在 phpMyAdmin 中尝试过查询,并且一切正常。有谁知道这个问题吗?

【问题讨论】:

  • 如果您没有获得用户输入,为什么要使用准备好的语句?
  • 小心@FunkFortyNiner ...这里的一些常客认为您应该对所有事情使用准备好的语句。即使在 sql 中根本没有任何输入!大声笑
  • 我得到了用户输入,这只是一个例子
  • @IncredibleHat 叹息,我知道。
  • @Hansen 好吧,你在下面有几个答案,试一试。

标签: php mysql sql prepared-statement


【解决方案1】:

IN 列表中的每个值都需要一个参数。如果你传递一个参数,它会被解释为一个包含逗号的唯一字符串,这不是你想要的(你最终没有匹配,因为表中没有一个名称与这个值匹配)。

所以对于两个参数:

SELECT carName, modelName 
FROM cars 
INNER JOIN model ON cars.idCar = model.idCar WHERE carName IN (?, ?);

【讨论】:

    【解决方案2】:

    IN 子句接受多个参数,每个参数只能接受一个值。因此,要自动化在此语句中插入多个参数的过程,您可以使用如下内容:

    /* Execute a prepared statement using an array of values for an IN clause */
    $params = ['toyota', 'honda'];
    /* Create a string for the parameter placeholders filled to the number of params */
    $place_holders = implode(',', array_fill(0, count($params), '?'));
    
    /*
        This prepares the statement with enough unnamed placeholders for every value
        in our $params array. The values of the $params array are then bound to the
        placeholders in the prepared statement when the statement is executed.
        This is not the same thing as using PDOStatement::bindParam() since this
        requires a reference to the variable. PDOStatement::execute() only binds
        by value instead.
    */
    $st = $db->prepare("SELECT carName, modelName FROM cars WHERE carName IN ($place_holders)");
    $st->execute($params);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-16
      • 1970-01-01
      • 2017-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-20
      相关资源
      最近更新 更多