【发布时间】:2012-04-30 08:05:58
【问题描述】:
我正在寻找一种在准备好的语句中处理 HTML 内容的方法。
我的应用程序提供了一个基本的 WYSIWYG 编辑器,在用户保存内容后,我的脚本将 HTML 数据存储在 sqlite 数据库中。
但如果我使用的是准备好的语句,我的 HTML 会自然地转义。
这是我到目前为止所做的:
try {
/* Create databases and open connections */
$dbh = new PDO( 'sqlite:db/coaching.sqlite' );
/* Set Error Mode for Exception Handling */
$dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
/* Prepare SQL Statement */
$query = $dbh->prepare( "UPDATE Content SET Value=:value WHERE Token=:token" );
/* Bind Param to Statement */
$query->bindParam( ':token', $_POST['id'], PDO::PARAM_STR);
$query->bindParam( ':value', $_POST['value'], PDO::PARAM_STR);
/* Execute Query */
$query->execute();
/* Echo Data */
echo $_POST['value'];
/* Close connections to Database */
$dbh = NULL;
}
catch( PDOException $e ) {
/* Print Error-Messages */
echo $e->getMessage();
}
【问题讨论】:
-
你确定它被 bindParam() 转义了,而不是在从 HTTP 请求中检索 HTML 时?
-
据我所知,用户输入会在 bindParam() 中自动引用。
-
@gearsdigital 准备好的语句不会转义变量。命令和变量同时但独立地传输到数据库。如果您看到您的数据在数据库中转义,还有另一个原因。例如。
magic_quotes已打开。您可以在脚本中回显get_magic_quotes_gpc以查看它们是打开还是关闭? -
你是对的。 magic_quotes 已启用,如果我禁用它,则不会逃脱。但只是为了理解:准备好的语句降低了 SQL 注入的风险?正确的?这是我第一次使用 PDO 和准备好的语句。
-
@gearsdigital 好的。我扩展了我的评论 - 请参阅下面的答案。
标签: php sqlite pdo prepared-statement