查询在同一个表中获取2列

时间:2013-12-13 04:49:06

标签: php mysql

我完全停留在这段代码上,并希望有人能提供帮助。我有一个数据库,其中有一个名为“pages”的表,它有5列:id,file_name link_name,category,main_cat。不确定它是否重要,但main_cat的类型为tinytext,file_name是varchar。

id | file_name   | link_name   | category | main_cat 
1  | books       | Books       | books    | 1
2  | fiction     | Fiction     | books    | 2
3  | non-fiction | Non-Fiction | books    | 2
4  | music       | Music       | music    | 1
5  | alternative | Alternative | music    | 2
6  | country     | Country     | music    | 2

在我的导航菜单(下面的代码)中,我希望列出所有main_cat(1),然后将子页面man_cat(2)显示在下面。这是我的代码,现在,我已经尝试了很多不同的方式,包括内连接和左连接,但不管怎么样,我不断收到一个错误,上面写着“警告:mysqli_fetch_assoc()期望参数1是mysqli_result,boolean给出......“

<ul>
 <?php
   $query = "SELECT * FROM pages WHERE main_cat = 1 ORDER BY link_name ASC ";
   $main_pages = mysqli_query($conn, $query);
   confirm_query($main_pages);
 ?>
 <?php
   while($mainpage = mysqli_fetch_assoc($main_pages)) {
 ?>
  <li><a href="/edit.php?<?php echo $mainpage["id"]; ?>"><?php echo $mainpage["link_name"]; ?></a>  

  <?php
$query = "SELECT * FROM pages WHERE main_cat = 2 AND category = {$mainpage["file_name"]}";
$sub_pages = mysqli_query($conn, $query);
confirm_query($sub_pages);
  ?>
  <ul>
  <?php
while($subpage = mysqli_fetch_assoc($sub_pages)) {
  ?>
 <li><a href="/edit.php?<?php echo $subpage["id"]; ?>"><?php echo $subpage["link_name"]; ?></a></li>    
 <?php
}
 ?>
  <?php mysqli_free_result($sub_pages); ?>
   </ul>
 </li>
 <?php
}
 ?>
 <?php mysqli_free_result($main_pages); ?>
 </ul>      

3 个答案:

答案 0 :(得分:4)

这会让你心痛:

$query = "SELECT * FROM pages WHERE main_cat = 2 AND category = {$mainpage["file_name"]}";

问题是"周围的file_name字符被解释为结束字符串,而PHP的行为是不可预测的。换句话说,PHP看到了这个:

$query = "SELECT * FROM pages WHERE main_cat = 2 AND category = {$mainpage["file_name"]}";
      // ^ start string                                                    ^ end     ^s ^end again

请尝试以下其中一个选项:

$query = "SELECT * FROM pages WHERE main_cat = 2 AND category = '{$mainpage['file_name']}'";
$query = "SELECT * FROM pages WHERE main_cat = 2 AND category = '".$mainpage["file_name"]."'";

另外,请注意变量周围的引号 - 除非file_name实际上是一个数字,否则需要用引号括起数据。

最后,这可能不言而喻,但你真的需要在这里使用预备语句。

答案 1 :(得分:1)

检查您是否已连接正确的数据库,并且您的查询在语法上是正确的

如果$main_pages = mysqli_query($conn, $query);未正确设置或查询语法错误,

$conn将返回布尔值。

因此当你发射mysqli_fetch_assoc($main_pages)时它会抛出 “警告:mysqli_fetch_assoc()期望参数1为mysqli_result,boolean在......中给出” as,$main_pages是布尔值。

答案 2 :(得分:0)

我认为这与您的第二个查询有关,您可能将其格式化错误...我不是专家,但如果我错了可能别人可以编辑。

由此:

$query = "SELECT * FROM pages WHERE main_cat = 2 AND category = {$mainpage["file_name"]}";

对此:

$mainfilename = $mainpage['file_name'];

$query = "SELECT * FROM pages WHERE main_cat = 2 AND category = $mainfilename";