我有一个从反馈表格表中选择记录列表的功能。目前查询基于两者课程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
无效,因为绑定参数的数量不匹配。
最好的解决方法是什么?
答案 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);
}