【问题标题】:Use mysql_fetch_array() with foreach() instead of while()使用 mysql_fetch_array() 和 foreach() 而不是 while()
【发布时间】:2011-03-27 10:52:52
【问题描述】:

我想知道我们如何将以下代码转换为与 foreach 一起使用

$query_select = "SELECT * FROM shouts ORDER BY id DESC LIMIT 8;"; 

    $result_select = mysql_query($query_select) or die(mysql_error());

    while($row = mysql_fetch_array($result_select)) {
        $ename = stripslashes($row['name']);
        $eemail = stripcslashes($row['email']);
        $epost = stripslashes($row['post']);
        $eid = $row['id'];

        $grav_url = "http://www.gravatar.com/avatar.php?gravatar_id=".md5(strtolower($eemail))."&size=70";

        echo ('<img src = "' . $grav_url . '" alt="Gravatar">'.'<br/>');

        echo $eid . '<br/>';

        echo $ename . '<br/>';

        echo $eemail . '<br/>';

        echo $epost . '<br/><br/><br/><br/>';

【问题讨论】:

  • 为什么?我看不出有任何理由更改您的代码。使用 foreach 只会使其更长并使用更多内存。
  • 好吧,不要去学习那些会让你的代码变得更糟的东西。相反,请学习:不要在 mysql_fetch_array() 中使用 foreach 循环。

标签: php


【解决方案1】:

你可以这样编码:

$query_select = "SELECT * FROM shouts ORDER BY id DESC LIMIT 8;";
$result_select = mysql_query($query_select) or die(mysql_error());
$rows = array();
while($row = mysql_fetch_array($result_select))
    $rows[] = $row;
foreach($rows as $row){ 
    $ename = stripslashes($row['name']);
    $eemail = stripcslashes($row['email']);
    $epost = stripslashes($row['post']);
    $eid = $row['id'];

    $grav_url = "http://www.gravatar.com/avatar.php?gravatar_id=".md5(strtolower($eemail))."&size=70";

    echo ('<img src = "' . $grav_url . '" alt="Gravatar">'.'<br/>');

    echo $eid . '<br/>';

    echo $ename . '<br/>';

    echo $eemail . '<br/>';

    echo $epost . '<br/><br/><br/><br/>';
}

如您所见,仍然需要一个循环 while 从 mysql_fetch_array 获取数据

【讨论】:

  • 不使用while循环就不能完成吗?我的意思是根本不可能从数据库中获取数据并使用foreach循环迭代它而不实际使用while循环......
  • 你不能。 Foreach 是一个使用 for 存在数组的循环,用于遍历其每个项目。要获取数据,需要一个 while 循环(或 for 循环)。 php.net/manual/en/control-structures.foreach.php
  • 不,mysql 函数一次检索 1 行,而不是行数组。如果您切换到 PDO (nl3.php.net/manual/en/book.pdo.php),可以使用 fetchAll() 将结果集作为数组获取。
  • 我很喜欢你解释事情的简单性,它很容易理解,非常感谢你让我理解了 foreach 循环的可能性.. 这真的很有帮助..:)
【解决方案2】:

没有将其转换为 foreach 的好方法,因为 mysql_fetch_array() 只是从 $result_select 获取下一个结果。如果你真的想要 foreach,你可以先将所有结果拉入一个数组,执行如下操作:

$result_list = array();
while($row = mysql_fetch_array($result_select)) {
   result_list[] = $row;
}

foreach($result_list as $row) {
   ...
}

但是我认为没有充分的理由这样做 - 而且您仍然必须使用 while 循环,由于mysql_fetch_array() 的工作原理,这是不可避免的。为什么使用 foreach() 如此重要?

编辑:如果这只是为了学习目的:您不能将其转换为 foreach。您必须有一个预先存在的数组才能使用 foreach() 而不是 while(),并且 mysql_fetch_array() 每次调用都会获取一个结果 - 没有预先存在的数组供 foreach() 迭代。

