【发布时间】:2019-10-19 08:11:03
【问题描述】:
我希望有人帮助我编写 php 代码。我想要做的是使用嵌套的 do while 循环从两个表中从数据库中获取菜单和子菜单,以便它显示一个下拉导航栏。导航表包含菜单项,类别表包含子菜单。但是它在获取所有菜单项和第一个菜单项的第一个子菜单项之后在循环的第一次迭代时停止,然后它只显示空结果。
-- Table structure for table `category`
--
CREATE TABLE `category` (
`cat_id` int(11) NOT NULL,
`nav_id` int(11) NOT NULL,
`cat_eng` varchar(256) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
--
-- Dumping data for table `category`
--
INSERT INTO `category` (`cat_id`, `nav_id`, `cat_eng`) VALUES
(1, 1, 'Technology'),
(2, 1, 'Science'),
(3, 1, 'Mathemathics'),
(4, 1, 'Computer'),
(5, 2, 'Geography'),
(6, 2, 'Environment'),
(7, 2, 'Weather'),
(8, 2, 'World'),
(9, 3, 'Sport'),
(10, 3, 'Food'),
(11, 3, 'Health'),
(12, 4, 'Mens'),
(13, 4, 'Womens');
-- --------------------------------------------------------
--
-- Table structure for table `navigation`
--
CREATE TABLE `navigation` (
`nav_id` int(11) NOT NULL,
`nav_eng` varchar(256) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
--
-- Dumping data for table `navigation`
--
INSERT INTO `navigation` (`nav_id`, `nav_eng`) VALUES
(1, 'Educational'),
(2, 'General-Knowlege'),
(3, 'Life-style'),
(4, 'Fashion');
连接.php
<?php
session_start();
$host = 'localhost';
$user = 'root';
$password = '';
$dbname = 'test';
$connection = @mysqli_connect($host, $user, $password, $dbname);
if (!$connection) {
die("Connection failed: " . mysqli_connect_error());
}
mysqli_set_charset($connection, 'utf8');
?>
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<ul class="navbar-nav mr-auto">
<!-- FETCHING NAVIGATION LIST ALONG WITH DROPDOWN MENU FROM DATABASE -->
<?php
//SETTING GET PAGES
if (isset($_GET['nav'])) {
$pageid = $_GET['nav'];
}else {
$pageid = 1;
}
//NAVIGATION TABLE QUERY
$nav_sql = "SELECT * FROM navigation";
$nav_query = mysqli_query($connection, $nav_sql);
$nav_result = mysqli_fetch_assoc($nav_query);
//CATEGORY TABLE QUERY
$cat_sql = "SELECT category.*, navigation.nav_id AS id FROM category JOIN navigation ON (category.nav_id = navigation.nav_id) WHERE category.nav_id = " .$pageid;
$cat_query = mysqli_query($connection, $cat_sql);
$cat_result = mysqli_fetch_assoc($cat_query);
do {
?>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" href="?nav=<?php echo $nav_result['nav_id'] ?>"> <?php echo $nav_result['nav_eng']; ?></a>
<ul class="dropdown-menu">
<?php
do { ?>
<li>
<a class="dropdown-item" href="?nav=<?php echo $cat_result['cat_id']; ?>"><?php echo $cat_result['cat_eng'] ?></a>
</li> <?php
} while ($cat_result = mysqli_fetch_assoc($cat_query));
?>
</ul>
</li> <?php
} while ($nav_result = mysqli_fetch_assoc($nav_query));
?>
</ul>
</div>
【问题讨论】:
-
由于您的
$cat_query在任一循环运行之前执行,因此内部循环的第一轮将从数据库中读取所有记录。第二次周围没有记录可供阅读。您需要在外部循环内执行此查询 - 选择特定项目,或者将 SQL 光标重新定位在开头并重新读取。 -
嘿奈杰尔!因为我是编码新手,所以我被卡住了。你能提供给我正确的查询吗?!
-
不确定应该是什么,您在 SQL 末尾有
category.nav_id = " .$pageid,但$pageid与您尝试显示的每个单独的菜单有什么关系。如果这是来自navigation表,则在第一个循环中,获取特定值并使用每个菜单的正确值执行此category查询。 -
我设置
category.nav-is = .$pageid是因为每个菜单项在导航表中都有它的nav_id,并且类别表的子菜单也有nav_id,所以当点击每个菜单时我希望它根据传递的nav_id动态获取子菜单通过,$_GET[]方法。所以我设置了这一行 ->``` //SETTING GET PAGES if (isset($_GET['nav'])) { $pageid = $_GET['nav']; }else { $pageid = 1; }```以上 -
我能否澄清一下:最初您希望将
nav_eng的内容从navigation表中显示为菜单项。单击时,将获取相关子菜单并显示在该类别标题下。这或多或少是正确的吗?
标签: php mysql nested-loops