首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么一个文件在PHP论坛系统中不能与其他文件连接?

为什么一个文件在PHP论坛系统中不能与其他文件连接?
EN

Stack Overflow用户
提问于 2018-08-17 02:56:55
回答 1查看 52关注 0票数 0

我在一个PHP论坛上工作,这个论坛涉及多个相互引导的页面。我正试图让类别主题出现在单独的页面上,但是由于某种原因,topics.php文件连接到其他文件。当我单击主页按钮或尝试注销时,页面不会改变。我通过单独的函数文件来做所有的事情。

下面是topics.php文件:

代码语言:javascript
复制
    <?php
session_start();
include ('../db.php');
$first_name = $_SESSION['first_name'];
$last_name = $_SESSION['last_name'];
$email = $_SESSION['email'];
$active = $_SESSION['active'];

// Check if user is logged in using the session variable
if ( $_SESSION['logged_in'] != 1 ) {
  $_SESSION['message'] = "You must log in before viewing your profile page!";
  header("location: error.php");
}
else {
    // Makes it easier to read
    $first_name = $_SESSION['first_name'];
    $last_name = $_SESSION['last_name'];
    $email = $_SESSION['email'];
    $active = $_SESSION['active'];
}

include ('content_function.php');

 ?>
<!DOCTYPE html>
<html lang="en">

  <head>

    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    <meta name="description" content="">
    <meta name="author" content="">

    <title>Home</title>

    <!-- Bootstrap core CSS -->
    <link href="vendor/bootstrap/css/bootstrap.min.css" rel="stylesheet">
    <!-- Custom fonts for this template -->
    <link href="vendor/font-awesome/css/font-awesome.min.css" rel="stylesheet" type="text/css">
    <link href='https://fonts.googleapis.com/css?family=Lora:400,700,400italic,700italic' rel='stylesheet' type='text/css'>
    <link href='https://fonts.googleapis.com/css?family=Open+Sans:300italic,400italic,600italic,700italic,800italic,400,300,600,700,800' rel='stylesheet' type='text/css'>

    <!-- Custom styles for this template -->
    <link href="css/clean-blog.min.css" rel="stylesheet">
    <link href="main.css" type="text/css" rel="stylesheet" />
  </head>

  <body>

    <!-- Navigation -->
    <nav class="navbar navbar-expand-lg navbar-light fixed-top" id="mainNav">
      <div class="container">
        <a class="navbar-brand" href="../logout.php">Logout</a>
        <button class="navbar-toggler navbar-toggler-right" type="button" data-toggle="collapse" data-target="#navbarResponsive" aria-controls="navbarResponsive" aria-expanded="false" aria-label="Toggle navigation">
          Menu                                      <!-- Right above this ^ comment was this code: data-toggle="collapse" #NeverForget-->
          <i class="fa fa-bars"></i>
        </button>
        <div  class="nav-link" id="navbarResponsive">
          <ul  class="navbar-nav ml-auto">
            <li class="nav-link" class="nav-item">
              <a  href="index2.php">Home</a>
            </li>
            <li class="nav-link" class="nav-item">
              <a  href="about.html">About</a>
            </li>
            <li class="nav-link" class="nav-item">
              <a  href="msgBoard.php">Posts</a>
            </li>
            <li class="nav-link" class="nav-item">
              <a  href="contact.html">Contact</a>
            </li>
          </ul>
        </div>
      </div>
    </nav>

    <!-- Page Header -->
    <header class="masthead" style="background-image: url('img/bible.jpg')">
      <div class="overlay"></div>
      <div class="container">
        <div class="row">
          <div class="col-lg-8 col-md-10 mx-auto">
            <div class="site-heading">
              <h1>Hi <?= $first_name ?>!</h1>
              <span class="subheading">Have Fun Exploring the Fellowship Wall</span>
            </div>
          </div>
        </div>
      </div>
    </header>

    <!-- Main Content -->
    <!-- <h1>Categories</h1>-->
    <style>
  body{
    background: tan;}
    </style>
    <!-- The above code is for the bacckground color on index2.php -->
          <hr>
          <!-- Pager -->
          <!--<div class="clearfix">
            <a class="btn btn-primary float-right" href="#">Older Posts &rarr;</a>
          </div>-->
        </div>
      </div>
    </div>
    <?php
  /*
   $select = mysqli_query($mysqli, "SELECT * FROM categories");
    while($row = mysqli_fetch_assoc($select)){
      echo  "<h1>", $row['category_title']."</h1>" ;
    }*/

    disptopics($_GET['cid'], $_GET['scid']);
    /*if (isset($_GET['cid'], $GET['scid'])){

      disptopics();
    }*/

     ?>
    <hr>

    <!-- Footer -->
    <footer>
      <div class="container">
        <div class="row">
          <div class="col-lg-8 col-md-10 mx-auto">
            <ul class="list-inline text-center">
              <li class="list-inline-item">
                <a href="#">
                  <span class="fa-stack fa-lg">
                    <i class="fa fa-circle fa-stack-2x"></i>
                    <i class="fa fa-twitter fa-stack-1x fa-inverse"></i>
                  </span>
                </a>
              </li>
              <li class="list-inline-item">
                <a href="#">
                  <span class="fa-stack fa-lg">
                    <i class="fa fa-circle fa-stack-2x"></i>
                    <i class="fa fa-facebook fa-stack-1x fa-inverse"></i>
                  </span>
                </a>
              </li>
            <!--  <li class="list-inline-item">
                <a href="#">
                  <span class="fa-stack fa-lg">
                    <i class="fa fa-circle fa-stack-2x"></i>
                    <i class="fa fa-github fa-stack-1x fa-inverse"></i>
                  </span>-->
                </a>
              </li>
            </ul>
            <p class="copyright text-muted">Copyright &copy; Your Website 2018</p>
          </div>
        </div>
      </div>
    </footer>

    <!-- Bootstrap core JavaScript -->
    <script src="vendor/jquery/jquery.min.js"></script>
    <script src="vendor/bootstrap/js/bootstrap.bundle.min.js"></script>

    <!-- Custom scripts for this template -->
    <script src="js/clean-blog.min.js"></script>

  </body>

