【问题标题】:How can I create dynamic menus and pages driven from database?如何创建从数据库驱动的动态菜单和页面?
【发布时间】:2014-07-14 15:54:03
【问题描述】:

我是这里的新手,也是 php 的新手。不过,我对 stackoverflow 并不陌生 :)

我正在创建一个简单的报告系统,我希望从数据库中生成菜单和页面。

我看到this video on YouTube 并设法使用以下代码创建了一个菜单。

我有一个名为Reports 的数据库表和名为rep_id、rep_date、rep_ledit_date、rep_by、department、position、report 和rep_to 的列。

所以基于上面的方法,我用这段代码创建了一个菜单。

<?php 

require ("includes/db.php");

mysqli_select_db($con, '$db_name');

$sql = "SELECT * FROM reports";
$result = mysqli_query($con, $sql) or die (mysqli_error($con));
$represult=mysqli_fetch_assoc($result);
$rep_by=$represult['rep_by'];
$report=$represult['report']; 

?>  
<li> Menu
<ul>
<?php do 
       {
?>
<li><a href="reports.php?rep_id=<?php echo $represult['rep_id']; ?>"> <?php echo $represult['rep_by'] . " (" .   $represult['rep_date'] . ")"; ?></a></li>

<?php 
     } while ($represult=mysqli_fetch_assoc($result));
    //$represult['rep_by'];
    //$represult['report'];
    //$represult['report'] ;
?>
</ul>
</li>    

于是我创建了一个名为reports.php 的页面来查看数据库中内容的详细信息。我想要的是将以下 rep_by (rep_date) 视为标题并将报告视为内容。

我可能还想在内容中使用其他列。那么菜单和reports.php应该有什么样的代码来实现我想要的。我所做的是以下内容,它仅在单击所有菜单链接时输出第一行。

 require ("includes/db.php");

 mysqli_select_db($con, '$db_name');

 $sql= "SELECT * FROM reports";
 $result = mysqli_query($con, $sql) or die (mysqli_error($con));
 $represult=mysqli_fetch_assoc($result); 

 <h1> <?php echo $represult['rep_by'] . " (" . $represult['rep_date'] . ")"; ?></a></h1>
 <?php echo $represult['report']; ?>

