1

私は現在、ユーザーがランダム コードを受け取り、それを使用してダウンロード用の mp3 にアクセスし、最大 3 回ダウンロードできるダウンロード プラットフォームの構築に取り組んでいます。Python を使用してランダム コードのリストを生成し、関連付けられた電子メール アドレス用の空の列と使用回数用の既定の 0 を持つ SQL テーブルにそれらをインポートしました。メールを特定のコードに関連付けてカウントを追加し、ダウンロードに最大 3 回アクセスできるようにするために、次の PHP スクリプトを作成しました。

$email = $_POST["email"];
$email = stripslashes($email);
$uniqueCode = $_POST["uniqueCode"];
$uniqueCode = stripslashes($uniqueCode);

// check that all fields are filled
if($uniqueCode=="" || $email=="")
    apologize("Please fill out all fields.");

// check to make sure that the e-mail is valid
if (verifyEmail($email) == FALSE)
    apologize("Please enter a valid e-mail address.");

// check if uniqueCode input is alphanumeric 
if (verifyCode($uniqueCode) == FALSE)
    apologize("Download codes are alphanumeric.");

// check to see if unique code is correct 
$sql = mysql_query("SELECT * FROM wd009 where uniqueCode='$uniqueCode'");
$result = mysql_fetch_array($sql); 

if($sql==FALSE)
{
    apologize("Your download code is invalid. Please try again");
}
// only allow users with less than 3 downloads to proceed
else if ($result['count'] <= 3) {
        if ($result['email'] == ""){
            mysql_query("UPDATE wd009 SET email='$email', count=1 WHERE uniqueCode='$uniqueCode'");
            apologize("added email"); 
            }
        else if ($result['email'] != $email)
            apologize("different email from record!!"); 
        else if ($result['email'] == $email){
            mysql_query("UPDATE wd009 SET count=count+1 WHERE uniqueCode='$uniqueCode'");
            apologize("updated the count!"); 

}
else 
    apologize("Your download code is used up!"); 

明らかに、コードに含まれていない上記の関数をいくつか使用していますが、それらすべてをチェックしましたが、MySQL クエリに干渉するものはありません。謝罪の直後に、謝罪()が終了することに注意してください。フォームに正しいコードを入力すると、正しく機能し、SQL データベースが更新されます。ただし、ダウンロード コードの入力が英数字である限り、文字列が表のいずれとも一致しない場合でも、フォームはそれを受け入れます。つまり、mysql_query は入力に関係なくリソースを返します。データベース接続を確認しましたが、ダウンロードコードが正しければテーブルが正しく更新されるので問題ないようです。

私は考えられるあらゆる方法でこれをデバッグしようとしましたが、本当に困惑しています。あなたが提供できるどんな助けも大歓迎です!

4

3 に答える 3

1

マニュアルでわかるように、 はmysql_query常に有効なクエリのリソースを返すため、ロジックを変更して、 の結果ではなく、返される行数をカウントする必要がありますmysql_query

それとは別にmysql_query、 は非推奨であり、mysqli または PDO を使用する必要があります。

mysql_num_rows同様に非推奨の関数で行数を数えることができます。あなたの場合、0行は有効なコードではありません。

于 2012-06-19T01:19:28.227 に答える
0

これ

if($sql==FALSE)

おそらく次のようなものになるはずです

if(mysql_num_rows($sql) == 0)

編集:同意します。現在、mysqliまたはPDOが推奨されています。

于 2012-06-19T01:20:54.643 に答える
0

問題はおそらく次の行です。

if($sql==FALSE)
{
    apologize("Your download code is invalid. Please try again");
}

SQLは文字列であるため、受け入れているのはtrueであり、有効として渡しています。SQL インジェクションを回避するために実行したいことの 1 つは、ユーザー入力を直接インジェクトする代わりにパラメーターを使用することです。

$sql = mysql_query("SELECT * FROM wd009 where uniqueCode='$uniqueCode'");    

代わりに、次のようにします。

$stmt = $mysqli->prepare("SELECT * FROM wd009 where uniqueCode=?");
$stmt->bind_param($uniqueCode);
$stmt->execute();

while ($stmt->fetch()) {
   .....

update ステートメントについても、この方法で行いたいと思うでしょう。

そのテーブルに大量のデータがある場合は、SQL ステートメントで返される列を制限して、データベースの負荷を軽減することができます。

于 2012-06-19T03:16:32.097 に答える