2016-06-22 168 views
2

有人告訴我rowCount不安全,所以我喜歡在這裏問它,我有2個例子,並且想知道什麼是最安全最好的方法來檢查是否存在?什麼是檢查PDO是否存在的最佳方法

$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'; 
+1

如果你看看手冊,有關'rowcount'函數的註釋關於這個確切的問題。對於大多數數據庫,PDOStatement :: rowCount()不會返回受SELECT語句影響的行數。相反,使用PDO :: query()發出一個SELECT COUNT(*)語句,其謂詞與您想要的SELECT語句相同,然後使用PDOStatement :: fetchColumn()來檢索將返回的行數。然後,您的應用程序可以執行正確的操作。#http://php.net/manual/en/pdostatement.rowcount.php(示例#2) – chris85

+0

@kamalpal獲取行數並檢查是否存在是兩個不同的任務。 –

+0

@YourCommonSense表示同意,但方法相同。 –

回答

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'; 
0
SELECT 1 FROM users WHERE username = 'administrator' LIMIT 1 
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'; 
    

我就可以講,因爲對方的回答的措辭暗示,你要運行2個查詢:一個要檢查的存在和一個得到這些數據,這是無稽之談。

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

+0

謝謝,也爲鏈接,它幫助我很多:) – Theo

相關問題