2010-10-07 67 views
0

基本上会发生什么是这样的:PHP/Mysql array_pop缺少第一个值

一个人去特定的画廊,说GalleryID = 42。我做了一个查询以获取该图库中的所有图像(具有GalleryID = 42的值),并执行单独的查询以获取与该图库相关联的所有评论(例如,GalleryID = 42)。总共400张图片中,在3张不同的图片上可能只有4条评论总数。

当我用do/while循环遍历图像并显示它们时,我搜索每个图片放置的注释数组,随着它循环。如果它找到与特定图片相匹配的图片ID,则会显示评论值(Comment,CommentAuthor和CommentDate)。

下面是图片查询:

SELECT * FROM GalleryData WHERE GalleryID = 42 

而对于评论查询:

SELECT Comment, CommentAuthor, CommentDate, ID FROM Comments WHERE CategoryID=42 

然后我用这个代码把评论的可重复使用的查询:

while(($Comments[] = mysql_fetch_assoc($rsComments)) || array_pop($Comments)); 

然后我使用它来循环访问数组以查找与特定项相关的注释ar picture

foreach($Comments as $comment) 
{ 
    if($comment['ID'] == $row_rsGalleries['ID']) 
    { 
    echo '<p>'.$comment['Comment'].' - '.$comment['CommentAuthor'].'</p>'; 
    } 
} 

问题是,该代码似乎不包括查询中的第一个注释。

现在,这是我做了这样的事情的第一个项目之一,我不是一个PHP/MySQL专家,新手用户。

当我运行查询时,它出现了4个结果,但数组只包含3,第一个结果丢失。

+0

它从一个Mysql查询中获取所有值,并将其放入一个可反复使用的数组中,我可以一遍又一遍地使用它。值来自: – dragboatrandy 2010-10-07 17:52:50

+0

嗯,一方面,你将会把'bool'值附加到'$ Comments'上......'mysql_fetch_assoc(...)|| array_pop(...)'在赋值之前被赋值,结果总是一个布尔值。 – meagar 2010-10-07 17:52:53

+1

为什么你有'|| array_pop($评论)'? – MatTheCat 2010-10-07 17:53:57

回答

5

这个构造对我来说看起来非常疯狂。我不明白为什么它会切断第一个元素,但我真的不想花时间去发现:你需要修正这个说法。在这种情况下使用||永远不会给你你想要的结果。

你能描述一下这个应该做什么吗?

+0

它取自记录集中的值: mysql_select_db($ database_connUser,$ connUser); $ query_rsComments = sprintf(“SELECT Comment,CommentAuthor,CommentDate,ID FROM Comments WHERE CategoryID =%s”,GetSQLValueString($ colname_rsComments,“int”)); $ rsComments = mysql_query($ query_rsComments,$ connUser)或die(mysql_error()); $ row_rsComments = mysql_fetch_assoc($ rsComments); $ totalRows_rsComments = mysql_num_rows($ rsComments); – dragboatrandy 2010-10-07 17:54:14

+1

@Randy我不明白'|| array_pop($评论)'部分应该做的。我认为你可以把它放开,它应该可以工作 – 2010-10-07 18:00:58

3

为什么你需要pop代码?

while($rsComment = mysql_fetch_assoc($rsComments)) { 
    $Comments[] = $rsComment; 
} 

不这样做,你需要的是更详细的优点的一切吗?

编辑你的代码无法工作的原因是,当while计算为false来停止循环时,它运行array_pop,并从数组中删除1个元素。

+1

请注意,当第一个元素弹出时,一个布尔弹出到最后。 – meagar 2010-10-07 18:01:23

0

mysql_fetch_assoc返回一个关联数组,如果存在行,则返回对应于获取行的关联数组,如果没有更多行,则返回false

所以

while(($Comments[] = mysql_fetch_assoc($rsComments)) || array_pop($Comments)); 

看起来像:

while(true || array_pop($Comments)); 

的第4行。现在||短路,流行不会发生。此后,当没有更多行时,mysql_fetch_assoc返回false,该数组被推入阵列,然后array_pop被执行,删除最后添加的元素(false)。

如此有效,|| array_pop($Comments)将删除数组中推入的最终布尔值,确保该数组仅具有由mysql_fetch_assoc返回的行。

+0

不正确;它更像'while($ Comments [] =(true || array_pop(...)));'这是一个重要的区别,因为推送到数组上的'array_push'值总是** bools **。 – meagar 2010-10-07 18:16:38

+0

基本上会发生什么事情是这样的:一个人去特定的画廊,说GalleryID = 42。我做了一个查询来获取与ID = 42的值相关的所有评论。在画廊中,有400个图像。只有几张照片才做出评论。当我遍历图像并显示它们时,我搜索数组以查找在循环中为每张图片放置的注释。如果它找到与特定图片匹配的图片ID,它会显示评论值(Comment,CommentAuthor和CommentDate)。这是否有意义? – dragboatrandy 2010-10-07 18:16:44

0

我不知道这是如何工作的。

起初我以为它会填满bool的数值,但想到它后,循环不应该终止

它最终将等同于while(($array[] = array_pop($array)));,和一个非空数组,这将自旋永远

下从未终止:

<?php 

// Simulate MySQL_fetch_assoc; return false when no more results 
function fetch($results) { 
    if (count($results)) 
     return array_pop($results); 
    return false; 
} 

$Comments = array(); 
$rsComments= array(array(3), array(4), array(5), array(6)); 

while (($Comments[] = fetch($rsComments) || array_pop($Comments))); 

// $Comments = array(true,true,true,true,true,...); 
0

你必须放在一个柜台;例如:$ counter = 3然后你的while语句包含这个计数器,像这样:

while($ count < 3){(你的计数从0开始,所以尽管总共有4个项目,其中一个,你的程序只能计算3个数组)。有一个永无止境的循环。