0

我有点陷入寻找解决方案的困境。

我需要检查表单中的输入数据 $coupon(在“发布”操作之后)是否等于 $Coupon 行中名为 Serial 的现有 MySQL 表中的数据。如果这两个条目匹配,我需要删除表“Serial”中的那个(删除自)。在另一种情况下,我需要显示一个错误,例如回显“您输入的优惠券号码无效”。

现在我有以下代码,但它不做检查。

$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 语句时存在这一事实并不意味着它在您运行 delete 语句时也会存在,特别是如果这是一个 Web 应用程序,或多线程/多进程。

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'; 
 }

或更简单地在一个查询中:

$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

你实际上可以做SELECT 1 FROM serial...

然后:

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

如果它返回一行,你就知道它存在。您还可以添加LIMIT 1到查询中以使其更快。


顺便说一句,你的代码很容易被注入。您应该对 PDO 或 mysqli 使用正确的参数化查询。

于 2013-03-19T20:40:13.700 回答
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 回答