[英]PDO in PHP, how to improve this PDO mysql code
謝謝你檢查。 所有有用的答案/評論都已經過投票。 我有以下代碼,它完成了這項工作,但是imo效率不高。 我認為它不高效的原因是因為我使用fetchAll +循環, 即使我知道查詢將返回1或沒有記錄。
//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 A
BLOCK B
BLOCK C
因為我當前的邏輯需要它。
$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
}
我將按以下方式重寫它:
$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
}
}
此外,我將啟用PDO
為所有錯誤拋出異常:
$pdo->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
所以我不需要為每個PDO
結果檢查錯誤。 只需在main函數中try/catch
塊。 位於代碼頂層的某個地方:
try {
// main script logic
}
catch (PDOException $e) {
// sql error appeared somewhere, we should save it for futher investigation
}
如果您希望處理的行數不超過一行,則可以使用fetch
而不是fetchAll
。
您只需要為您的語句使用本機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
}
嘗試:
$stmt->fetch( PDO::FETCH_ASSOC );
這將只獲取第一行。
由於您確定它只返回1或0行,因此使用它可能是安全的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.