PHP - 不同结果的参考数组不止一次

时间:2017-05-04 08:04:59

标签: php arrays

我不确定如何搜索这个问题我还有,或者我是否使用了正确的术语。

我有一张包含各种记录的表格,每条记录都有一个类别集。我想查询一次表并将结果输出到网页的相关部分。

到目前为止我做了什么:

$result_f1 = $db->query("SELECT * FROM files WHERE user_id = $user_id ") or die('cannot show tables');

... some html ...

if($result_f1) {
    while($row3 = $result_f1->fetch_object()) {
        if ($row3->category == "image") {
            echo '<div class="col-sm-6"><img class="img-responsive" src="/site/data/' .$user_id. '/',$row3->filename,'" alt="Photo"></div>';
        }
    }
}

...more html onto next section...

if($result_f1) {
    while($row4 = $result_f1->fetch_object()) {
        if ($row4->category == "vehicle") {
            echo '<div class="col-sm-6"><img class="img-responsive" src="/site/data/' .$user_id. '/',$row4->filename,'" alt="Photo"></div>';
        }
    }
}

所以我希望将记录与&#34;图像&#34;匹配。类别和&#34;车辆&#34;的下一部分;部分。
使用上面的代码,它只显示while循环的记录,而不是第二个循环。我应该做些什么呢?

3 个答案:

答案 0 :(得分:2)

这是因为您使用fetch_object方法获取数据。

而fetch_object使用fetch_all如下:

$result_f1 = $db->query("SELECT * FROM files WHERE user_id = $user_id ") or die('cannot show tables');

$dataSet = $result_f1->fetch_all(MYSQLI_ASSOC);

if($dataSet) {
    foreach($dataSet as $row3) {
        if ($row3['category'] == "image") {
            echo '<div class="col-sm-6"><img class="img-responsive" src="/site/data/' .$user_id. '/',$row3['filename'],'" alt="Photo"></div>';
        }
    }
}

...more html onto next section...

if($dataSet) {
    foreach($dataSet as $row4) {
        if ($row4['category'] == "vehicle") {
            echo '<div class="col-sm-6"><img class="img-responsive" src="/site/data/' .$user_id. '/',$row4['filename'],'" alt="Photo"></div>';
        }
    }
}

这是因为fetch_ [object / array / assoc]只返回一个结果行而不返回所有数据集。

例如:

  

mysqli_result :: fetch_assoc - mysqli_fetch_assoc - 获取结果行   作为关联数组

当你在迭代这个数据集时,幕后的php会使用像next&amp;这样的函数。 current循环遍历该对象m,而next函数只是将对象/数组指针提前一个。

  

next - 推进数组的内部指针

在第一次迭代结束时,您将到达[object / array]指针的最后一个值,因此在下一次迭代时,您将无法迭代该对象,除非您{ {3}}指针指向0

如下:

$result_f1 = $db->query("SELECT * FROM files WHERE user_id = $user_id ") or die('cannot show tables');

... some html ...

if($result_f1) {
    while($row3 = $result_f1->fetch_object()) {
        if ($row3->category == "image") {
            echo '<div class="col-sm-6"><img class="img-responsive" src="/site/data/' .$user_id. '/',$row3->filename,'" alt="Photo"></div>';
        }
    }
}

...more html onto next section...

$result_f1->data_seek(0);

if($result_f1) {
    while($row4 = $result_f1->fetch_object()) {
        if ($row4->category == "vehicle") {
            echo '<div class="col-sm-6"><img class="img-responsive" src="/site/data/' .$user_id. '/',$row4->filename,'" alt="Photo"></div>';
        }
    }
}

答案 1 :(得分:1)

发生这种情况的原因是因为一旦第一个while循环结束,结果集就为空。您需要获取完整的结果集并将其放入变量中。

类似

$sth = $dbh->prepare("SELECT name, colour FROM fruit");
$sth->execute();

/* Fetch all of the values of the first column */
$results = $sth->fetchAll(PDO::FETCH_COLUMN, 0);

然后

foreach (results  as key => value){
// use hte results
}

答案 2 :(得分:1)

假设您使用的是MySQLi,可以使用WHERE user_id = $user_id AND category="image"重置指针。

http://php.net/manual/en/mysqli-result.data-seek.php

您应该考虑为每个部分(SELECT *)执行不同的查询。并且可能不需要获取所有字段(urlpatterns = [ url( r'^model1/$', ListView.as_view(model=Model1), name='model1_list' ), url( r'^model2/$', ListView.as_view(model=Model2), name='model2_list' ), ] )。