2009-10-15 110 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