PHP中的PDO,如何改进这个PDO mysql代码

时间:2009-10-15 16:48:23

标签: php mysql refactoring pdo

感谢您的检查。所有有用的答案/评论都已经过投票。 我有以下代码,它完成了这项工作,但是imo效率不高。我认为它效率不高的原因是因为我使用fetchAll + loop ,即使我知道查询将返回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,因为我当前的逻辑需要它。

5 个答案:

答案 0 :(得分: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 :(得分: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
}

答案 2 :(得分:1)

如果您希望处理的行不超过一行,则可以使用fetch代替fetchAll

答案 3 :(得分: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
}

答案 4 :(得分:1)

尝试:

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

这将只获取第一行。

由于您确定它只返回1行或0行,因此使用它可能是安全的。