2013-03-19 56 views
0

我是一种陷入寻找解决方案的人。检查mysql入口是否退出然后删除

我需要检查表单中的输入数据$优惠券(在“post”动作之后)是否等于现有MySQL表中名为Serial的数据,在$ Coupon行中。如果这两个条目相匹配,我需要将表格“串行”中的一个删除(DELETED From)。在另一种情况下,我需要显示一个错误,可能像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()); 
} 

大大赞赏任何想法!

回答

0

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

然后:

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

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


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

+0

'如果(mysql_num_rows($结果)'返回一个语法错误,接下来会发生什么 – user2188208 2013-03-20 11:38:25

+0

@ user2188208哎呀,我缺少一个右paren。再试一次 – 2013-03-20 13:11:17

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

你为什么要强调这个问题的准备陈述?如果您仅将它们用于注射预防,则预备的陈述会带来相当多的开销。如果您不打算重复使用具有多组参数的查询,请不要使用预准备语句。 – mluebke 2013-03-19 20:54:29

+0

我试图演示PDO如何工作,以便他不使用mysql_ *函数。无论如何,上述解决方案都可以回答用户提出的问题。 – GGio 2013-03-19 21:19:41

+0

该解决方案听起来很有希望,但是 - '$ stmt = PDO-> prepare($ query)'返回语法错误'语法错误,意外的T_OBJECT_OPERATOR'。纯文本\粘贴不起作用。我做错了什么? – user2188208 2013-03-20 10:53:51

1

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

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

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