撇号未插入 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 数据库 [重复]的主要内容,如果未能解决你的问题,请参考以下文章