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

Posted

技术标签:

【中文标题】未捕获的 PDOException:SQLSTATE[42000]:语法错误或访问冲突【英文标题】:Uncaught PDOException: SQLSTATE[42000]: Syntax error or access violation 【发布时间】:2019-07-06 16:23:37 【问题描述】:

不知道为什么会报错

致命错误:未捕获的 PDOException:SQLSTATE[42000]:语法错误或 访问冲突:1064 您的 SQL 语法有错误;检查 与您的 mysql 服务器版本相对应的手册 在第 1 行的“预处理器”附近使用的语法 /var/www/html/phpquiz/result.php:17

执行准备好的语句时发生错误,即在执行时 $cho->execute();

<?php
session_start();
if(!isset($_SESSION['score']))
    $_SESSION['score'] = 0;


if(isset($_POST['submit']))
    $arr = array("a", "b", "c", "d", "e");
    for($i = 1; $i < 6; $i++)
        $text = $_POST['que_'.$arr[$i-1]];
        echo "$text<br> ";
        $cho = $pdo->prepare("SELECT id from choices where `text` = $text");
        $cho->execute();
        $r = $cho->fetch(PDO::FETCH_ASSOC);
        echo $r;
    

【问题讨论】:

你没有正确使用prepare,= $text"应该是= ?"然后execute([$text]) 【参考方案1】:

您的准备​​语句是错误的。您需要将 PHP 变量替换为占位符,然后将实际值传递给 execute 函数。

$cho = $pdo->prepare("SELECT id FROM choices WHERE `text` = ?");
$cho->execute([$text]);
$r = $cho->fetch(PDO::FETCH_ASSOC);

【讨论】:

感谢@Dharman,它现在可以工作了。但是你知道大多数时候这样的问题在不使用占位符的情况下都可以解决,那为什么它不起作用呢? 大部分时间它在 60% 的时间内工作。你可能很幸运它可以工作,但如果你做得好,它将 100% 工作。带有占位符的预处理语句是正确的方法,副作用是它们也可以保护您免受 SQL 注入。

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

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

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

致命错误:未捕获的 PDOException:SQLSTATE[42000]:? [复制]

致命错误:未捕获的异常“PDOException”和消息“找不到驱动程序”

带有消息“SQLSTATE [22007]”的未捕获异常“PDOException”:日期时间格式无效:1366 字符串值不正确

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