0

我正在创建网站的一部分,用于处理订阅时事通讯的用户确认。

选择数据时,我在使用准备好的语句时遇到问题。

这基本上是对通过电子邮件发送给用户并通过从输入的 url 获取信息进行检索的信息进行检查。

因此,数据库中有一个字符串或“键”,它通过电子邮件发送给用户,作为我网站上一个页面的链接,用户的详细信息附加到 url。脚本检查这些键是否匹配

问题是当我运行脚本时会触发错误。这说“错误的钥匙”。

数据库中的密钥 ( $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返回空

编辑2:

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';
}
4

1 回答 1

1

$stmt->fetch()只返回一个布尔值,指示它是否成功,而不是其属性是当前行的字段的对象。您需要调用$stmt->bind_result()以指定要将字段放置到哪些变量中。

在您的第二次编辑中采用的方法看起来不错,除了用户是否在数据库中的测试应该是 on 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();
}
于 2012-06-30T07:06:21.350 回答