0

このクエリが機能していませんが、それが何であるかわかりません。メールでアクティブなスクリプトを書いています。これはURLです。

http://www.example.com/activate.php?id=1&h=secretkey1

これはどのようactivate.phpに見えるかです。

<?php
require "inc/connect.php";

$id = (int)$_GET['id'];
$hash = mysql_real_escape_string($_GET['h']);

$sql = mysql_query("SELECT id, h, active FROM tablename WHERE id=$id AND key=$hash") or die(mysql_error());  
$row = mysql_fetch_array($sql);

if ($row['active'] == "1") {
    echo "error!";
}
elseif ($row['active'] == "0") {
    mysql_query("UPDATE tablename SET active=1 WHERE id='$id' AND key='$hash'");
}
?>

これは私が得るエラーです。

SQL構文にエラーがあります。1行目の「key=secretkey1」の近くで使用する正しい構文については、MySQLサーバーのバージョンに対応するマニュアルを確認してください。

私のデータベースには、テストフィールドがtablenameあります。

id /    key    / active
------------------
1 / secretkey1 / 0
4

2 に答える 2

3

2つの理由:

1)文字列であり、文字列は一重引用符で囲む必要があるため、secretkey1(内部を$hash)一重引用符で囲む必要があるためです。$id整数にキャストしているので、引用符で囲む必要はありません。

2)KEYMySQLの予約キーワードであり、テーブル名または列名として使用するには、バッククォートで囲む必要があります。

$sql = mysql_query("SELECT id, h, active FROM tablename WHERE id=$id AND `key`='$hash'") or die(mysql_error()); 

id, h, activeまた、クエリで選択しているが、サンプルテーブルには、keyではなく、という名前の列があることにも注意してくださいh(その列が表示されない場合を除く)。

于 2012-07-27T13:24:15.043 に答える
2

あなたはこれを持っています:

 key=$hash

それは次のようになります。

 key='$hash'

ちなみに、SQLインジェクション攻撃を防ぐために、可能な限りパラメータ化されたクエリを使用してください。

PDOを使用する:

PHPでSQLインジェクションを防ぐにはどうすればよいですか?

PDOのプリペアドステートメントはSQLインジェクションを防ぐのに十分ですか?

于 2012-07-27T13:24:10.153 に答える