【问题标题】:Querying MySQL with IN clause using PHP [duplicate]使用 PHP 使用 IN 子句查询 MySQL
【发布时间】:2012-03-03 10:25:54
【问题描述】:

我想做一个类似下面的查询:

SELECT f_name, l_name, title from
-> employee_data where title 
-> IN ('Web Designer', 'System Administrator');

搜索词在数组$data = ['Web Designer', 'System Administrator'] 中接收,现在我可以使用以下方法将该数组转换为Web Designer,System Administrator

 $data = implode(',', $data)

有没有一种好方法可以将该数组转换为'Web Designer', 'System Administrator',以便我可以将这个短语直接插入到 MySQL 查询中,如帖子开头所示?

【问题讨论】:

标签: php mysql


【解决方案1】:

您可能应该使用:

$data = implode( ', ', array_map( $data, array( $object, 'escape')));
$query .= 'title IN ( ' . $data . ')'; // Append to condition

$object->escape() 的功能如下:

public function $escape( $string){
   return "'" . mysql_real_escape_string( $string, $this->connection) . "'";
}

这是array_map() 文档和mysql_real_escape_string()。这应该是SQL injection 证明解决方案。

【讨论】:

    【解决方案2】:

    试试这个

     $data = array('Web Designer', 'System Administrator');
     $query_include = "'".implode("','",$data)."'";
     $query ="SELECT f_name, l_name, title from
              employee_data where title 
               IN ($query_include);";
    

    正如 Vyktor 指出的那样,可能会发生 SQL 注入,我完全同意,因此在不更改上述代码的情况下,我将把这段代码添加到上面

     function clean(&$item) {
      $item = mysql_real_escape_string($item);
     }
    array_walk($data,"clean");
    

    【讨论】:

    • sql注入是如何诞生的,做点什么吧:)
    • 哦,是的,没错,忘记处理了。谢谢维克托。现在编辑我的答案。我这里有一篇文章处理这个问题。几乎符合jaspreetchahal.org/…
    • 是的,这样更好......这和我的方法非常相似。)
    • 是的,没错,但你是基于 OOP 和我的结构 :) 我们都应该得到另一个 +!估计呵呵。如果我将您的解决方案添加到我的博客文章中,您介意吗??
    • 给你 :D +1 但使用 mysql_real_escape_string() [php.net/manual/en/function.mysql-real-escape-string.php ],mysql_escape_string() 已弃用 [php.net/manual/en/function.mysql-escape-string.php]
    【解决方案3】:

    当然可以

    $data = "'"
            .implode("','", $data).
            "'";
    

    它有点不可读,但它正在工作。 还要确保$data 不是用户数据,如果是,请确保它已被清理。

    【讨论】:

      【解决方案4】:

      像这样修改查询:

      $query = 'SELECT f_name, l_name, title from
               -> employee_data where title 
               -> IN (\'' . implode('\', \'', $data) . '\')';
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-02
        • 1970-01-01
        • 2018-11-21
        • 2011-10-27
        • 2012-08-01
        • 2011-05-18
        相关资源
        最近更新 更多