【问题标题】:How do I loop through a MySQL query via PDO in PHP?如何在 PHP 中通过 PDO 循环遍历 MySQL 查询?
【发布时间】:2021-05-12 18:52:27
【问题描述】:

我正在慢慢地将我所有的 LAMP websitesmysql_ 函数移动到 PDO 函数,并且我已经碰到了我的第一堵砖墙。我不知道如何使用参数循环遍历结果。我对以下内容很好:

foreach ($database->query("SELECT * FROM widgets") as $results)
{
   echo $results["widget_name"];
}

但是,如果我想做这样的事情:

foreach ($database->query("SELECT * FROM widgets WHERE something='something else'") as $results)
{
   echo $results["widget_name"];
}

显然,“其他东西”将是动态的。

【问题讨论】:

    标签: php mysql pdo


    【解决方案1】:

    这是一个使用 PDO 连接到数据库的示例,告诉它抛出异常而不是 php 错误(将有助于您的调试),并使用参数化语句而不是自己将动态值替换到查询中(强烈推荐):

    // connect to PDO
    $pdo = new PDO("mysql:host=localhost;dbname=test", "user", "password");
    
    // the following tells PDO we want it to throw Exceptions for every error.
    // this is far more useful than the default mode of throwing php errors
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    
    // prepare the statement. the placeholders allow PDO to handle substituting
    // the values, which also prevents SQL injection
    $stmt = $pdo->prepare("SELECT * FROM product WHERE productTypeId=:productTypeId AND brand=:brand");
    
    // bind the parameters
    $stmt->bindValue(":productTypeId", 6);
    $stmt->bindValue(":brand", "Slurm");
    
    // initialise an array for the results
    $products = array();
    $stmt->execute();
    while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
        $products[] = $row;
    }
    

    【讨论】:

      【解决方案2】:

      根据PHP documentation 是说你应该能够做到以下几点:

      $sql = "SELECT * FROM widgets WHERE something='something else'";
      foreach ($database->query($sql) as $row) {
         echo $row["widget_name"];
      }
      

      【讨论】:

      • 这并没有处理转义可能是动态的“其他东西”。 Shabbyrobe 所示的准备好的查询就是答案。
      • @DGB,来自原始问题示例的 Darryl 的“其他内容”。该问题与动态组装查询无关,它与迭代查询结果有关。他回答正确。虽然我同意 Shabbyrobe 给出了一个更好的答案。
      • “显然,‘其他东西’将是动态的。”
      【解决方案3】:

      如果你喜欢 foreach 语法,可以使用以下类:

      // Wrap a PDOStatement to iterate through all result rows. Uses a 
      // local cache to allow rewinding.
      class PDOStatementIterator implements Iterator
      {
          public
              $stmt,
              $cache,
              $next;
      
          public function __construct($stmt)
          {
              $this->cache = array();
              $this->stmt = $stmt;
          }
      
          public function rewind()
          {
              reset($this->cache);
              $this->next();
          }
      
          public function valid()
          {
              return (FALSE !== $this->next);
          }
      
          public function current()
          {
              return $this->next[1];
          }
      
          public function key()
          {
              return $this->next[0];
          }
      
          public function next()
          {
              // Try to get the next element in our data cache.
              $this->next = each($this->cache);
      
              // Past the end of the data cache
              if (FALSE === $this->next)
              {
                  // Fetch the next row of data
                  $row = $this->stmt->fetch(PDO::FETCH_ASSOC);
      
                  // Fetch successful
                  if ($row)
                  {
                      // Add row to data cache
                      $this->cache[] = $row;
                  }
      
                  $this->next = each($this->cache);
              }
          }
      

      }

      然后使用它:

      foreach(new PDOStatementIterator($stmt) as $col => $val)
      {
          ...
      }
      

      【讨论】:

        猜你喜欢
        • 2015-05-09
        • 2011-03-09
        • 1970-01-01
        • 2021-02-15
        • 1970-01-01
        • 2015-10-05
        • 1970-01-01
        • 1970-01-01
        • 2019-03-06
        相关资源
        最近更新 更多