2010-08-09 101 views
4

我想知道我们如何转换下面的代码用foreach工作使用mysql_fetch_array()用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/>'; 
+1

为什么?我没有看到任何更改代码的理由。使用foreach只会使它更长,并使用更多的内存。 – 2010-08-09 18:20:37

+5

那么,不要去学习会让你的代码变得更糟的东西。相反,学习这一点:不要使用mysql_fetch_array()的foreach循环。 – 2010-08-09 18:28:09

回答

8

你可以像这样的代码:

$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

+0

无法使用while循环完成吗?我的意思是根本无法从数据库中获取数据并使用foreach循环迭代它,而实际上并没有使用while循环... – 2010-08-09 18:29:10

+3

你不能。 ** Foreach **是一个循环,用于存在数组,循环遍历每个项目。要获取数据,需要** while循环**(或** for循环**)。 http://php.net/manual/en/control-structures.foreach.php – 2010-08-09 18:38:54

+0

不,mysql函数一次检索1行,而不是行数组。如果切换到PDO(http://nl3.php.net/manual/en/book.pdo.php),则可以使用fetchAll()将结果集作为数组使用。 – Kwebble 2010-08-09 18:43:31

5

这里没有将它转化成的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()没有预先存在的阵列来遍历。

+0

我正在学习PHP,而我想要学习这种可能性,实际上我无法在互联网上找到任何可以解释我使用foreach()进行数据库操作的过程的好东西,如果有人能指出我正确的方式(tut),数据库查询使用foreach循环的可能性。 – 2010-08-09 18:27:12

+0

正确的做法是:不要对数据库查询使用foreach循环。 – 2010-08-09 18:29:29

+0

你找不到教程,因为你不能使用foreach()来使用标准PHP MySQL库进行数据库操作(并且你不想使用其他任何东西)。如果由于某种原因,你真的想使用一个foreach()并且一次将所有的行放在数组中,你必须按照上面的方法来完成。 – cincodenada 2010-08-09 18:31:59

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获得的数据包。虽然你已经保存了一个循环,但你已经添加了类实例化的开销和函数调用的小船加载,更不用说增加了很多代码复杂度。

但你问是否可以不使用while(或for我想象)。那么它可以就这样完成。是否完成取决于你。

+0

我不习惯oop,但是感谢那冗长的代码,我经历了它,并且必须承认我从中学到了一些东西。感谢您的延长帮助:) – 2010-08-09 19:15:27

0

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