簡體   English   中英

PHP PDO MySQL count()預備語句

[英]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功能的正確使用:

  • 您可以隨時使用位置占位符
  • 您總是可以避免bindParam()調用
  • 您應該使用適當的提取模式

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM