Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/237.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 检查mysql入口是否存在,然后删除_Php_Mysql_Forms_Post - Fatal编程技术网

Php 检查mysql入口是否存在,然后删除

Php 检查mysql入口是否存在,然后删除,php,mysql,forms,post,Php,Mysql,Forms,Post,我一直在寻找解决办法 我需要检查表单中的输入数据$优惠券(在“post”操作之后)是否等于现有MySQL表中名为Serial的行$优惠券中的数据。如果这两个条目匹配,我需要删除表“Serial”中的条目(从中删除)。在另一种情况下,我需要显示一个错误,可能像echo“您输入的优惠券号码无效” 现在我有了下面的代码,但它没有进行检查 $query4="SELECT EXISTS(SELECT 1 FROM serial WHERE Coupon='$coupon')"; $result = mys

我一直在寻找解决办法

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

非常感谢任何想法

您实际上只需执行
从序列中选择1…

然后:

如果它返回一行,您就知道它存在。您还可以向查询中添加
LIMIT 1
,以加快查询速度



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

首先,逐步淘汰mysql*功能,否则您会遇到比检查结果更大的问题。您的代码易受SQL注入的攻击。改用PDO或MySQLi

其次,为什么在第一个查询中需要存在

以下是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语句时优惠券存在的事实并不意味着当您运行delete语句时优惠券将存在,特别是当这是一个web应用程序或多线程/多进程时

DELETE语句从tbl_名称中删除行,并返回已删除行数的计数。此计数可以通过调用ROW_count()函数获得


无条件运行删除,然后使用行计数查看它是否存在并被删除或从未存在。

根据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;
}

你为什么要就这个问题发表事先准备好的声明?如果您仅将准备好的语句用于预防注射,那么它们会带来相当大的开销。如果您不打算使用多组参数重用查询,请不要使用prepared语句。我试图演示PDO是如何工作的,这样他就不会使用mysql_*函数。在任何情况下,上述解决方案都回答了用户提出的问题。该解决方案听起来很有希望,但是-
$stmt=PDO->prepare($query)
返回语法错误
语法错误,意外的T\u OBJECT\u操作符
。纯拷贝\粘贴不起作用。我做错了什么?
如果(mysql_num_rows($result)
返回语法错误。下一步是什么?@user2188208 oops,我缺少结束参数。请重试
// 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;
}