php - fatal error : Uncaught PDO Exception: SQLSTATE[42000] Syntax Error or Access Vilation

标签 php mysql sql database pdo

我正在实现一个简单的代码来检查一封电子邮件是否已在我的数据库中以及是否正在从数据库中删除它。但是,我收到此错误消息:

Fatal error: Uncaught PDOException: SQLSTATE[42000]: Syntax error or access
violation: 1064 You have an error in your SQL syntax; check the manual that 
corresponds to your MySQL server version for the right syntax to use near 
'@gmail.com' at line 1 in /home/saintpao/public_html/deleteNewsletter.php:24 Stack 
trace: #0 /home/saintpao/public_html/deleteNewsletter.php(24): 
PDOStatement->execute() #1 {main} thrown in /home/saintpao/public_html
/deleteNewsletter.php on line 24

这是conectar.php 文件

$dbhost = "myHost";
$dbuser = "myUser";
$dbpass = "myPassword";
$dbname = "myDBName";
try {
    $db = new PDO("mysql:host=$dbhost;dbname=$dbname", $dbuser, $dbpass,  
                  array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'UTF8'"));
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}catch(Exception $error) {
    die("Error conexión BBDD " . $error->getMessage());
}   

这是deleteNewsletter.php 文件:

function sanitazeEmail($email){
   if(empty($email)){
       return "";
   }
   $sanitized = filter_var($email, FILTER_SANITIZE_EMAIL);
   if(filter_var($sanitized, FILTER_VALIDATE_EMAIL)){
       return $sanitized;
   }
   return "";
}

$success = false;
$email = sanitazeEmail($_POST['email']);

if(!empty($email)){
    require_once 'conectar.php';

    $sql = "SELECT `email` FROM `emails` WHERE `email` = " . $email;
    $statement = $db->prepare($sql);

    if($statement->execute()){
        $sql_delete = "DELETE FROM `emails` WHERE `email` =" . $email;
        $statement = $db->prepare($sql_delete);
        $success = $statement->execute();
    }
}

与数据库的连接有效,因为我可以在其他文件中进行 SELECT 请求,所以这一定是 deleteNewsletter.php 文件的问题。知道出了什么问题吗?

最佳答案

您的错误是电子邮件是一个字符串,应该加引号。但是,您正在使用 PDO,并且可以使用准备好的语句来避免此类错误:

$sql_delete = "DELETE FROM `emails` WHERE `email` = :email";
$statement = $db->prepare($sql_delete);
$sucess = $statement->execute([':email' => $email]);

请注意,您的 select 查询并不是真正有用,您可以只执行 delete 查询。请注意,$statement->execute() 返回一条语句,而不是结果。

正如 @NigelRen 指出的,您可以使用 $statement->rowCount() 来检查行是否被删除。

关于php - fatal error : Uncaught PDO Exception: SQLSTATE[42000] Syntax Error or Access Vilation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50319876/

相关文章:

sql - 将分隔字符串分解为临时表

javascript - 单击一个更新按钮保存所有文本字段

php - Laravel 4.2 查询生成器无法正常工作

mysql - 我可以将事务与 ALTER TABLE 一起使用吗?

php - 我们可以在同一页面的另一种表单中使用来自一种表单的用户输入数据吗

javascript - PHP 不会发布值表

mysql - 如何在mySQL select查询中将unicode列数据转换为可读文本

javascript - Wordpress 有条件地加载一个缩小的脚本

php - Yii2 - 在 View 的 index.php 中渲染 _search.php 文件

php - 如果存在符合条件的相应行,则选择行?