我正在開發Web課程。用PHP PDO MySQL的工作,他們教給我們上了一次研討會,做到這一點:PHP PDO MySQL count()準備語句
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;
}
難道我錯了嗎?他們是錯的還是我們都錯了?
你應該總是綁定不受信任的參數(這幾乎是所有的參數)。 – JimL
你是完全正確的。即使輸入是可信的,它仍然可以包含破壞sql的字符,所以您應該始終使用預準備語句並將值綁定到佔位符。 – jeroen
我在課堂上提出了這個問題,他們說我是對的,但這不是問題,因爲這只是一個工作示例,並不是課程的目的,有20個小時的網絡安全。我認爲他們是非常錯誤的,給學生完全錯誤和不安全的例子。如果不利用PDO的「準備語句」,他們更好地使用「mysql_ *」或「mysqli_ *」。 – bsteo