gpt4 book ai didi

PHP PDO MySQL count() 预处理语句

转载 作者:太空宇宙 更新时间:2023-11-03 10:41:43 27 4
gpt4 key购买 nike

我正在学习网络开发类(class)。他们在研讨会上教我们使用 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 注入(inject)的验证,所以我向培训师提出了这个建议(我知道 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()
  • 你应该使用合适的抓取模式

关于PHP PDO MySQL count() 预处理语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37224241/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com