2011-10-03 39 views
3

我有以下代碼:檢查時PDO取select語句返回null

$check = $dbh->prepare("SELECT * FROM BetaTesterList WHERE EMAIL = ?"); 
       $check->execute(array($email)); 
       $res = $check->fetchAll(); 

       if (!($res['EMAIL'])){ 
         $stmt = $dbh->prepare("INSERT INTO BetaTesterList(EMAIL) VALUES (?)"); 
         $stmt->execute(array($email)); 
       } else { 
         $return['message'] = 'exists'; 
       } 

然而,這仍然插入值雖然記錄在數據庫中已經存在。我如何防止這種情況?

回答

2

夫婦的東西在這裏...

  1. PDOStatement::fetchAll()返回數組的數組。要檢查記錄,嘗試E_NOTICE錯誤

    if (count($res) == 0) { 
        // no records found 
    } 
    
  2. 轉向。你應該知道$res['EMAIL']是一個未定義的索引。在你的腳本的頂部...

    ini_set('display_errors', 'On'); 
    error_reporting(E_ALL); 
    
  3. 我建議您EMAIL柱營造出獨特的約束。這樣,您將無法插入重複記錄。如果一個嘗試,PDO就會引發錯誤或拋出一個異常,這取決於你如何配置PDO::ATTR_ERRMODE屬性(見http://php.net/manual/en/pdo.setattribute.php

    如果你不傾向於這樣做,可以考慮使用此查詢,而不是...

    $check = $dbh->prepare("SELECT COUNT(1) FROM BetaTesterList WHERE EMAIL = ?"); 
    $check->execute(array($email)); 
    $count = $check->fetchColumn(); 
    
    if ($count == 0) { 
        // no records found 
    } else { 
        // record exists 
    } 
    
0

$資源應該是這個樣子:

array (
    [0] => array (
     [column1] => value, 
     [email] => value 
    ), 
    [1] => array (
     [column1] => value, 
     [email] => value 
    ), 
    [2] => array (
     [column1] => value, 
     [email] => value 
    ) 
) 

因此,if(!($res['email'))將始終評估爲true,因爲$res['email']是未定義的(空,我想),它被否定。所以,否定=否定=真:)。