使用mysql_fetch_array()和foreach()而不是while()

时间:2010-08-09 18:17:41

标签: php

我想知道如何将以下代码转换为使用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/>';

5 个答案:

答案 0 :(得分:10)

您可以这样编码:

$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/>';
}

正如您所看到的,从mysql_fetch_array获取数据时仍需要循环

答案 1 :(得分:6)

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

$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()没有预先存在的数组迭代。

答案 2 :(得分:0)

要使用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)

VS

while ($row = mysql_fetch_array($result))

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

编辑还有另一种选择,但这很荒谬。您可以使用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)的情况下完成。那么可以完成,就像那样。是否应该完成取决于你。

答案 3 :(得分:0)

使foreach成为可能的最明显的方法包括在数组中实现整个结果集,这可能迟早会在​​内存方面杀死你。你需要转向迭代器来避免这个问题。见http://www.php.net/~helly/php/ext/spl/

答案 4 :(得分:0)

您可以这样做

$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/>';
 }