我在寻找解决方案时有点卡住了。
我需要检查从表单输入数据$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