如何使用PHP将大文本插入数据库?

时间:2016-04-08 10:15:59

标签: php database mysql

我有一个生成大约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' 

字符数可能阻止插入?如何设置使用大文本插入变量?

2 个答案:

答案 0 :(得分:5)

根据您作为评论发布的SQL错误消息,您尝试更新的文本中至少有一个单引号。因为您通过字符串连接创建SQL查询,所以单引号被解释为SQL语法的一部分,并导致语法错误。

始终通过函数mysql_real_escape_string运行您放入SQL查询的任何字符串,以转义在SQL中具有特殊含义的任何字符。更好的是,转储旧的,过时的mysql_* API并使用较新的mysqli-APIprepared 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);
}