2009-10-15 83 views
3

感謝您的檢查。所有有用的答案/評論都已投票。 我有以下代碼,它可以完成這項工作,但是imo效率不高。我認爲效率不高的原因是因爲我使用fetchAll +循環,即使我知道查詢將返回1或沒有記錄。PDO在PHP中如何改進這個PDO mysql代碼

//assume the usual new PDO, binding, and execute are up here 

$myval = "somevalue"; 

$res = $stmt->fetchAll(PDO::FETCH_ASSOC); 

if (!$res) { 
    //no record matches 
    //BLOCK A CODE HERE 
} else { 
    //found matching record (but always going to be 1 record, no more) 
    foreach($res as $row) { 
     if ($myval == $row['val']){ 
      //myval is the same as db 
      //BLOCK B CODE HERE 
     } else { 
      //myval is different from db 
      //BLOCK C CODE HERE 
     } 
    }//foreach 
} 

如何提高其去除的foreach和使用fetchall的笨重的外觀(考慮我知道它總是會只有1點或0的記錄)?但我仍然需要類似的檢查點,所以我可以執行相同的BLOCK ABLOCK BBLOCK C,因爲我目前的邏輯需要它。

回答

6
$myval = "somevalue"; 

$row = $stmt->fetch(PDO::FETCH_ASSOC); 

if (!$row) { 
    //no record matches 
    //BLOCK A CODE HERE 
} else if ($myval == $row['val']) { 
    //myval is the same as db 
    //BLOCK B CODE HERE 
} else { 
    //myval is different from db 
    //BLOCK C CODE HERE 
} 
1

如果您希望處理不超過一行,則可以使用fetch而不是fetchAll

1

你只需要使用本地SQL的發言和你做準備:

SELECT * FROM someTable WHERE specificVal = ? 

如果你這樣做,你可以使用->fetch代替->fetchAll,還可以使用->bindParam。 和->prepare可以很容易地處理任何$myVa l,因爲您可以根據需要經常運行該語句。 你只需要使用另一個參數?

例子:

$stmt->prepare($yourQuery); 
$stmt->bindParam($one,$two); 

if($stmt->fetch(PDO::FETCH_ASSOC)) 
{ 
// here you can access $two (the result) 
} 
elseif(empty($two) || !checkForOtherComparisons($two)) 
{ 
// here you go if $two is not available or does not match to any other logic 
} 
1

嘗試:

$stmt->fetch(PDO::FETCH_ASSOC); 

這將只取第一行。

既然你知道它肯定會返回1或0行,它可能會安全地使用它。

3

我將它改寫在下列方式:

$res = $stmt->fetchAll(PDO::FETCH_ASSOC); 
$first_row = (count($res) ? $res[0] : null); 
if (is_null($first_row)) { 
    // nothing found code 
} 
else { 
    // we found something 
    if ($myval == $first_row['val']) { 
     // result is good 
    } 
    else { 
     // result is bad 
    } 
} 

而且我會enable PDO拋出異常的所有錯誤:

$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

所以我不需要檢查錯誤的每個PDO的結果。主功能中只有try/catch塊。頂級代碼:

try { 
    // main script logic 
} 
catch (PDOException $e) { 
    // sql error appeared somewhere, we should save it for futher investigation 
} 
+0

+1使用異常! – ChrisR 2009-10-15 17:56:39

+0

是的,+1。 – Chris 2009-10-15 20:44:51