MySQL语法错误;检查与MySQL服务器版本对应的手册,以获得正确的语法


MySQL Error in SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use

我试图在MySQL(使用PHP)中插入一个示例博客文章到我的'posts'表中,但是我收到一个语法错误每当提交一个大字符的帖子。如果我提交的内容是20个字符,它可以工作,但像500个字符会抛出以下错误:

Error: SQL语法错误;检查与MySQL服务器版本对应的手册,以便在"uid","username","p_date","title","content"附近使用正确的语法)VALUES('1','Mark Twain', '2014-' at line 1

"内容"将通过varchar(1000)变量插入数据库。表在mysql中定义为:

CREATE TABLE posts
(
    pid int NOT NULL AUTO_INCREMENT,
    uid int NOT NULL,
    username varchar(100) NOT NULL,
    p_date date NOT NULL,
    title varchar(225) NOT NULL,
    content varchar(10000) NOT NULL,
    PRIMARY KEY(pid),
    FOREIGN KEY(uid) REFERENCES users(uid)
);

我想提交的实际内容是:

其次,这些传教士将逐渐地,在不引起怀疑或引起恐慌的情况下,在贵族中引入基本的清洁,如果牧师能够保持安静,它将从贵族中传播到人民。这会破坏教会。我的意思是,这是朝那个方向迈出的一步。接着是教育,接着是自由,然后她开始崩溃。我深信,任何国教都是一种既成事实的罪行,是一个既成事实的奴隶圈,所以我毫无顾忌,只要有可能伤害它,我就愿意用任何方法或武器攻击它。为什么,在我过去的日子里——在尚未在时间的子宫里蠕动的遥远的世纪里——有老英国人想象他们出生在一个自由的国家:一个"自由"的国家,公司法和考试仍然在其中有效——支撑着人们的自由和耻辱的良心,以支撑一个既定的时代错误。

插入语句如下:

$sql = "INSERT INTO posts ('uid', 'username', 'p_date', 'title', 'content') VALUES('$uid','$uname', '$date', '$title', '$content')";
if(!mysql_query($sql,$con)){
    echo "Oops! Something went wrong during the posting process. Please try again. ";
    die('Error: ' . mysql_error($con));
    header('Refresh: 1; URL=postingform.php');      
}else{
    // Now return the user to their post page 
    header('Refresh: 0; URL=postlist.php?uid='.$uid.'');
}

由于某些原因,它在INSERT过程中出错。我注意到一件奇怪的事情,那就是错误中日期被截断了。调用我正在使用的日期。$date = date("Y-m-d");

我以前使用过相同的语法,没有问题。

* * * *编辑

一些评论者指出在我的INSERT列语句中有单引号。我已经将这些更改为回tics并完全删除了它们,但错误仍然存在。

New Error:

Error: SQL语法错误;检查与你的MySQL服务器版本对应的手册,在's Court'附近使用正确的语法,'其次,这些传教士会逐渐地,没有创建su'在第1行

我的插入语法仍然有问题,但我正在阅读的一切都说它应该是正确的。

$sql = "INSERT INTO posts (`uid`, `username`, `p_date`, `title`, `content`) VALUES('$uid','$uname', '$p_date', '$title', '$content')";

删除(列)中的所有引号

('uid', 'username', 'p_date', 'title', 'content')

这些不是正确的列标识符

  • http://dev.mysql.com/doc/refman/5.5/en/identifiers.html
使用

(uid, username, p_date, title, content)

或使用反号。

(`uid`, `username`, `p_date`, `title`, `content`)

然而作为一个快速的提示,反引号主要用于保留关键字,或者如果表/列包含空格,连字符。

  • http://dev.mysql.com/doc/refman/5.5/en/reserved-words.html

错误信息让你知道这里

检查与你的MySQL服务器版本对应的手册,在"uid"附近使用正确的语法,
^——«就在那里

注意到'uid'前面的引号吗?这就是问题的根源。


编辑:

使用准备好的语句尝试以下操作,并用您自己的凭据替换xxx

这应该可以解决输入值中的引号问题。

您需要根据您的输入添加变量。

<?php
$DB_HOST = "xxx";
$DB_NAME = "xxx";
$DB_USER = "xxx";
$DB_PASS = "xxx";
$conn = new mysqli($DB_HOST, $DB_USER, $DB_PASS, $DB_NAME);
if($conn->connect_errno > 0) {
  die('Connection failed [' . $conn->connect_error . ']');
}
$uid = ""; // replace with proper value
$uname = ""; // replace with proper value
$date = ""; // replace with proper value
$title = ""; // replace with proper value
$content = ""; // replace with proper value
$stmt = $conn->prepare("INSERT INTO posts (`uid`, `username`, `p_date`, `title`, `content`) VALUES (?, ?, ?, ?, ?)");
$stmt->bind_param('sssss', $uid, $uname, $date, $title, $content);
    if (!$stmt->execute()) {
    echo "Execute failed: (" . $stmt->errno . ") " . $stmt->error;
    }
        else{
          echo "Success";
        }
$stmt->close(); // Statement
$conn->close(); // MySQLi

脚注:

为了允许单引号和/或双引号,在使用stripslashes()函数时,基于以下内容。

$content = stripslashes($_POST['content']);

这将正确地进入DB:
Bob's sister was here today and said: "Bob, what lovely hair you have!".