[英]How do you retrieve data from a db with PHP and MySQL and indent returned results?
只是为了正确看待这个程序,我正在尝试创建一个迷你公告。
这是我的桌子:
CREATE TABLE Postings
(
`PostID` INT( 11 ) NOT NULL AUTO_INCREMENT ,
`PostDate` DATETIME NOT NULL ,
`PostedBy` VARCHAR( 255 ) NOT NULL ,
`PostSubject` VARCHAR( 255 ) NOT NULL ,
`Content` VARCHAR( 255 ) NOT NULL ,
`ParentPost` INT( 11 ) NULL ,
PRIMARY KEY ( `PostID` )
)
这是该表中的数据:
insert into postings values
('1','11/01/03 10:15','a@abc.com','Welcome','Welcome to the bulletin board',NULL);
insert into postings values
('2','12/01/03 08:00','b@abc.com','Welcome 2','This is posting 2','1');
insert into postings values
('3','13/01/03 09:00','c@abc.com','Welcome 3','This is posting 3','1');
insert into postings values
('4','14/01/03 10:15','a@abc.com','New Topic','This is posting 4',NULL);
insert into postings values
('5','15/01/03 10:15','a@abc.com','New Topic 2','This is posting 5','4');
insert into postings values
('6','16/01/03 10:15','a@abc.com','New Topic 3','This is posting 6','4');
insert into postings values
('7','17/01/03 10:15','c@abc.com','Welcome 4','This is posting 7','2');
insert into postings values
('8','18/01/03 10:15','d@abc.com','Welcome 5','This is posting 8','2');
insert into postings values
('9','19/01/03 10:15','a@abc.com','Welcome 6','This is posting 9','8');
insert into postings values
('10','20/01/03 10:15','b@abc.com','New Topic 4','This is posting 10','6');
PostID 是自动递增的并且是主键,ParentPost 也是 INT,并且会为其分配值。
现在我要做的是编写一个 SQL 语句和 PHP 代码,这将允许我从数据库中检索所有值,但缩进每一行,其 ParentPost 值等于 PostID 行下方的 PostID 值。
我在底部有一张图片,可以更好地解释我所追求的。
这是我到目前为止没有运气的想法:
<?php
$db_host = "localhost";
$db_username = "root";
$db_pass = "";
$db_name = "OnlineBulletinBoardDB";
@mysql_connect("$db_host","$db_username","$db_pass") or die ("Could no connect to MySQL");
@mysql_select_db("$db_name") or die ("No database");
$query="SELECT PostSubject FROM postings GROUP BY PostID = ParentPost;";
$result=mysql_query($query);
$num=mysql_numrows($result);
mysql_close();
?>
<?php
$i=0;
while ($i < $num) {
$dno=mysql_result($result,$i,"PostSubject");
?>
<?php echo $dno; ?><br/>
<?php
$i++;
}
?>
我正在寻找的最终结果如下图所示:
干杯,伙计们。
递归是关键。 为了避免执行大量查询,例如“select * from Postings where ParentID = 0”、“select * from Postings where ParentID = 1”等,请执行一个查询“select * from Postings”,它会返回所有内容,然后使用parent id 第一个数组的键。 下面的示例未经测试,但应该进行一些整理:
<?php
$db_host = "localhost";
$db_username = "root";
$db_pass = "";
$db_name = "OnlineBulletinBoardDB";
@mysql_connect("$db_host","$db_username","$db_pass") or die ("Could no connect to MySQL");
@mysql_select_db("$db_name") or die ("No database");
$query="SELECT PostSubject, PostID, ParentID FROM postings";
$res = mysql_query($query);
while($row = mysql_fetch_assoc($res){
$parentID = intval($row['ParentID']);
$posts[$parentID][] = $row;
}
function displayPosts($parentId, $posts){
echo "<ul>";
foreach($posts[$parentId] as $post){
echo "<li>";
echo $post['PostSubject'];
if(isset($posts[$post['PostID']])){
displayPosts($post['PostID'],$posts);
}
echo "</li>";
}
echo "</ul>";
}
displayPosts($posts['PostID'],$posts);
嗯,我无法编辑ejrowley 的答案(我是 StackOverflow 的新手),所以我发布了更整洁且带有递归的工作示例:
<?php
$db_host = "localhost";
$db_username = "root";
$db_pass = "";
$db_name = "OnlineBulletinBoardDB";
@mysql_connect("$db_host","$db_username","$db_pass") or die ("Could no connect to MySQL");
@mysql_select_db("$db_name") or die ("No database");
$posts = array();
$q = mysql_query("SELECT * FROM postings;");
while ($row = mysql_fetch_assoc($q)) {
$parentId = $row['ParentPost'];
$posts[$parentId ? $parentId : 0][] = $row; // because you use NULL and array can't have NULL key
}
function displayPosts($parentId, $posts) {
echo "<ul>";
foreach ($posts[$parentId] as $post) {
echo "<li>";
echo $post['PostSubject'];
$postId = $post['PostID'];
if (isset($posts[$postId])) {
displayPosts($postId, $posts);
}
echo "</li>";
}
echo "</ul>";
}
displayPosts(0, $posts); // where 0 means 'no parent'
?>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.