我有一个用户可以提交反馈的表单。 如果他们的反馈少于60-70字,一切都运行良好。由于反馈超出限制,因此会抛出错误。
我使用此命令创建我的表:
CREATE TABLE RECORDS (ID INT NULL PRIMARY KEY, AUTO_INCREMENT, NAME VARCHAR(100), OFF VARCHAR(100), PROBLEM VARCHAR(1000));
如果反馈是大约5-10个单词,那么它就被接受了。 我的PHP:
$dbh = new PDO ("mysql:host=localhost; dbname=reports", "root", "sd22");
$dbh2 = new PDO ("mysql:host=localhost; dbname=sreports", "root", "sd22");
} catch (PDOException $e) {
server_misconfig (); }
$log_uhashD = $dbh -> exec ("INSERT INTO `RECORDS` (`name`, `officer`, `problem`) VALUES ('$cname', '$vname', '$tarea')");
$log_hashD = $dbh2 -> exec ("INSERT INTO `SRECORDS` (`name`, `officer`, `problem`) VALUES ('$hcname', '$hvname', '$tarea')");
while (!$log_uhashD == '1') {
db_logfail ();
die();
}
while (!$log_hashD == '1') {
db_logfail ();
die();
}
$dbh = null;
$dbh2 = null;
JewelWrap ();
我的表格:
<div id="jewel-Report">
<form action="record_report.php" method="post">
<div id="jewel-cName"><p>Your name: </p>
<input type="text" name="jewel-cName" autocomplete="off">
<div id="jewel-vName"><p>OFF: </p>
<input type="text" name="jewel-vName" autocomplete="off"></div>
<div id="jewel-tArea"><p>Describe your problem: </p><textarea rows="10" cols="50" name="jewel-tArea"></textarea></div>
<button name="jewel-submit" type="submit">Submit</button>
</form>
</div>
答案 0 :(得分:0)
尝试使用文字而不是 varchar(1000)
CREATE TABLE RECORDS (ID INT NULL PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(100), OFF VARCHAR(100), PROBLEM TEXT);
答案 1 :(得分:0)
你说这是你得到的错误:
我收到此错误:PDO :: errorInfo():Array([0] =&gt; 42000 [1] =&gt; 1064 [2] =&gt;您的SQL语法有错误;请查看手册对应于您的MySQL服务器版本,以便使用接近保存数据的能力的正确语法。我们相信第1行的限制和拼版
这表明文本中的撇号 - 可能是占有性,类似于“人持有数据的能力” - 导致你的陈述被终止。
所以,问题是我(和juergen d)认为的问题:你实际上不正在消毒你的输入。您需要转义那些撇号,否则查询引擎会将它们视为结束引号,终止字符串文字,并将字符串中的其余文本提供给查询解析器,就好像它是SQL一样。
最好的方法是使用PDO prepared statements绑定参数,而不是尝试使用字符串操作将它们拼接到SQL语句中。
答案 2 :(得分:-1)
您运行的是哪个版本的MySQL,以及您使用的字符集是什么? 由于MySQL4对字符长度采用不同的方法,因此可以保存特殊(utf8)字符。