检查PDO是否存在某些内容的最佳方法是什么?

时间:2016-06-22 04:49:00

标签: php mysql pdo

有人告诉我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';

3 个答案:

答案 0 :(得分:3)

使用preparefetchColumn

进行检查的最佳方法
  

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规则是

始终选择您需要的确切数据。

尽可能减少后期处理。

因此,如果您需要检查存在的数据,那么要求您的数据库检查,然后获取结果。

但是,您必须记住,有两种可能的情况:

  1. 如果你确实需要检查数据库中存在的东西,但不需要数据,那么(假设用户名上有唯一的索引):

    $sql = "SELECT 1 FROM users WHERE username = ?";
    $result = $db->prepare($sql);
    $result->execute(array('administrator'));
    echo $result->fetchColumn() ? 'true' : 'false';
    
  2. 但是,如果碰巧找到数据,通常需要数据本身。在这种情况下,您只需选择该数据

    $sql = "SELECT * FROM users WHERE username = ?";
    $result = $db->prepare($sql);
    $result->execute(array('administrator'));
    $user = $result->fetch();
    echo $user ? 'true' : 'false';
    
  3. 我正在强调它,因为另一个答案的措辞表明你必须运行2个查询:一个检查存在,一个查询数据,这是无意义的。

    截至rowCount()方法 - you need it too seldom to talk about