【问题标题】:PDO in PHP, how to improve this PDO mysql codePHP中的PDO,如何改进这个PDO mysql代码
【发布时间】:2009-10-15 16:48:22
【问题描述】:

感谢您的检查。所有有用的答案/cmets 都投了赞成票。 我有以下代码,可以完成这项工作,但 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 ABLOCK BBLOCK C,因为我当前的逻辑需要它。

【问题讨论】:

    标签: php mysql refactoring pdo


    【解决方案1】:
    $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
    }
    

    【讨论】:

      【解决方案2】:

      我会用以下方式重写它:

      $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 块在 main 函数中。代码顶层的某处:

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

      【讨论】:

        【解决方案3】:

        如果您希望处理不超过一行,您可以使用fetch 而不是fetchAll

        【讨论】:

          【解决方案4】:

          试试:

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

          这将只获取第一行。

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

          【讨论】:

            【解决方案5】:

            您只需为您的语句使用原生 SQL 并准备它:

            SELECT * FROM someTable WHERE specificVal = ?
            

            如果您这样做了,您可以使用->fetch 代替->fetchAll,也可以使用->bindParam。 而->prepare 可以轻松处理任何$myVal,因为您可以根据需要随时运行该语句。 你只需要通过使用另一个参数来尝试?

            例子:

            $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
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-02-18
              • 1970-01-01
              • 1970-01-01
              • 2015-12-25
              • 2011-08-18
              • 1970-01-01
              相关资源
              最近更新 更多