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