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

如何使用PHP将大文本插入数据库?,php,database,mysql,Php,Database,Mysql,我有一个函数,可以生成一个大约8000个字符的随机文本 此文本是在首次访问页面时根据一些参数生成的 我希望此文本存储在数据库中,而不必为每次访问生成另一个文本 我成功地在数据库中存储了除大文本之外的所有变量。当文本较小时,也可以存储: $LargeText=Texto(); //-> about 8,000 characters if(empty($Descricao)){ $InserirDescricao = strtoupper($Nome); mysql_query("UPDAT

我有一个函数,可以生成一个大约8000个字符的随机文本

此文本是在首次访问页面时根据一些参数生成的

我希望此文本存储在数据库中,而不必为每次访问生成另一个文本

我成功地在数据库中存储了除大文本之外的所有变量。当文本较小时,也可以存储:

$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' 

可能是字符数阻止了插入?如何插入带有大文本的变量?

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

始终通过函数运行放入SQL查询中的任何字符串,以转义SQL中具有特殊含义的任何字符。更妙的是,转储旧的、过时的mysql_*API,并将更新的与一起使用。此API会自动为您执行此操作


这一点非常重要,因为您的查询也容易受到SQL注入的攻击。想象一下,当我把文字放进去时会发生什么;吊床洗手盆;-在我的网站上。

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

始终通过函数运行放入SQL查询中的任何字符串,以转义SQL中具有特殊含义的任何字符。更妙的是,转储旧的、过时的mysql_*API,并将更新的与一起使用。此API会自动为您执行此操作


这一点非常重要,因为您的查询也容易受到SQL注入的攻击。想象一下,当我把文字放进去时会发生什么;吊床洗手盆;-在我的网站上。

使用准备好的语句避免SQL注入的问题。语法错误是由单引号“servico>引起的

使用prepared语句很简单:只需更改问号的值,准备SQL指令,使bind si表示数据类型s=>string,i=>integer,d=>double/float和b=>blob,最后Execute尝试在数据库上应用更新

$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);
}

使用准备好的语句避免SQL注入问题。语法错误是由单引号“servico>引起的

使用prepared语句很简单:只需更改问号的值,准备SQL指令,使bind si表示数据类型s=>string,i=>integer,d=>double/float和b=>blob,最后Execute尝试在数据库上应用更新

$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);
}

问题属于StackOverflow,很可能会被迁移。8000个字符没那么长。如果字段定义正确,就不会有问题。您会收到什么错误消息?他们应该告诉你这个问题。也许尝试输出SQL并手动从MySQL命令行客户端运行它。您应该考虑切换到使用准备好的语句。使用它可以更容易地避免安全漏洞。我得到了以下信息:致命错误:未捕获异常“mysqli\u sql\u exception”,并显示消息“您的sql语法有错误;查看与MySQL服务器版本对应的手册,了解第1行“servico>Lavagem de Pro”附近使用的正确语法。这与文本的大小无关,您的查询被阻塞了。你的文章中可能有一段未删节的引语打断了它。正如@Philipp已经建议的那样,切换到准备好的语句将解决这个问题。问题将属于StackOverflow,很可能会被迁移。8000个字符没那么长。如果字段定义正确,就不会有问题。您会收到什么错误消息?他们应该告诉你这个问题。也许尝试输出SQL并手动从MySQL命令行客户端运行它。您应该考虑切换到使用准备好的语句。使用它可以更容易地避免安全漏洞。我得到了以下信息:致命错误:未捕获异常“mysqli\u sql\u exception”,并显示消息“您的sql语法有错误;查看与MySQL服务器版本对应的手册,了解第1行“servico>Lavagem de Pro”附近使用的正确语法。这与文本的大小无关,您的查询被阻塞了。你的文章中可能有一段未删节的引语打断了它。正如@Philipp已经建议的那样,切换到准备好的语句将解决这个问题。