PHP-SQL 不保存长文本

Posted

技术标签:

【中文标题】PHP-SQL 不保存长文本【英文标题】:PHP- SQL not saving long text 【发布时间】:2021-10-19 06:25:25 【问题描述】:

我在将长文本从表单保存到数据库时遇到问题。页面加载并返回而不保存或显示错误。短文本正在保存。代码如下:

html

<textarea id="" name="text_01" style="width:80%; height:150px;">
</textarea>

php/SQL:

$_POST = filter_var($_POST, \FILTER_CALLBACK, ['options' => 'trim']);
if (isset($_POST['saveCover']) && !empty($_POST)) 
    $data = $_POST;
    if (empty($cover)) 
        error_log("New Text insert. ");
        $sql = "insert into tbl_text (id, text_01) values ($id, '".$data['text_01']."';
     

SQL(数据库):

CREATE TABLE `tbl_text` (
 `id` int(11) NOT NULL,
`text_01` text,
  `created_at` datetime DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Project Cover Pages';

【问题讨论】:

将您的表text_01 列类型TEXT 更改为LONGTEXT TEXT 数据类型可接受不超过 64kb。如果这还不够,那么使用更广泛的数据类型。 页面加载并返回而不保存或显示错误。正在保存短文本。 检查警告。此外 - 检查要插入的文本是否有必须转义的符号。 警告!您对SQL injection attacks 开放!阅读how to prevent SQL injection in PHP,使用带有绑定参数的准备好的语句,而不是将变量直接注入查询中。这不仅仅是安全问题。例如,如果您的数据包含单引号 ',您的查询将中断。 【参考方案1】:

您的查询可以注入

我可以看到你已经使用'(单引号)引用了文本,现在想象如果输入的文本包含任何单引号,那么它将破坏你的查询,字符串的长/长度在这里不是问题。你也错过了一个结束“(双引号)

使用准备好的语句,从您的代码中我不确定您使用的是什么 - PDO 或 mysqli,请更新您的代码以相应地使用准备好的语句。这里出于测试目的使用addslashes() 来检查是否可以保存长文本。

$sql = "insert into tbl_text (id, text_01) values ($id, '".addslashes($data['text_01'])."'";

【讨论】:

请不要发布不安全的代码,即使是 OP“测试”。未来的新开发人员将在没有正确阅读(或理解)您答案中的评论的情况下看到这一点,将不安全的做法引入他们的代码库。展示如何正确使用准备好的语句。安全应该是设计的,而不是事后的想法。 @MagnusEriksson,已经注意到并提到了,现在从发布的代码中不清楚是使用 PDO 还是 mysqli,所以将准备好的语句部分留给用户。 我知道你做到了,这就是为什么我说“未来的新开发人员会在没有正确阅读(或理解)你答案中的评论的情况下看到这一点”。如果您没有足够的信息来编写正确的答案(使用安全代码),那么您应该在评论中要求 OP 进行澄清。 谢谢,@SubhashisPandey!添加 .addslashes 对问题进行了排序。注意到@MagnusEriksson 安全问题。我会纠正的。 如果真的对你有帮助,请你点个赞

以上是关于PHP-SQL 不保存长文本的主要内容,如果未能解决你的问题,请参考以下文章

微信小程序之文本合成语音朗读及长文本分段播放处理

json swift ios - 将参数发送到 php-sql

PHP-SQL查询上升的温度

TextView 将长文本分成新行

zabbix-latest.php-SQL注入漏洞(CVE-2016-10134)

zabbix-latest.php-SQL注入漏洞(CVE-2016-10134)