我试图在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!".