2017-05-04 74 views
1

我不知道如何搜索我遇​​到的这个问题,也不知道我是否使用了正确的术语。PHP - 参考数组不止一次针对不同的结果

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

我迄今已完成:

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

所以一个部分,我想用“图像”类和“车辆”一节下一节匹配记录。
使用上面的代码,它只显示while循环的记录,而不是第二个循环。我应该做什么不同?

+0

嗯,我认为你不能这样做,你应该使用2查询。类似于“image”的类别'',类似于“vehicule”的第二类'' – kaldoran

回答

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_ [对象/阵列/ ASSOC]仅返回一个结果行并且不会返回所有数据集。

例如:

mysqli_result :: FETCH_ASSOC - mysqli_fetch_assoc - 获取结果列 作为关联数组

和当你在遍历该数据集,PHP罩盖下方使用一些函数如next & current来遍历该对象m,而next函数只是将对象/数组指针前进1。

下 - 在第一个迭代结束推进阵列

的内部指针,你将到达[对象/数组]的最后一个值的指针,所以在下一迭代时间,你将无法遍历该对象,除非你reset该指针为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>'; 
     } 
    } 
} 
+0

我试着按照你的建议使用fetch_assoc,但得到几个警告: PHP警告:非法的字符串偏移量'category'。 我一直在排除故障,但感觉有点失落 – Stephen

+0

对不起,忘了更新我的问题,你应该使用fetch_all代替,结帐我的更新 – hassan

+0

感谢您的帮助,使它工作。 – Stephen

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 
} 
+0

从语法上来看,似乎OP是使用mysqli API而不是PDO – hassan

+0

是的,我可以看到,但我们的答案的重点是指出他在正确的方向:)。我也随时采用面向对象方法。 – Filchev

1

假设哟您正在使用MySQLi,您可以使用data_seek(0)来重置指针。

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

您应该考虑每个部分(WHERE user_id = $user_id AND category="image")做不同的查询。并且获取所有字段(SELECT *)也可能不是必需的。