-1

ここに私のコードのスニペットがあります:

    require_once('functions.php');
    include('dbinfo.php');
    connectdb();


$querys= "SELECT 'score' FROM solve WHERE (problem_id='".$_GET['id']."' AND username='".$_SESSION['username']."')";
            $resultscore=mysql_query($querys);
            $scorefetch=mysql_fetch_array($resultscore);
            $subractscore=$scorefetch['score'];
echo $subractscore;

理想的には、出力はデータベースのスコア フィールドに格納されている値である必要があります。

スコア

' .. これのどこが間違っているのでしょうか?また、クエリの結果は一度に 1 つのレコードのみになります。

4

1 に答える 1

7

クエリが期待どおりに機能しない理由は、列名を一重引用符で囲んでいるためです。それら(列名とテーブル名)は識別子であり、文字列リテラルではないため、単一引用符で囲むべきではありません。

SELECT score FROM solve WHERE....

使用されている列名やテーブル名が予約済みのキーワードである場合は、単一引用符ではなくバッククォートでエスケープできます。

この場合、予約済みのキーワードではないため、バッククォートは必要ありません。


補足として、変数のSQL Injection値が外部から取得された場合、クエリは脆弱です。予防方法については、以下の記事をご覧ください。を使用すると、値を一重引用符で囲む必要がなくなります。PreparedStatements

于 2013-05-09T13:52:01.207 に答える