我很难找到解决方案。
我需要检查来自表单的输入数据$ 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());
}
大大欣赏任何想法!
答案 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