撇号未插入 SQL 数据库 [重复]

Posted

技术标签:

【中文标题】撇号未插入 SQL 数据库 [重复]【英文标题】:Apostrophe Not Being Inserted into SQL Database [duplicate] 【发布时间】:2014-01-16 13:09:30 【问题描述】:

我正在使用 php 连接使用 sqlsrv 驱动程序的 SQL 数据库。但是,我遇到了一个问题:

$string = "Home";
$DBH->prepare( "INSERT INTO table_name (column_name) VALUES ('" .$string. "')" );
$DBH->execute();

这是怎么回事?

$string = "Home's";
$DBH->prepare( "INSERT INTO table_name (column_name) VALUES ('" .$string. "')" );
$DBH->execute();

但这不是吗?

SQL 数据库似乎不接受 $string 变量中的撇号。过去我会使用mysql_real_escape_string,但这不是一个选项。

【问题讨论】:

有效和无效是这里没人理解的词。找出错误。 PDO有一个引用方法php.net/manual/en/pdo.quote.php 你正在遭受 SQL 注入 - 这是how to fix it “过去我会使用mysql_real_escape_string,但这不是一个选择。”这意味着您知道问题所在。使用准备好的语句。 @ÁlvaroG.Vicario — 不仅如此,这就是问题的原因,因此您链接到的问题是重复的。 【参考方案1】:

发生这种情况是因为您使用的是准备好的语句......但没有准备任何输入,而只是将值添加到 SQL 中。看看应该就明白了:

前 1:

$DBH->prepare( "INSERT INTO table_name (column_name) VALUES ('Home')" );

前 2:

$DBH->prepare( "INSERT INTO table_name (column_name) VALUES ('Home's')" );

看看你的报价现在是如何混乱的?

这样做的正确方法是准确地使用准备好的语句的功能:

$string = "Home's";
$DBH->prepare( "INSERT INTO table_name (column_name) VALUES (:column_name)" );
$DBH->bindParam(':column_name', $string);
$DBH->execute();

注意您的语句是如何使用:column_name 参数准备好接受值的。然后bindParam 将一个值放入并执行。

现在甚至可以使用新值重用准备:

$string = "Home's Holmes is homing";
$DBH->execute();

【讨论】:

我忘记了使用 PHP 进行 OOP,感谢您的进修课【参考方案2】:

sqlsrv documentation page 提供了有关如何使用准备好的语句的不错示例:

$sql = "INSERT INTO table_name (column_name) VALUES (?)";
$params = array("Home's");    
$stmt = sqlsrv_query( $conn, $sql, $params);

【讨论】:

【参考方案3】:

我认为您需要使用双撇号来转义撇号。插入后检查表中的数据,它应该只显示一个撇号。

$string = "Home''s"; 
$DBH->prepare( "INSERT INTO table_name (column_name) VALUES ('" .$string. "')" );
$DBH->execute();

祝你好运……

【讨论】:

这不是字符串转义问题,是SQL语句问题。 in SQL 撇号'需要转义。插入人(第一,最后)值('Joe','O''Brien') 这对于静态查询来说是可以接受的,但我很确定$string = "Home's"; 只是一个简化的测试用例。 SQLSRV 库提供了不错的预处理语句支持。 同意。仍然建议使用准备好的语句。 我不反对,但我觉得 OP 无法理解这个概念..

以上是关于撇号未插入 SQL 数据库 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

Excel在单元格值中转义引号或撇号

使用 Python 处理 sql 时的撇号 (') 帮助

通过 PhpMyAdmin 将带撇号的 SQL 数据库导入 MySQL

何时用撇号包围 SQL 字段?

客户数据中存在单引号,如何插入SQL SERVER

撇号导致 Node SQL 应用程序崩溃