PHP / MySQL - 准备好的语句 - 本例中的用法是否正确?

时间:2012-06-29 10:12:22

标签: php mysql

我正在创建一个网站的一部分,用于确认订阅简报的用户。

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

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

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

问题是当我运行脚本时会触发错误。这表示"错误的键"。

数据库中的密钥($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';
}

1 个答案:

答案 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();
}