[英]PHP PDO MySQL count() prepared statement
我正在上Web開發課程。 他們與PHP PDO MySQL一起在一個研討會上教我們做到這一點:
function countUsers($search) {
$and = '';
if ($search != '') {
$and = " AND user_name LIKE '%".$search."%'";
}
$total = $this->db->query("SELECT COUNT(id) as rows FROM users WHERE valid = 1" . $and)->fetch(PDO::FETCH_OBJ);
return $total->rows;
}
從我的角度來看,這是完全錯誤的,該語句沒有准備好,而是直接從用戶輸入傳遞的,沒有進行任何可能導致SQL注入的驗證,因此我向培訓師提出了這一建議(我知道fetchColumn()在這里會更合適但為了示例起見,我們堅持這樣做:
function countUsers($search) {
$and = '';
$sqlSearch = "%$search%";
if ($search != '') {
$and = " AND user_name LIKE :username";
}
$sql = "SELECT COUNT(id) as rows FROM users WHERE valid = 1" . $and;
$sth = $this->db->prepare($sql);
if ($search != '') {
$sth->bindParam(':username', $sqlSearch, PDO::PARAM_STR);
}
$sth->execute();
$total = $sth->fetch(PDO::FETCH_OBJ);
return $total->rows;
}
我錯了嗎? 他們錯了嗎?還是我們都錯了?
是的,你是對的。
但是,您的代碼不是最佳的。 實際上,准備好的語句旨在使您的代碼更干凈 ,而不是更膨脹。
function countUsers($search) {
$sql = "SELECT COUNT(id) FROM users WHERE valid = 1 AND user_name LIKE ?";
$sth = $this->db->prepare($sql);
$sth->execute(["%$search%"]);
return $sth->fetchColumn();
}
我所做的部分清理只是一個技巧-因為您始終可以搜索LIKE '%%'
並匹配所有行(但user_name為null的行除外)。
但是其余只是對PDO功能的正確使用:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.