0

ニュースレターを購読しているユーザーの確認を扱う Web サイトの一部を作成しています。

データを選択するときの準備済みステートメントの使用法に問題があります。

これは基本的に、電子メールでユーザーに送信され、入力された 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返しますが、空を返します

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

1 に答える 1

1

$stmt->fetch()プロパティが現在の行のフィールドであるオブジェクトではなく、成功したかどうかを示すブール値を返すだけです。$stmt->bind_result()フィールドを配置する変数を指定するには、 を呼び出す必要があります。

fetch()2番目の編集で採用されたアプローチは、ユーザーがデータベースにいるかどうかのテストが onである必要があることを除いて、良さ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 に答える