【发布时间】: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。看看它是否在该页面中幸存下来。