检查mysql条目是否存在然后删除

时间:2013-03-19 20:30:33

标签: php mysql forms post

我很难找到解决方案。

我需要检查来自表单的输入数据$ coupon(在“post”操作之后)是否等于$ Coupon行中现有MySQL表中的数据。如果这两个条目匹配,我需要删除表“Serial”中的一个(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 个答案:

答案 0 :(得分:1)

你为自己创造了一个竞争条件。运行SELECT语句时优惠券存在的事实并不意味着当您运行delete语句时它将存在,特别是如果这是一个Web应用程序,或多线程/多进程。

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

无条件地运行DELETE,然后使用ROW_COUNT查看它是否存在并被删除或者不存在。

答案 1 :(得分:0)

您实际上可以SELECT 1 FROM serial...

然后:

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

如果它返回一行,则表示它存在。您还可以向查询添加LIMIT 1以加快查询速度。


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

答案 2 :(得分: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';
}

答案 3 :(得分: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