ニュースレターを購読しているユーザーの確認を扱う 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';
}