我正在创建一个网站的一部分,用于确认订阅简报的用户。
在选择数据时,我在使用预准备语句时遇到问题。
这基本上是对通过电子邮件发送给用户的信息进行检查,并通过从输入的网址获取信息来检索。
所以有一个字符串或'键'在数据库中,通过电子邮件发送给用户,作为我网站上页面的链接,用户详细信息附加到网址。脚本检查这些键是否匹配
问题是当我运行脚本时会触发错误。这表示"错误的键"。
数据库中的密钥($dbkey
)与电子邮件链接中提供的密钥相同。这与$key
中的密钥相同。但问题是,在while循环中,正在触发错误并且$dbkey
没有从数据库传递数据:
Notice: Trying to get property of non-object in C:\wamp\www\site\script.php on line 35
在phpmyadmin中运行时的sql语句会返回正确的结果集。
以下是代码:
$confirm= sanitize($_GET['confirm']);
$stmt = $link->prepare("SELECT id, dbkey FROM specials WHERE id = ?");
if (!$stmt)
{
$error = "{$link->errno} : {$link->error}";
include "$docRoot/html/main/error.html.php";
exit();
}
if (!$stmt->bind_param("i", $confirm))
{
$error = "{$stmt->errno} : {$stmt->error}";
include "$docRoot/html/main/error.html.php";
exit();
}
if (!$stmt->execute())
{
$error = "{$stmt->errno} : {$stmt->error}";
include "$docRoot/html/main/error.html.php";
exit();
}
$stmt->store_result();
if ($stmt->num_rows)
{
while ($row = $stmt->fetch())
{
$dbKey = $row->dbkey;
}
$key= sanitize($_GET['key']);
if ($dbKey !== $key)
{
echo 'wrong key';
}
}
else
{
echo 'not in database';
}
我想说以这种方式连接到数据库的所有其他脚本都可以工作,但这是我第一次使用预准备语句来选择数据。我想知道这个问题是否是由我的编码错误引起的,因此我发布了这个问题的原因。
如果有人能够发现我在这里出错的地方,或者可能提供一些关于如何调试代码的建议,看看错误是什么,将非常感谢!
谢谢!
编辑:问题只是$key
返回一个字符串但$dbkey
返回空
EDIT2:
if ($stmt = $link->prepare("SELECT id, verified, dbkey FROM specials WHERE id=?")) {
$stmt->bind_param("i", $confirm);
$stmt->execute();
$stmt->bind_result($dbId, $dbVerified, $dbKey);
$stmt->fetch();
$stmt->close();
if ($dbKey !== $key)
{
echo 'wrong key';
}
else if ($dbVerified == 1)
{
echo 'already activated';
}
else if ($dbKey == $key && dbVerified == 0)
{
echo 'success';
}
}
else
}
echo 'user not in db';
}
答案 0 :(得分:1)
$stmt->fetch()
只返回一个布尔值,指示它是否成功,而不是一个属性是当前行的字段的对象。您需要调用$stmt->bind_result()
来指定要放置字段的变量。
在第二次编辑中采用的方法看起来不错,但用户是否在数据库中的测试应该在fetch()
上,而不是prepare()
(或者使用num_rows
作为你以前)。因此:
if ($stmt = $link->prepare("SELECT id, verified, dbkey FROM specials WHERE id=?"))
{
$stmt->bind_param("i", $confirm);
$stmt->execute();
$stmt->bind_result($dbId, $dbVerified, $dbKey);
if ($stmt->fetch())
{
if ($dbVerified == 1)
{
echo 'already activated';
}
else if ($dbKey !== $key)
{
echo 'wrong key';
}
else if ($dbKey == $key && dbVerified == 0)
{
echo 'success';
}
}
else
}
echo 'user not in db';
}
$stmt->close();
}