【发布时间】:2011-10-15 14:03:59
【问题描述】:
每当我在我的 PHP 表单域中添加单引号 (') 或双引号 (") 时,它都会以 " / ' 的形式保存在我的 MySQL 数据库中。如何保存“真实的”“引号" 在我的数据库中?
我试图通过 PDO 建立一个安全的 Mysql 连接来防止这种情况发生,但它似乎无法正常工作。
所以这是我的代码的重要部分:
$insert_hello = filter_var($_POST['hello'], FILTER_SANITIZE_STRING);
$dbh->query("SET NAMES 'utf8'");
$stmt = $dbh->prepare("INSERT INTO testtable (data) VALUES (:hello)");
$stmt->bindParam(':hello', $insert_hello, PDO::PARAM_STR);
$stmt->execute();
一些背景信息:
服务器在 PHP v5.2.12-0 上运行。
DBStorage 引擎是 InnoDB,其客户端、连接、结果和系统字符集设置为 utf8。
DB 字段的排序规则设置为 utf8_unicode_ci。
通过 .htaccess 禁用魔术引号。
提前致谢!
亲切的问候, 杰伦
【问题讨论】:
-
在我看来,您正在使用 filter_var 进行转换。如果要存储原始字符串,为什么要过滤?
-
嘿!我想你是对的 Le Dorfier。 filter_var 是不必要的,并且确实是将引号转换为十六进制代码的那个。取出它时,这会使我的脚本容易受到注入吗?
-
le dorfier 是对的,我没用过PDO,不过貌似SQL转义应该是
$stmt->bindParam(...),所以没必要filter_var()...先改一下试试转到$inset_hello = $_POST['hello'];,看看在发布一些包含单引号的文本时会发生什么.. -
@Jroen,
“当取出它时,这会使我的脚本容易受到注入吗?”
,不,因为 PDO 应该为您清理数据。如果没有,则更改 DBAL:P
标签: php mysql utf-8 pdo quotes