致命错误:未捕获的 PDOException:SQLSTATE[42000] 语法错误或访问冲突

Posted

技术标签:

【中文标题】致命错误:未捕获的 PDOException:SQLSTATE[42000] 语法错误或访问冲突【英文标题】:Fatal error: Uncaught PDO Exception: SQLSTATE[42000] Syntax Error or Access Vilation 【发布时间】:2018-05-13 19:29:06 【问题描述】:

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

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 文件肯定有问题。知道有什么问题吗?

【问题讨论】:

将文字文本添加到作为字符串的 SQL 语句时,您需要在它们周围加上引号。 了解prepared statements以防止sql注入 添加以下行是否足以避免 SQL 注入? $statement->bindParam(':email', $email); @Jens 忘了在最后一条评论中引用你的内容 【参考方案1】:

您的错误是电子邮件是一个字符串,应该被引用。但是,您使用的是 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() 来检查是否删除了一行。

【讨论】:

您可以随时调用rowCount () 来检查一行是否被删除。 我用我所做的更改编辑了帖子。现在我收到以下错误:Fatal error: Uncaught PDOException: SQLSTATE[HY093]: Invalid parameter number: no parameters were bound in /home/saintpao/public_html/deleteNewsletter.php:23 Stack trace: #0 /home/saintpao/public_html/deleteNewsletter.php(23): PDOStatement->execute() #1 main thrown in /home/saintpao/public_html/deleteNewsletter.php on line 23 @Luiscri 你错过了execute() 中的数组。 那是什么意思? @Syscall 看答案中的execute调用,有一个数组,有值,根据查询中的占位符。

以上是关于致命错误:未捕获的 PDOException:SQLSTATE[42000] 语法错误或访问冲突的主要内容,如果未能解决你的问题,请参考以下文章

致命错误:未捕获的异常“PDOException”,带有消息“SQLSTATE [42000]:语法错误或访问冲突 PHP 和 PDO

致命错误:未捕获的 PDOException:SQLSTATE[42000] 语法错误或访问冲突

致命错误:第 19 行的 C:\xampp\htdocs\register.php 中抛出未捕获的异常“PDOException”

PHP 致命错误:未捕获的 PDOException:SQLSTATE [42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误

致命错误:未捕获PDOException:SQLSTATE [HY093]:参数号无效:无参数

PDO:未捕获的 PDOException:找不到驱动程序