【问题标题】:Call to member function on a non-object (include database.php)调用非对象的成员函数(包括 database.php)
【发布时间】:2016-08-06 19:12:47
【问题描述】:

我正在开发一个新网站,我为新网站重写了一些以前工作的代码,以重新创建登录系统。不幸的是,重写的版本不起作用,所以让我解释一下发生了什么。

我有“index.php”,其中包含每个页面上使用的“titlemenu.php”。我打算在这个标题菜单(顶部栏)中运行登录框,这样人们就可以登录,不管他们自己的页面是什么,当他们成功登录时,它会刷新他们当前所在的页面,以便他们登录。

到目前为止,宾果游戏 - 它有效。他们已登录并仅查看会员页面。但是,标题栏是另一回事。尽管已登录,但它仍然显示“登录”和“注册”。我立即认为这是该特定 php 文件的问题,所以我只登录该 php,绕过 index.php 文件。当我尝试仅在该空白页面上登录时,我得到: 致命错误:在第 18 行调用非成员函数 prepare() 我知道这通常意味着您的变量未声明或未运行,因此我决定对其进行故障排除。我对我使用的每个变量都做了一个 var_dump,它返回了有效的结果。我检查了 index.php,它没有错误并且运行良好,并显示用户已登录。“欢迎回来,RhapidFyre!”是它在索引上说的,但是登录框显示我还没有登录。

loginheader.php

    <?include "641a/database.php";?><div id="login"><?
$mydbid = $_SESSION['user'];
$myquery = "SELECT * FROM logins WHERE dbid = $mydbid";
$myrow = mysqli_fetch_assoc($myquery);
$myname = $myrow['nickname'];

if($_GET['do'] == "logout") {
    unset($_SESSION['user']);
    ?><script type="text/javascript">
    window.location.replace("index.php");
    </script><?
}
if($_GET['do'] == 'login') {
            $query = 'SELECT * FROM logins WHERE username = :username';
            $query_params = array(':username' => $_POST['username']);

            var_dump($query);
            var_dump($query_params);
            try                                          
            {                                            
                $stmt = $db->prepare($query); //LINE 18              
                $result = $stmt->execute($query_params);   
            }                                            
            catch(PDOException $ex)                       
            {
                ?><script type="text/javascript">
                window.location.replace("redirect.php?error=username");
                </script><?
            }(Further irrelevant code follows)

database.php

<?  session_start();
$dbusername = "********";
$dbpassword = "********";
$dbhost = "localhost";
$dbname = "********";
$link = mysqli_connect($dbhost, $dbusername, $dbpassword, $dbname);

// PDO Initialization
try {
    $db = new PDO("mysql:host={$dbhost};dbname={$dbname};charset=utf8", $dbusername, $dbpassword); 
}

// If connection fails, die.
catch(PDOException $ex){
    die("Failed to connect to the MySQL Server!" . $ex->getMessage());
}

index.php 片段

<html>
<head>

    <title>My Website Template</title>
    <link rel="stylesheet" type="text/css" href="base.css"/>
</head>
<body>
    <div id="header">
        <?include "pages/titles.php";?>
        <?include "pages/loginheader.php";?>
    </div>

【问题讨论】:

  • 在这种情况下$db 为假,这通常意味着您的连接不工作。如果它会说undefined variable db,那是因为没有找到它。 $db 应该是一个 PDO 实例。
  • 为什么你有一个 mysqli_PDO 连接是出于好奇?
  • 我很好奇 $db 是如何返回 false 的。文件开头包含“database.php”。我将更新我的主要帖子以反映这一点。我会研究为什么它会是假的。
  • 疑难解答。当我真正开始工作时,我会将所有内容都转换为 PDO。
  • 哦,我明白了!好的,在您的 index.php 上,在包含 print_r($db); 之后。看看那里是不是PDO。看看它是否在该页面中幸存下来。

标签: php mysql mysqli pdo


【解决方案1】:

问题源于在尝试调试时使用了两种连接类型。将其全部更改为 MySQLi,它运行良好,但产生了新问题。正如我的编程老师常说的,“耶!新错误!”

【讨论】:

    猜你喜欢
    • 2012-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多