有人告诉我rowCount不安全所以我想在这里问一下,我有2个例子,想知道检查某些东西是否存在最安全和最好的方法是什么?
$sql = "SELECT count(*) FROM users WHERE username = 'administrator'";
$result = $db->prepare($sql);
$result->execute();
echo $result->fetchColumn() ? 'true' : 'false';
或
$sql = "SELECT username FROM users WHERE username = ?";
$result = $db->prepare($sql);
$result->execute(array('administrator'));
echo $result->rowCount() ? 'true' : 'false';
答案 0 :(得分:3)
使用prepare
和fetchColumn
SELECT COUNT(*)语句,其谓词与您的预期相同 SELECT语句,然后使用PDOStatement::fetchColumn()来检索 将返回的行数。
$sql = "SELECT COUNT(*) FROM users WHERE username = ?";// use `COUNT(*)`
$result = $db->prepare($sql);
$result->execute(array('administrator'));
echo $result->fetchColumn() ? 'true' : 'false';
答案 1 :(得分:0)
SELECT 1 FROM users WHERE username = 'administrator' LIMIT 1
答案 2 :(得分:0)
使用rowCount()并不安全,但只是不正确。
使用数据库时的#1规则是
尽可能减少后期处理。
因此,如果您需要检查存在的数据,那么要求您的数据库检查,然后获取结果。
但是,您必须记住,有两种可能的情况:
如果你确实需要检查数据库中存在的东西,但不需要数据,那么(假设用户名上有唯一的索引):
$sql = "SELECT 1 FROM users WHERE username = ?";
$result = $db->prepare($sql);
$result->execute(array('administrator'));
echo $result->fetchColumn() ? 'true' : 'false';
但是,如果碰巧找到数据,通常需要数据本身。在这种情况下,您只需选择该数据:
$sql = "SELECT * FROM users WHERE username = ?";
$result = $db->prepare($sql);
$result->execute(array('administrator'));
$user = $result->fetch();
echo $user ? 'true' : 'false';
我正在强调它,因为另一个答案的措辞表明你必须运行2个查询:一个检查存在,一个查询数据,这是无意义的。
截至rowCount()
方法 - you need it too seldom to talk about。