未捕获的PDOException:语法错误或访问冲突:间距不正确导致1064

问题描述 投票:0回答:1

我从一行中得到两种不同类型的错误,我花了很长时间才找出错误在哪里。这是php在使用bacticks分隔字符串连接MySql查询语句时显示的有趣行为。

$query='SELECT c.name as category_name, p.id, p.category_id, p.title, p.body, p.author, p.created_at
    FROM'.$this->table. ' p
    LEFT JOIN categories c ON p.category_id=c.id
    ORDER BY p.created_at DESC';

注意:FROM和反引号之间没有空格。错误如下:

致命错误:未捕获的PDOException:SQLSTATE [42000]:语法错误或访问冲突:1064您的SQL语法有错误;检查与您的手册相对应的手册MariaDB服务器版本可在'p附近使用正确的语法左联接类别c ON p.category_id = c.id在C:\ xampp \ htdocs \ php_REST_myblog \ models \ Post.php第2行的ORDER BY p.crea':31堆栈跟踪:#0 C:\ xampp \ htdocs \ php_REST_myblog \ models \ Post.php(31):PDOStatement-> execute()#1 C:\ xampp \ htdocs \ php_REST_myblog \ api \ posts \ read.php(18):Post-> read()#2 {main}放在C:\ xampp \ htdocs \ php_REST_myblog \ models \ Post.php31

下一个变化是

  $query='SELECT c.name as category_name, p.id, p.category_id, p.title, p.body, p.author, p.created_at
    FROM '.$this->table. 'p
    LEFT JOIN categories c ON p.category_id=c.id
    ORDER BY p.created_at DESC';

注意反引号和p之间没有空格。数据库名称是myblog,表名称是posts。后面的错误是

致命错误:未捕获的PDOException:SQLSTATE [42S02]:找不到基表或视图:1146表'myblog.postsp'未找到存在于C:\ xampp \ htdocs \ php_REST_myblog \ models \ Post.php:31堆栈跟踪:#0 C:\ xampp \ htdocs \ php_REST_myblog \ models \ Post.php(31):PDOStatement-> execute()#1 C:\ xampp \ htdocs \ php_REST_myblog \ api \ posts \ read.php(18):Post-> read()#2 {main}放在C:\ xampp \ htdocs \ php_REST_myblog \ models \ Post.php31

下面是正确的代码,带有两个额外的空格。

$query='SELECT c.name as category_name, p.id, p.category_id, p.title, p.body, p.author, p.created_at
        FROM '.$this->table. ' p
        LEFT JOIN categories c ON p.category_id=c.id
        ORDER BY p.created_at DESC';

出了什么问题?

php mysql fatal-error uncaught-exception
1个回答
0
投票

您的数据库和表名将从$this->table添加,并且'p'是它的别名。它们之间需要用空格隔开,就像数据库名称和FROM之间需要空格一样。

© www.soinside.com 2019 - 2024. All rights reserved.