0

私は解決策を探すのに行き詰まっています。

フォームからの入力データ $coupon ("post" アクションの後) が、Serial という名前の既存の MySQL テーブルの行 $Coupon のデータと等しいかどうかを確認する必要があります。これらの2つのエントリが一致する場合、テーブル「シリアル」のエントリを削除する必要があります(DELETED From)。それ以外の場合は、「入力したクーポン番号は無効です」などのエラーを表示する必要があります。

今、私は次のコードを持っていますが、チェックを行いません。

$query4="SELECT EXISTS(SELECT 1 FROM serial WHERE Coupon='$coupon')";
$result = mysql_query($query4);

if($result){
    echo "Bravo!";
}
else{
    "The coupon number you've entered is invalid";
    exit;
}
// Delete data from mysql
$query2="DELETE FROM serial WHERE Coupon = '$coupon'";
$result = mysql_query($query2); 

// if successfully insert data into database, displays message "Successful".
if($result){
echo "Some info";
}
else {
die(mysql_error());
}

どんなアイデアでも大歓迎です!

4

4 に答える 4

1

自分で競合状態を作成しました。SELECT ステートメントを実行したときにクーポンが存在するという事実は、特にこれが Web アプリまたはマルチスレッド/マルチプロセスである場合、delete ステートメントを実行したときにクーポンが存在することを意味しません。

DELETE ステートメントは tbl_name から行を削除し、削除された行数のカウントを返します。このカウントは、ROW_COUNT() 関数を呼び出すことで取得できます。

無条件に DELETE を実行し、ROW_COUNT を使用して、そこに存在し、削除されたか、存在しなかったかを確認します。

于 2013-03-19T20:51:10.137 に答える
0

まず、mysql_ *機能を段階的に廃止するか、結果を確認するよりも大きな問題が発生します。コードはSQLインジェクションに対して脆弱です。代わりにPDOまたはMySQLiを使用してください。

次に、最初のクエリでEXISTSが必要なのはなぜですか。

PDOのソリューションは次のとおりです。

 $query = 'SELECT 1 FROM serial WHERE Coupon = :coupon';
 $stmt = PDO->prepare($query);
 $stmt->bindParam(':coupon', $coupon, DB::PARAM_STR);
 $stmt->execute();
 if ($stmt->rowCount() > 0) {
    //query 2
    $query2 = "DELETE FROM serial WHERE Coupon = :coupon";
    $stmt2 = PDO->prepare($query2);
    $stmt2->bindParam(':coupon', $coupon, DB::PARAM_STR);
    if ($stmt2->execute()) {
       echo 'Success';
    } else {
       echo 'Unable to Delete';
    }
 } else {
    echo 'Selected Coupon Is Invalid'; 
 }

1つのクエリでより簡単に:

$query = 'DELETE FROM serial WHERE coupon = :coupon';
$stmt = PDO->prepare($query);
$stmt->bindParam(':coupon', $coupon, DB::PARAM_STR);
if ($stmt->execute()) {
  echo 'Success';
} else {
  echo 'failure, invalid coupon';
}
于 2013-03-19T20:42:19.477 に答える
0

mluebke の回答からのフォローアップ:

// Delete data from mysql
$query="DELETE FROM serial WHERE Coupon = '$coupon'";
mysql_query($query); 

//Did we delete something?
if (mysql_affected_rows()) {
  echo "Bravo!";
}
else{
    "The coupon number you've entered is invalid";
    exit;
}

http://www.php.net/manual/en/function.mysql-affected-rows.php http://dev.mysql.com/doc/refman/5.5/en/information-functions.html#function_row-count

于 2013-08-20T21:38:09.450 に答える
0

あなたは実際にただ行うことができますSELECT 1 FROM serial...

それで:

$result = mysql_query($query4);
if (mysql_num_rows($result)) {

行が返された場合、その行が存在することがわかります。LIMIT 1クエリを高速化するために追加することもできます。


ところで、あなたのコードはインジェクションに対して脆弱です。PDO または mysqli で適切にパラメータ化されたクエリを使用する必要があります。

于 2013-03-19T20:40:13.700 に答える