$string = "susan's"; //string is scraped from website
$string = html_entity_decode($string);
$sql = 'INSERT INTO database SET name = "'. $string .'"';
当我回显$ sql时,它显示正确的一个:INSERT INTO database SET name="susan's"
,但是当我运行查询时,它会将susan's
插入数据库。当我从phpmyadmin手动运行查询时,它会插入正确的查询。为什么html实体即使在删除它们时也会传递给数据库?
答案 0 :(得分:3)
您需要使用ENT_QUOTES
标志常量。
根据手册:
ENT_QUOTES将转换双引号和单引号 以下一个或多个标志的位掩码,指定如何处理引号以及要使用的文档类型。默认为ENT_COMPAT | ENT_HTML401。
ENT_COMPAT
生成susan's
的位置。
所以你的代码最终成为:
$string = htmlspecialchars_decode($string, ENT_QUOTES);
注意:根据用于插入此API的API,您需要知道在不使用stripslashes()
的情况下转义它并且应该是这种情况,可能会产生susan\'s
,是另一个不受欢迎的结果。
如果您还没有这样做,请使用预先准备好的声明。
这有助于防止SQL注入。
当我回显$ sql时,它显示正确的一个:INSERT INTO数据库SET name =" susan' s",
提示:在插入数据库之前,请始终查看您的HTML源代码。这将准确揭示将在查询中传递的内容。这也被认为是一个"工具"。