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)
删除(对于您的列)中的所有引号
('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!".