1)我的html中有一个textarea
。我在textarea
内写道:<i>ABC Enterprise</i>
。保存到sql数据库时,它保存为<i>XYZ Enterprise</i>
2)在没有转换的情况下保存到数据库中有没有人知道如何保留<
和</>
?如果这不可能,有人知道如何在PHP中将<i>XYZ Enterprise</i>
转换为<i>ABC Enterprise</i>
吗?我需要字符串在php而不是html中保持这种形式<i>ABC Enterprise</i>
。
我尝试了preg_replace("/&([a-z])[a-z]+;/i", "$1", htmlentities($company))
,iconv('utf-8', 'ascii//TRANSLIT', $company)
,htmlspecialchars($compnay)
,偶然发现了堆栈溢出的其他许多方法,但似乎没有任何效果。有什么帮助吗?
答案 0 :(得分:1)
专门回答你的问题:
插入数据库时如何保留<>
和</>
? [转述,重点补充]
简单:不要修改您的数据。但是,如下所述,要聪明一点,并使用准备好的声明插入数据。
为什么您的数据会被更改?很可能是因为您的代码在将数据放入数据库之前对数据进行了某种形式的修改。在PHP中,这通常意味着以下之一:
多年来的一般建议只是&#34;逃避所有数据或遭受XSS / CSRF / Sql注入/其他攻击后果!&#34;问题是,在何时以及如何逃避以及对安全的热情方面存在细微差别,许多网站都在这样做。正如您所描述的那样,我会考虑:
预备语句是您告诉数据库您要发送的格式,然后在单独的通信中发送数据的地方。如果有任何错误,数据库最了解如何找到它。例如:
$pstmt = $dbh->prepare('INSERT INTO tab (html) VALUES (?)');
$pstmt->execute(array($_POST['my_textarea']));
请注意,缺少任何清理,直接使用$_POST
变量。用户发送给您的是您放入数据库的内容,零修改。因为数据库服务器首先发送了一个格式,所以它不允许任何不可思议的SQL注入恶作剧。
但是,当从数据库中提取数据时,您需要确切地注意数据到底在哪里。例如,根据您的上下文,允许内容中的<
和>
字符可能是蛮干的。我会留给您决定是否要逃避<textarea>
内的输出:
echo "<textarea>$textarea_content_as_retrieved_from_db</textarea>";
或
echo '<textarea>' . htmlentities( $textarea_content_as_retrieved_from_db ) . '</textarea>';