【问题标题】:Searching through a database with PHP - Session already started [duplicate]使用 PHP 搜索数据库 - 会话已经开始 [重复]
【发布时间】:2016-01-05 16:58:34
【问题描述】:

我开发了一个简单的搜索页面,但似乎无法正常工作。我面临两个问题,我认为这是相关的。当我进入搜索表单页面时,错误:

注意:未定义索引:用户在第 36 行登录 header.php 注意:未定义索引:在第 59 行管理登录 header.php`

当使用有效测试数据使用搜索表单时,会显示这些错误:

注意:会话已经开始 - 忽略第 3 行 header.php 中的 session_start() 注意:未定义索引:用户登录第 36 行 header.php 注意:未定义索引:管理登录第 59 行 header.php mysqli_stmt::bind_result():绑定变量的数量与第 12 行 search.php 中准备好的语句中的字段数量不匹配

我不会发布 header.php,因为我认为这是因为 bind_result,但是我不确定我是怎么做错的。

我已尝试从 header.php 中删除 session_start(),因此它不会自动包含在内,但这只会引发此错误:

注意:未定义变量:第 36 行 header.php 中的 _SESSION 注意:未定义变量:第 59 行 header.php 中的_SESSION

Searchform.php

<?php

    ob_start();
    error_reporting(E_ALL);

?>

<br><br><br>

<?php

    ini_set('display_errors', -1);
    include 'header.php';
    include 'connection.php';

?>

<br /><br />

<html>
    <header>
        <link rel="stylesheet" type="text/css" href="web.css" />    
        <link rel="stylesheet" type="text/css" href="/web.css" />
    </header>
    <body>
        <center>
            <h2>Search for people</h2>
            <br />

            Please enter the name you wish to search for<br /><br />

            <form method="post" action="search.php" id="searchform">
                <input  type="text" name="name"> 
                <input  type="submit" name="searchsubmit" value="Submit"> 
            </form>

            <br /><br/>

            Or search people by category

        </center>                  
    </body>
</html>

Search.php

<?php

    if(isset($_POST['searchsubmit']))
    {
        include 'searchform.php';
        include 'header.php';

        $name = $_POST['name'];

        if ($stmt = $connection->prepare ("SELECT * FROM users WHERE Username = ?")) 
        {
            $stmt->bind_param('s', $name);
            $stmt->execute();
            $stmt->bind_result($personresult);
            $stmt->fetch();
            print_r($personresult);
        } 
        else
        { 
            echo "<p>Please enter a search query</p>"; 
        } 
    }
    else 
    {
         echo "NOT SET!";
    }

?>

【问题讨论】:

  • 你必须在每一页上开始你的会话。
  • 在 session_start 之前不能有任何输出,这意味着三个中断必须在 包含之后。
  • @ChrisG 这是一个误导性的评论,因为每次客户端从服务器请求时,是的,每次都需要启动一个会话。不过,您不需要在您使用的每个包含的脚本上启动它。

标签: php sql search


【解决方案1】:

在不知道您的数据库中的列是什么的情况下,我只能对您在bind_result 上做错了什么给出部分回应。

但在此之前,您将遇到会话和标题内容的问题,因为您要显示所有通知。我建议在请求的页面上启动它,而不是你的包含。因此,在您启动脚本后,立即拨打session_start(),不要在其他任何地方拨打电话。请注意,它必须在任何输出之前。

现在,为bind_result。错误消息告诉您的是,您从表中选择的不仅仅是一列。即,您可能正在选择useridunamerealname 等。但是当您绑定结果时,您只为其中一个留出了空间。所以一个基本的例子来展示你的关系,我会稍微修改你的选择:

$stmt = $connection->prepare ("SELECT userId, userName, realName FROM users WHERE Username = ?")

然后当你绑定你的结果时,你会想要做这样的事情:

$stmt->bind_result($userId, $userName, $realName);

对于您在语句中选择的每一列,您需要一个变量来在您的bind_result 调用中表示它。

【讨论】:

  • 谢谢,这确实解决了会话错误,但它仍然显示 注意:未定义的索引:第 36 行的 header.php 中的用户登录 注意:未定义的索引:管理员登录,但是登录到用户和管理员帐户工作,所以我不明白这些是未定义的索引。
  • 我将再次检查我的 bind_result - 感谢您的快速回复
  • @MattMurphy 它们是未定义的,因为它们在注销时被销毁/删除。只需添加一个isset 即可在检查以删除某人未登录时的通知。^^(如果我读到有人登录时您不再收到它...否则,您不会设置正确的会话变量。^^)
  • 是的,我刚刚检查过了,登录后就可以使用了!没试过那么傻哈哈!我现在要做一个 isset,谢谢乔恩,我会选择你的答案:)
  • 太棒了,很高兴会议的东西得到了解决。 bind_result“信息”(因为我无法在不知道列的情况下将其形成为您的确切问题)解决了另一个问题吗? ^^
猜你喜欢
  • 2019-09-16
  • 2012-05-25
  • 2018-12-25
  • 2012-11-25
  • 2023-03-23
  • 2011-09-09
相关资源
最近更新 更多