Php 当双引号位于文本字符串内时,插入命令失败
我最近在数据库中插入包含双引号的文本字符串时遇到了一些问题。 我使用filter_变量来清理和过滤输入 例如:Php 当双引号位于文本字符串内时,插入命令失败,php,sql,pdo,Php,Sql,Pdo,我最近在数据库中插入包含双引号的文本字符串时遇到了一些问题。 我使用filter_变量来清理和过滤输入 例如: $filtered = filter_var($input, FILTER_SANITIZE_STRING, FILTER_FLAG_ENCODE_AMP); 当输入字符串“a”b时,它会转换为“a”b 因此,当我打印出insert命令时,它如下所示: INSERT INTO its_info (ID, Title) VALUES(13, "a"b"); 现在发生的
$filtered = filter_var($input, FILTER_SANITIZE_STRING, FILTER_FLAG_ENCODE_AMP);
当输入字符串“a”b时,它会转换为“a”b
因此,当我打印出insert命令时,它如下所示:
INSERT INTO its_info (ID, Title) VALUES(13, "a"b");
现在发生的是,当执行实际的数据库插入时,不会使用上面的查询,而是
INSERT INTO its_info (ID, Title) VALUES(13, "a"b");
当然,这是错误的,该命令失败
想知道为什么这个双引号会再次被转换。
检查了php.ini中的设置。所有设置看起来都正常
我尝试了过滤器变量的其他选项,如过滤器清理、完全清理、特殊清理和过滤器清理、魔术引号,但这也不起作用
PHP 5.6.24/PDO extension/MySQL 5.1.73您可以在手动模式下转义字符串变量:
$str = str_replace('"', '\\"', $str);
您应该在向RDBMS发送数据时使用,这样就不需要执行任何神奇的消毒操作。您可能还应该注意(它解释了什么是准备好的语句..它在示例中使用了MySQLi,但在PDO中也同样适用)
走错路
正道
而且,如果您将PDO与MySQL/MariaDB一起使用,则应该禁用对已准备语句的模拟。连接的建立应如下所示:
$connection = new PDO('mysql:......;charset=utf8', 'username', 'password');
$connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$connection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$stmt = $pdo->prepare('INSERT INTO its_info (ID, Title) VALUES(13, :title)');
$stmt->bindValue(':title', $title);
$stmt->execute();
$connection = new PDO('mysql:......;charset=utf8', 'username', 'password');
$connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$connection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);