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

000*_*010 2 php mysql sql mysqli

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

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

'content'将通过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)
);
Run Code Online (Sandbox Code Playgroud)

我想提交的实际内容是:

其次,这些传教士会逐渐地,在不引起怀疑或令人兴奋的警报的情况下,在贵族中引入一种基本的清洁,如果祭司可以保持安静,那么它们将对人们产生影响.这会破坏教会.我的意思是迈向这一步.接下来,教育 - 接下来,自由 - 然后她就会开始崩溃.我坚信,任何已建立的教会都是既定的罪行,既定的奴隶笔,我毫无顾忌,但愿意以任何方式或任何承诺伤害它的武器来攻击它.为什么,在我自己的前一天 - 在遥远的几个世纪尚未在时间之内激动 - 有些老英国人想象他们出生在一个自由的国家:一个拥有公司法和测试的"自由"国家仍然生效 - 木材支撑着男人的自由和不光彩的良心,以支撑着已经不合时宜的人.

对此的insert语句如下:

$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.'');
}
Run Code Online (Sandbox Code Playgroud)

出于某种原因,它在INSERT过程中出错.我注意到一件奇怪的事情就是错误中的日期被切断了.拨打我正在使用的日期.$ date = date("Ymd");

我之前使用过相同的语法没有问题.

****编辑

一些海报已经指出我的INSERT列语句中有单引号.我已将这些更改为后退抽搐并完全删除它们但仍会出现错误.

新错误:

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

我的插入语法还有一些问题,但我正在读的所有内容都说它应该是正确的.

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

Fun*_*ner 6

删除(对于您的列)中的所有引号

('uid', 'username', 'p_date', 'title', 'content')
Run Code Online (Sandbox Code Playgroud)

这些不是正确的列标识符

使用

(uid, username, p_date, title, content)
Run Code Online (Sandbox Code Playgroud)

或使用反引号.

(`uid`, `username`, `p_date`, `title`, `content`)
Run Code Online (Sandbox Code Playgroud)

但是,作为一个快速的FYI,反引号主要用于保留关键字,或者如果表/列包含空格,连字符.


错误消息让您知道这里

查看与您的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
Run Code Online (Sandbox Code Playgroud)

脚注:

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

$content = stripslashes($_POST['content']);
Run Code Online (Sandbox Code Playgroud)

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