PDO具有可选的绑定参数,无需重写SQL查询字符串

时间:2016-12-02 09:55:46

标签: php mysql pdo

我有一个从反馈表格表中选择记录列表的功能。目前查询基于两者课程ID和用户ID:

$sql = "SELECT * FROM `feedback` WHERE course_id = :course_id AND user_id = :user_id LIMIT 1";
$stmt = $this->ci->db->prepare($sql);
$result = $stmt->execute([
    "course_id" => $course_id,
    "user_id" => $user_id
        ]);
$results = $stmt->fetch(PDO::FETCH_ASSOC);

我想这样做,所以用户ID是可选的,但不确定如何最有效地编写?

例如,我可以这样做:

if ($user_id) {
    $sql = "SELECT * FROM `feedback` WHERE course_id = :course_id AND user_id = :user_id LIMIT 1";
    $stmt = $this->ci->db->prepare($sql);
    $result = $stmt->execute([
         "course_id" => $course_id,
         "user_id" => $user_id
    ]);

 } else {

    $sql = "SELECT * FROM `feedback` WHERE course_id = :course_id LIMIT 1";
    $stmt = $this->ci->db->prepare($sql);
    $result = $stmt->execute([
         "course_id" => $course_id,
    ]);

}

$results = $stmt->fetch(PDO::FETCH_ASSOC);

但这似乎效率很低。麻烦的是,如果我省略"user_id" => $user_id(在第一个代码块中),那么我的$sql无效,因为绑定参数的数量不匹配。

最好的解决方法是什么?

1 个答案:

答案 0 :(得分:1)

由于您正在使用$ this,我认为您在一个类中,所以我创建了一个函数来包装该过程。 当一些参数是可选的时候,我常常使用PHP字符串连接来构造我的请求。 由于您可以动态添加条目到PDOStatment使用的参数数组,您可以这样做:

public function getRecords($course_id, $user_id = null) {

    // Init request string
    $request = "SELECT * 
                FROM `feedback` 
                WHERE course_id=:course_id";

    // Init $params array
    $params = array(
        ':course_id'    =>  $course_id
    );

    // If user_id is passed to the function
    // update request string & $params array
    if(null !== $user_id) {
        $request .= " AND user_id=:user_id";
        $params[':user_id'] = $user_id;
    }

    // Finish request
    $request .= " LIMIT 1";

    $stmt = $this->ci->cb->prepare($request);
    $stmt->execute($params);
    $results = $stmt->fetch(PDO::FETCH_ASSOC);
}