Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 当双引号位于文本字符串内时,插入命令失败_Php_Sql_Pdo - Fatal编程技术网

Php 当双引号位于文本字符串内时,插入命令失败

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"); 现在发生的

我最近在数据库中插入包含双引号的文本字符串时遇到了一些问题。 我使用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");
现在发生的是,当执行实际的数据库插入时,不会使用上面的查询,而是

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);