奇怪的未解决的PDO错误:语法错误或访问冲突:1064您的SQL语法中有错误;

时间:2018-06-04 22:08:39

标签: php mysql pdo

我在php脚本中遇到错误:

  

PHP致命错误:未捕获PDOException:SQLSTATE [42000]:语法错误   或访问冲突:1064您的SQL语法有错误;校验   与您的MySQL服务器版本对应的手册   在/var/www/html/a.php:143

的第1行''附近使用的语法

请注意它附近''(两个单引号)。 此脚本用于在我以前的服务器上正常工作,但是当我移动到新服务器时,它仍然显示此错误。我的PHP版本是7.0,Mysql版本是5.7.22。

我如何连接到mysql:

try{
    $pdo = new PDO("mysql:host=localhost;dbname=db_name", $username, $password);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    echo "Connected successfully";
} catch(PDOException $e){
    echo "Connection failed: " . $e->getMessage();
}

打印:“已成功连接”。 这些是包含PDO查询的第142和143行:

$stmt = $pdo->prepare("SELECT has_paid FROM info WHERE chat_id=".$chat_id);
$stmt->execute();

我访问了类似的问题,但他们没有帮助。

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:3)

我怀疑你的$chat_id是空的。因此,您的SQL查询最终成为:

SELECT has_paid FROM info WHERE chat_id=

MySQL语法错误报告跟随 MySQL混淆的地方的SQL查询部分。在这种情况下,它报告''附近的错误,因为它在查询结束时感到困惑。这并不奇怪,因为=需要一个右手边的论点。

您应该检查设置$chat_id的代码,并确保在尝试查询之前它具有非空值。

顺便说一句,我使用prepare()execute()似乎很奇怪但你没有使用查询参数。你应该这样编码:

$stmt = $pdo->prepare("SELECT has_paid FROM info WHERE chat_id=?");
$stmt->execute([$chat_id]);

(有些人会说,没有必要使用bindValue()。)

答案 1 :(得分:1)

您没有正确使用预准备语句,并且正在为SQL注入漏洞做好准备。

使用类似的东西......

$stmt = $pdo->prepare("SELECT has_paid FROM info WHERE chat_id= :chat_id");
$stmt->bindValue(":chat_id", $chat_id);
$stmt->execute();

您的错误告诉您到底出了什么问题。您的SQL查询无效。这不是PHP或PDO的问题。可能$chat_id是一个空变量。实际上,我检查了你的SQL语法。只要为$chat_id提供了值,它就完全有效。