【讨论】:

  • 我正在学习 php,我想学习这种可能性,实际上我无法在互联网上找到任何可以解释我使用 foreach() 进行数据库操作的过程的好的 tuts,我会如果有人能指出正确的方法(tut),以及将 foreach 循环与数据库查询一起使用的可能性,不胜感激。
  • 正确的做法是:不要对数据库查询使用foreach循环。
  • 您找不到教程,因为您根本无法使用 foreach() 使用标准 PHP MySQL 库进行数据库操作(并且您不想使用其他任何东西)。如果出于某种原因您真的想使用 foreach() 并一次将所有行放在一个数组中,则必须按上述方式进行。
  • 重申:不可能将 foreach 循环与数据库查询一起使用。它只是不那样工作。您一次只能提取一个结果。
  • 我明白了,感谢您的快速响应,并为您提供了很大的帮助......干杯!!
【解决方案3】:

要使用foreach,您需要一个包含查询结果中每一行的数组。一些用于 PHP 的 DB 库提供了一个 fetch_all 函数,该函数提供了一个适当的数组,但我找不到 mysql 的一个(但是 mysqli 扩展确实如此)。你当然可以自己写,像这样

function mysql_fetch_all($result) {
   $rows = array();
   while ($row = mysql_fetch_array($result)) {
     $rows[] = $row;
   }
   return $rows;
}

但是我必须回应“为什么?”使用此函数,您将创建两个循环而不是一个循环,并要求将整个结果集加载到内存中。对于足够大的结果集,这可能会严重拖累性能。为了什么?

foreach (mysql_fetch_all($result) as $row)

while ($row = mysql_fetch_array($result))

while 同样简洁,IMO 更具可读性。

EDIT 还有另一种选择,但它非常荒谬。你可以使用Iterator Interface

class MysqlResult implements Iterator {
  private $rownum = 0;
  private $numrows = 0;
  private $result;

  public function __construct($result) {
    $this->result = $result;
    $this->numrows = mysql_num_rows($result);
  }

  public function rewind() {
    $this->rownum = 0;
  }

  public function current() {
    mysql_data_seek($this->result, $this->rownum);
    return mysql_fetch_array($this->result);
  }

  public function key() {
    return $this->rownum;
  }

  public function next() {
    $this->rownum++;
  }

  public function valid() {
    return $this->rownum < $this->numrows ? true : false;
  }
}

$rows = new MysqlResult(mysql_query($query_select));

foreach ($rows as $row) {
  //code...
}

在这种情况下,MysqlResult 实例仅在请求时获取行,就像 while 一样,但将其包装在一个很好的 foreach-able 包中。虽然您为自己节省了一个循环,但也增加了类实例化的开销和大量的函数调用,更不用说大量增加的代码复杂性了。

但你问是否可以不使用while(我想是for)来完成。好吧,它可以完成,就像那样。是否应该由你决定。

【讨论】:

  • 我不习惯 oop,但感谢您提供冗长的代码顺便说一句,我经历了它并且必须承认我从中学到了一些东西。感谢您的扩展帮助:)
【解决方案4】:

使foreach 成为可能的最明显方法包括将整个结果集具体化为一个数组,这可能迟早会扼杀你的记忆。你需要转向迭代器来避免这个问题。见http://www.php.net/~helly/php/ext/spl/

【讨论】:

    【解决方案5】:

    你可以这样做

    $query_select = "SELECT * FROM shouts ORDER BY id DESC LIMIT 8;"; 
    
    $result_select = mysql_query($query_select) or die(mysql_error());
    
     foreach($result_select as $row){
        $ename = stripslashes($row['name']);
        $eemail = stripcslashes($row['email']);
        $epost = stripslashes($row['post']);
        $eid = $row['id'];
    
        $grav_url = "http://www.gravatar.com/avatar.php?gravatar_id=".md5(strtolower($eemail))."&size=70";
    
        echo ('<img src = "' . $grav_url . '" alt="Gravatar">'.'<br/>');
    
        echo $eid . '<br/>';
    
        echo $ename . '<br/>';
    
        echo $eemail . '<br/>';
    
        echo $epost . '<br/><br/><br/><br/>';
     }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-19
      • 2015-08-05
      • 1970-01-01
      • 2012-07-31
      • 2012-03-30
      • 2021-12-11
      相关资源
      最近更新 更多