2017-06-28 105 views
2

我希望我的下面的PDO選擇與底部的兩個IF語句一起工作?
第一次如果我只是想確保沒有錯誤。
第二個IF我想檢查它返回的行數。我知道這number of rows == 0將無法​​正常工作。
有沒有辦法做到這一點?PHP:如何讓我的IF語句與PDO select一起使用?

try { 
    $conn = new PDO('mysql:host=localhost;dbname=zs', 'zs', 'rlkj08sfSsdf'); 
    $conn ->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
} catch(PDOException $e) { 
    echo $e->getMessage(); 
    die(); 
} 

$stmt = $conn->prepare("SELECT * FROM zip WHERE zip_code =:zip1"); 
$stmt->bindValue(':zip1', $_POST[zipcode], PDO::PARAM_INT); 
$stmt->execute(); 
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC); 


if($rows = "") { 
    echo "<p><strong>There was a database error attempting to retrieve your ZIP Code.</strong></p>\n"; 
} 
if(number of rows == 0) { 
    echo "<p><strong>No database match for provided ZIP Code.</strong> Please enter a new ZIP Code.</p>\n"; 
} 
+2

'if($ rows =「」){'這是一項任務,而不是比較。 –

+2

'fetchAll()'返回一個數組。你可以使用'empty()'或'count()'來測試它是否有任何東西。 –

+0

不要考慮郵編'int's,你會遇到前導零的問題。 https://stackoverflow.com/questions/893454/is-it-a-good-idea-to-use-an-integer-column-for-storing-us-zip-codes-in-a-databas – chris85

回答

1

您只關心是否有包含特定值的記錄。選擇所有內容並計算PHP中的記錄是沒有意義的。這是浪費資源。想象一下,如果有一百萬條記錄會發生什麼。

您要解決的問題是簡單地詢問數據庫有關包含特定值的行的COUNT。您的代碼應該是很簡單的:

$stmt = $conn->prepare("SELECT COUNT(*) AS num_rows FROM zip WHERE zip_code = :zip"); 
$stmt->bindValue(':zip', $_POST['zipcode'], PDO::PARAM_INT); 

$stmt->execute(); 

$count = (int)$stmt->fetchColumn(); 

if($count) 
{ 
    echo "Success"; 
} 
else 
{ 
    echo "Bummer"; 
} 

注:

  • 如果成功的話,上面的查詢將始終返回1行1列,命名爲num_rows這將是0因爲沒有符合條件的記錄或整數如果有記錄,則大於0。如果你在PHP中使用MySQL本地驅動程序,PHP將在內部正確地將此值表示爲整數。如果你有MySQL ND,我特意將類型轉換爲,你可以刪除它((int)部分)。
  • 如果查詢執行過程中出現問題,將引發異常。該片段不包括這一點。您在異常模式下正確設置了PDO,並且使用bindValue而不是bindParam,這意味着您的研究是正確的,並且您正確使用了PDO,這意味着在這種情況下應該輕鬆地執行錯誤處理。
+0

這工作,謝謝。 – aaandy