检查mysql条目是否退出,然后DELETE


Check if mysql entry exits then DELETE

我在寻找解决方案时有点卡住了。

我需要检查从表单输入数据$coupon(在"post"动作之后)是否等于现有MySQL表中称为Serial的数据,在行$coupon中。如果这两个条目匹配,我需要一个表"串行"删除(删除)。在另一种情况下,我需要显示一个错误,可能像echo"您输入的优惠券号码无效"。

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

$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());
}

非常感谢任何意见!

您已经为自己创建了一个竞争条件。当你运行SELECT语句时优惠券存在并不意味着当你运行delete语句时它也会存在,特别是当这是一个web应用程序,或者多线程/多进程时。

DELETE语句从tbl_name中删除行,并返回删除行数的计数。该计数可以通过调用ROW_COUNT()函数获得。

无条件地运行DELETE,然后使用ROW_COUNT来查看它是否在那里并被删除或从未在那里。

首先淘汰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';
}

你可以直接写SELECT 1 FROM serial...

:

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

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


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

接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.phphttp://dev.mysql.com/doc/refman/5.5/en/information-functions.html function_row-count