【问题讨论】:

  • 您似乎提供了 menu.php 的 PHP 代码。您是否要求提供reports.php 的PHP 代码示例?
  • 我提供的答案解决了我在您的代码中看到的一个主要问题——$represult=mysqli_fetch_assoc($result) 被使用了两次——但不清楚问题是什么?这段代码不起作用吗?我的答案现在是一个解决方案吗?除非您可以编辑/修改问题以澄清,否则标记为“不清楚”。
  • @bloodyKnuckles,我现在修改了它。在此论坛上发帖时出现错误。问题仍然存在于reports.php
  • 解释清楚多了。您为reports.php(复数)提供了PHP 代码。但是,您的“
  • @bloodyKnuckles,很好的观察。这又是我在这个论坛上写的不好。我会修好它。我的问题是,页面没有显示相应的报告,而只是数据库中的第一行。
  • 标签: php mysql loops dynamic menu


    【解决方案1】:

    由于 PHP 标记和 HTML 的混合,您的代码有点混乱,所以我像这样将其重新编写为 100% PHP。

    require ("includes/db.php");
    
    mysqli_select_db($con, '$db_name');
    
    $sql = "SELECT * FROM reports";
    $result = mysqli_query($con, $sql) or die (mysqli_error($con));
    
    echo '<li>'
       . '<ul>'
       ;
    
    while ($represult = mysqli_fetch_assoc($result)) {
      echo '<li>'
         . '<a href="reports.php?rep_id=' . $represult['rep_id'] . '">'
         . $represult['rep_by']
         . ' (' .   $represult['rep_date'] . ')'
         . '</a>'
         . '</li>'
         ;
    } 
    
    echo '</ul>'
       . '</li>'
       ;
    

    我在您的原始代码中看到的主要问题是您执行了两次此调用:

    $represult=mysqli_fetch_assoc($result);
    

    一个在$result = mysqli_query(…) 附近,另一个作为do/while 循环的尾端。另外,不确定do/while 循环的值,所以我将它重构为一个简单的while 循环。最后,重组为 100% PHP,我做了一些格式化的连接,以便更容易阅读和查看整体逻辑的结构。

    编辑: 原始发帖人添加了额外的代码,说明问题是它只返回第一个结果。问题再次是缺少while 循环。这是我对该代码的重构版本:

    require ("includes/db.php");
    
    mysqli_select_db($con, '$db_name');
    
    $sql= "SELECT * FROM reports";
    $result = mysqli_query($con, $sql) or die (mysqli_error($con));
    
    
    while ($represult = mysqli_fetch_assoc($result)) {
    
      echo '<h1>'
         . $represult['rep_by']
         . ' ('
         . $represult['rep_date']
         . ')'
         . '</h1>'
         . $represult['report']
         ;
    
    }
    

    【讨论】:

    • 感谢您改进代码。现在清楚多了。但是我仍然有问题,因为在report.php 上,只有第一个结果出现,但我想为每个不同的菜单链接看到不同的报告。我在第一页上进行了编辑,以显示您改进的代码后的 report.php 是什么样子。
    • @andex 提供的代码应该可以显示所有报告。请检查此代码的原始 HTML 输出,以查看是否存在渲染问题。如果您发现我的工作有帮助,请投票。谢谢,祝你好运!
    • 谢谢。我在第一篇文章中做了进一步的澄清,你能帮我渲染一下名为reports.php的页面吗?
    • @andex 问题与第一期类似。您不了解while 循环如何与mysqli_fetch_assoc 一起工作。我清理后的代码版本在我的最新编辑中。但这是我要做的最后一次编辑。如果您发现我的工作有帮助,请投票。如果它是问题的答案,请将其标记为这样。谢谢,祝你好运!
    • @andex PS:您也不应该编辑您的问题以将其替换为其他解决方案。你让其他人更难帮助你。我会将您对代码的更改恢复到原来的样子。
    【解决方案2】:

    report.php:

    <?php
    
    require ('includes/db.php');
    
    mysqli_select_db($con, $db_name);
    
    $sql= 'SELECT * FROM Reports WHERE rep_id = ?';
    $stmt = $con->prepare($sql);
    $id = $_GET['rep_id'];
    $stmt->bind_param('i', $id);
    $stmt->execute();
    
    $stmt->bind_result($rep_id, $rep_date, $rep_ledit_date, $rep_by, $department, $position, $report, $rep_to);
    $stmt->fetch();
    
    ?>
    
    <h1><?php echo "$rep_by ($rep_date)"; ?></h1>
    <?php echo $report; ?>
    

    reports.php(稍作调整)

    <?php 
    
    require ('includes/db.php');
    
    mysqli_select_db($con, $db_name);
    
    $sql = 'SELECT * FROM Reports';
    $stmt = $con->prepare($sql);
    $stmt->execute();
    
    $stmt->bind_result($rep_id, $rep_date, $rep_ledit_date, $rep_by, $department, $position, $report, $rep_to);
    
    ?>  
    Menu
    <ul>
    <?php while ($stmt->fetch()) { ?>
    
    <li><a href="report.php?rep_id=<?php echo $rep_id; ?>"> <?php echo "$rep_by ($rep_date)"; ?></a></li>
    
    <?php } ?>
    </ul>
    

    【讨论】:

    • @bloodyKnuckles,非常感谢。您的解决方案效果很好。你让我今天一整天都感觉很好!现在我必须了解 bind_param、bind_result 和他们的朋友,因为我的项目会有很多。我在哪里可以找到关于它们的好信息?
    • @bloodyKnuckles,你好吗。我有与您上次给我的解决方案相关的新问题。请你帮我解决这个问题。比你! stackoverflow.com/a/23961453/3674573
    • @bloodyKnuckles,我现在面临一个新问题。我收到以下错误 Fatal error: Call to a member function execute() on a non-object in /home/wt/public_html/view-reports.php on line 237 。调整后的 report.php 也是同样的消息 - 现在是 view-reports.php。我还看到另一个问题。生成的变量不会回显正确的相应数据。例如,$rep_type 回显位置。你能帮我解决这个问题吗?谢谢!测试站点网址在这里。 ethioserver.com/~wt/view-reports.php?rep_id=144
    • 使用 view-reports.php 代码发布一个新问题,特别是在第 237 行附近以及您用来调用执行的 $stmt 变量。不知何故,$stmt 变量没有变成数据库对象,因此出现错误,在非对象上调用执行。
    • 好的,谢谢!我在这里发布了一个新问题。 stackoverflow.com/q/24086070/3674573
    猜你喜欢
    相关资源
    最近更新 更多
    热门标签