【问题标题】:Dynamic PDO parameter binding issue with WHERE clauseWHERE 子句的动态 PDO 参数绑定问题
【发布时间】:2014-08-24 19:50:26
【问题描述】:

我有一个搜索表单,用户可以在其中输入一些信息来搜索数据库中的记录。由于某些字段可以留空,我正在动态创建查询的 WHERE 子句以及动态绑定 PDO 参数。如果用户只在搜索表单中填写 1 个字段,但如果使用超过 1 个字段,则一切正常,则返回一个空数组。这是我的代码。

if(count($_POST)>0)
{   
    //Remove any key that has no value  
    $data = array_filter($_POST);

    //Define array to hold the pieces of the where clause
    $where = array();

    //loop each of the variable to build the query
    foreach($data as $key=>$value)
    {
        $key = mysql_real_escape_string($key);

        //Push values to array
        array_push($where, "$key=:$key");
    }

    //Create the select query
        $query = "SELECT application_ID, 
                     student_last_name, 
                     student_first_name,
                     s.school_name,
                     DATE_FORMAT(submission_datetime, '%m/%d/%Y %h:%i:%s %p') AS  submission_datetime, 
                     aps.name  
                     FROM application a
                     LEFT JOIN application_status aps ON(aps.status_ID = a.application_status_ID)
                     LEFT JOIN schools s ON(s.school_ID = a.school_choice)";
    //As long as criteria was selected in the search form then add the where clause to the query with user's search criteria
    if(!empty($where))
    {       
        $query .= "WHERE ".implode(" AND ", $where);
    }

    //Add ORDER BY clause to the query
    $query .= " ORDER BY application_ID";

    $stmt = $conn->prepare($query);
    //loop each of the variables to bind parameters
    foreach($data as $key=>$value)
        {
            $value = mysql_real_escape_string($value);
            $stmt->bindparam(':'.$key, $value);
        }
    $stmt->execute();
    $result = $stmt->fetchall(PDO::FETCH_ASSOC);


}

当我回显查询时,一切看起来都很好,甚至在从 PHPMyAdmin 运行时返回结果。这是查询。

SELECT application_ID, 
       student_last_name, 
       student_first_name, 
       s.school_name, 
       DATE_FORMAT(submission_datetime, '%m/%d/%Y %h:%i:%s %p') AS submission_datetime,
       aps.name 
       FROM application a 
       LEFT JOIN application_status aps ON(aps.status_ID = a.application_status_ID)
       LEFT JOIN schools s ON(s.school_ID = a.school_choice)
       WHERE school_choice=:school_choice AND status_ID=:status_ID 
       ORDER BY application_ID ASC

当我 print_r 我得到一个空数组。 感谢您提供的任何帮助。

【问题讨论】:

    标签: php mysql pdo


    【解决方案1】:

    当您遍历数组以将值绑定到 PDO 语句时,您应该使用 bindValue 而不是 bindParam。

    当您说$stmt->bindparam(':'.$key, $value) 时,查询将使用变量$value 的值,就像查询执行时一样。 $value 的值将是数组的最后一个元素。

    http://php.net/manual/en/pdostatement.bindvalue.php

    我希望这会有所帮助。

    【讨论】:

      【解决方案2】:

      您不应该在准备好的语句中使用mysql_real_escape_string()。事实上,如果你没有初始化mysql_connect(),这个函数将不起作用。

      这一定是一切都失败的原因,您对mysql_real_escape_string() 的调用都返回FALSE

      另外,是什么让您认为来自$_POST 的数组键可以安全地用于您的 SQL 查询?您在这里冒着 SQL 注入的严重风险,千万不要这样做。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-02-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-23
        相关资源
        最近更新 更多