</html>

下面是函数文件(content_function.php):

代码语言:javascript
复制
    <?php

  function dispcategories(){
    include ('../db.php');
    $select = mysqli_query($mysqli, "SELECT * FROM categories");

    while($row = mysqli_fetch_assoc($select)){
      echo "<table class = 'category-table'";
      echo "<tr><td class= 'main-category'colspan='2'>".$row['category_title']."</tr></td>";
      dispsubcategories($row['cat_id']);
      echo "</table>";
    }
  }

  function dispsubcategories($parent_id){
    include ('../db.php');
    $select = mysqli_query($mysqli, "SELECT cat_id, subcat_id, subcategory_title, subcategory_descr FROM categories, subcategories
                                     WHERE ($parent_id = categories.cat_id) AND ($parent_id = subcategories.parent_id)");
    echo "<tr><th width='90%'>Categories</th><th width='10%'>Topics</th></tr>";

    while($row = mysqli_fetch_assoc($select)){
      echo "<tr><td class='category_title'><a href='(A)Book 2.0/Bootstrap/topics.php/".$row['cat_id']."/".$row['subcat_id']."'>
                    ".$row['subcategory_title']."<br/>";
      echo $row['subcategory_descr']."</a></td>";
      echo "<td class='num-topics'>".getnumtopics($parent_id, $row['subcat_id'])."</td></tr>";
    }
  }
  //Displays categories
  function getnumtopics($cat_id, $subcat_id){
    include ('../db.php');
    $select = mysqli_query($mysqli, "SELECT category_id, subcategory_id FROM topics WHERE ".$cat_id." = category_id
                    AND ".$subcat_id." = subcategory_id");
$get = mysqli_num_rows($select);

return $get;
  }
  //Displays Topics Within categories
  function disptopics($cid, $scid){
    include ('../db.php');
    $select = mysqli_query($mysqli, "SELECT topic_id, author, title, date_posted, views, replies FROM categories, subcategories, topics
                                     WHERE ($cid = topics.category_id) AND ($scid = topics.subcategory_id) AND ($cid = categories.cat_id)
                                     AND ($scid = subcategories.subcat_id) ORDER BY topic_id DESC");


   if(mysqli_num_rows($select) != 0) {
      echo "<table class='topic-table'>";
      echo "<tr><th>Title</th><th>Posted By</th><th>Date Posted</th><th>Views</th><th>Replies</th></tr>";

      while($row = mysqli_fetch_assoc($select)){
        echo "<tr><td><a href='readtopic.php/".$cid."/".$scid."/".$row['topic_id']."'>
              ".$row['title']."</a></td><td>".$row['author']."</td><td>".$row['date-posted'].".</td><td>".$row['views']."</td>
              <td>".$row['replies']."</td></tr>";
      }
      echo "</table>";
    } else {
      echo "<p>This category has no topics yet! <a href='newtopic.php/".$cid."/".$scid."'> Add a new one!</a></p>";
    }

  }


?>

我已经找了好几天了,似乎找不到语法错误。也许我输入错了什么?我仍然是PHP的新手。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-17 03:44:56

这里有很多不好的地方。请不要刻薄地看待这一点,我们都需要学习,这是一个过程。我不知道我是否能具体回答你的问题,但我可以指出一些事情。

代码语言:javascript
复制
session_start();
include ('../db.php');
$first_name = $_SESSION['first_name'];
$last_name = $_SESSION['last_name'];
$email = $_SESSION['email'];
$active = $_SESSION['active'];

// Check if user is logged in using the session variable
if ( $_SESSION['logged_in'] != 1 ) {
  $_SESSION['message'] = "You must log in before viewing your profile page!";
  header("location: error.php");
}
else {
    // Makes it easier to read
    $first_name = $_SESSION['first_name'];
    $last_name = $_SESSION['last_name'];
    $email = $_SESSION['email'];
    $active = $_SESSION['active'];
}

核爆这个的上半部分:

代码语言:javascript
复制
session_start();
include ('../db.php');

// Check if user is logged in using the session variable
if ( $_SESSION['logged_in'] != 1 ) {
  $_SESSION['message'] = "You must log in before viewing your profile page!";
  header("location: error.php");
  exit; //<--- add this
}else {
    // Makes it easier to read
    $first_name = $_SESSION['first_name'];
    $last_name = $_SESSION['last_name'];
    $email = $_SESSION['email'];
    $active = $_SESSION['active'];
}

它是多余的,因为它下面的If。如果他们没有登录,你就重定向页面(这些都不再重要了),如果他们登录了,你就重新设置这些。始终在执行重定向后添加exit;作为标头并不一定会结束当前脚本的执行,而且可能会导致意外的事情发生。

在你的HTML中你有

代码语言:javascript
复制
<body>

<!-- Navigation -->
<nav class="navbar navbar-expand-lg navbar-light fixed-top" id="mainNav">

而不是在页面的后面部分

代码语言:javascript
复制
<style>
  body{background: tan;}
</style>

您应该将样式放在标签之前,最好放在页面的头部。我不确定这会导致什么问题,如果有的话,因为它可能取决于几件事,包括正在使用的浏览器。只是,根据页面的呈现方式,如果标签是第一个,它可能不会及时拾取样式以将其应用于标签。

对于函数,我不能肯定地说,因为我不能知道你项目的全部范围,但如果你只调用一次,就没有必要让它们成为函数,事实上,它会使事情变得复杂,因为它将逻辑从使用的地方移开。如果您确实要重用它们,您可以忽略其中的一部分。但一般来说,最好不要从独立于HTML的函数中回显HTML,这会使格式化HTML变得很困难,因为您必须同时打开这两个文件。在它被重用的情况下,您可能会在事先不知道的情况下修改它所使用的页面。最好先返回数据,然后再进行内联格式化。这也是主观的,因为它真的取决于如何在项目的大计划中完成。但需要注意的是。其中一些是基于代码的过程性质,但即使在使用类的面向对象编程(OOP)中,出于同样的原因,直接从类输出HTML也不是一个好主意。

连接。

代码语言:javascript
复制
function getnumtopics($cat_id, $subcat_id){
  include ('../db.php');

除了浪费处理能力和时间之外,您还创建了对该文件的硬依赖。如果您选择稍后替换该文件,则需要编辑大量代码。最好像在页面顶部那样include/require一次,然后在调用函数时将连接传递给函数。因此,不是这样:

代码语言:javascript
复制
      function getnumtopics($cat_id, $subcat_id){
         include ('../db.php');
         $select = mysqli_query($mysqli,  ...

做一些这样的事情

代码语言:javascript
复制
     function getnumtopics($cat_id, $subcat_id, $mysqli){
         $select = mysqli_query($mysqli,  ...

当你调用它的时候,你只需将它添加到调用中,前提是它包含在调用它的文件中。如果您不确定,并且需要在多个文件中使用它,那么您可以使用'require_once‘(稍后将对此进行更多介绍)。这导致的问题的一个例子。假设稍后您想要创建一个新的DB文件(无论出于什么原因,我都想不出一个,但这是可能的)。将该文件名备份到所有函数中后,您不能只在一个页面上测试它,而不修改该页面中使用的所有函数,其中一些函数可能会在其他页面上使用。所以你不得不搜索和替换文件名。这可能是一个不好的例子,但这是我现在能想到的最好的例子。由于几个原因,这只是一种糟糕的做法。

Require Vs只需要一次

文件1。

代码语言:javascript
复制
  require_once('../db.php');
  require_once('../file2.php');
  ....
  getnumtopics($cat_id, $subcat_id, $mysqli);

文件2。

代码语言:javascript
复制
  require_once('../db.php');
  ....
  dispsubcategories($cat_id, $subcat_id, $mysqli);

在本例中,File1需要DB,但File2也需要。但也许您也可以在不需要File2的File3中使用它:

文件3。

代码语言:javascript
复制
require_once('../file2.php');

在这种情况下,如果您只是需要它,而您应该要求不包含它。然后你在File1的情况下得到2个副本,在File3的情况下得到1个副本。您不能仅仅将它包含在File2中,因为File1也需要它。所以你可以使用_once,这确保了如果所有的东西都被包含了,你就不会再包含它了,但是如果它还没有被包含,它就会被包含进来(这在我看来更有意义)。

包括Vs请求

至于include vs require。如果文件丢失,Include不会抛出任何错误,而require将抛出任何错误。因此,您必须问自己,如果找不到文件x(要包含的文件),此脚本是否会正常工作。在这种情况下,答案是否定。因此,您应该将其设置为必需的。这将帮助您在文件丢失时调试错误。你可以把它移到大小写(大小写)很重要的Linux上,它在Windows上运行得很好,但现在它被打破了。这将帮助您告诉您所需的文件丢失,而不是因为无法连接到DB或在NULL资源上调用DB函数而得到一般错误。

Summery

至于它合并页面的原因,我不确定是不是因为没有调用exit,但我不能肯定,因为我没有详细研究过不调用exit的行为,我只知道你应该总是在重定向或奇怪的事情发生后调用它。

我也不能说这就是所有的错误,这只是我马上看到的,我会改变。

希望这能有所帮助。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51883708

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档