我有一个生成大约8,000个字符的随机文本的函数。
此文本是在首次访问页面时根据某些参数生成的。
我希望此文本存储在数据库中(不必为每次访问生成另一个文本)。
我成功地在数据库中存储了除大文本之外的所有变量。也可以在文本很小时存储:
$LargeText=Texto(); //-> about 8,000 characters
if(empty($Descricao)){
$InserirDescricao = strtoupper($Nome);
mysql_query("UPDATE lavanderias SET descricao = \"$InserirDescricao\" WHERE id=$CidadeID");} //-> This works fine
if(empty($Texto)){
mysql_query("UPDATE lavanderias SET texto = \"$LargeText\" WHERE id=$CidadeID");} //-> This not works :(
if(empty($Texto)){
mysql_query("UPDATE lavanderias SET texto = \"ANYTHING\" WHERE id=$CidadeID");} //-> This works fine
第三条消息生成此错误消息:
Fatal error: Uncaught exception 'mysqli_sql_exception' with message
'You have an error in your SQL syntax; check the manual that corresponds
to your MySQL server version for the right syntax to use near
'servico"><div class="servico-ilustracao servico-ilustracao-5"><h2>Lavagem de Pro'
at line 1'
字符数可能阻止插入?如何设置使用大文本插入变量?
答案 0 :(得分:5)
根据您作为评论发布的SQL错误消息,您尝试更新的文本中至少有一个单引号。因为您通过字符串连接创建SQL查询,所以单引号被解释为SQL语法的一部分,并导致语法错误。
始终通过函数mysql_real_escape_string
运行您放入SQL查询的任何字符串,以转义在SQL中具有特殊含义的任何字符。更好的是,转储旧的,过时的mysql_*
API并使用较新的mysqli-API和prepared statements。此API会自动为您执行此操作。
这非常重要,因为您的查询也容易受到SQL注入攻击。想象一下当我将文本'; DROP TABLE lavanderias; --
放在我的网站上时会发生什么。
答案 1 :(得分:2)
使用预准备语句避免SQL注入问题。语法错误是由单引号'servico">
引起的。
使用预准备语句很简单:只需更改问号的值,准备SQL指令,使绑定si
表示数据类型s
=&gt; string,i
=&gt;整数,d
=&gt; double / float和b
=&gt; blob和最后excute()
尝试在数据库上应用更新。
$mysqli = new mysqli('localhost', 'user', 'pass', 'database');
$sql = "UPDATE lavanderias SET texto = ? WHERE id = ?)";
$stmt = $mysqli->prepare($sql);
$stmt->bind_param('si', $LargeText, $CidadeID);
if(!$stmt->execute()){
echo mysqli_error($mysqli);
}