如何使用php在sql查询中转义引号?

如何使用php在sql查询中转义引号?,php,sql-server,Php,Sql Server,我有一个问题 $sql ="SELECT CustomerID FROM tblCustomer WHERE EmailAddress = '".addslashes($_POST['username']) ."' AND Password = '".addslashes($_POST['password']) ."'"; // while printing, it will be SELECT CustomerID FROM tblCustomer WHERE EmailAddre

我有一个问题

$sql ="SELECT CustomerID FROM tblCustomer 
WHERE EmailAddress = '".addslashes($_POST['username']) ."' AND Password = '".addslashes($_POST['password']) ."'";

//  while printing,   it will be

SELECT CustomerID FROM tblCustomer WHERE EmailAddress = 'test@ab\'c.com' AND Password = '123'
如果我们在mysql服务器中执行此操作,它会工作,但在sql服务器中不会

解决这个问题的办法是什么? . Iam使用sql server for mysql

使用mysql\u real\u escape\u字符串

比如:

// Query
$query = sprintf("SELECT * FROM tblCustomer WHERE user='%s' AND password='%s'",
            mysql_real_escape_string($user),
            mysql_real_escape_string($password));
对于mssql

请看下面的答案:


将用前导反斜杠转义单引号,该反斜杠在MySQL中有效,但在MS SQL Server中无效。在MS SQL Server中转义单引号的正确方法是使用另一个单引号。MySQL的用法已被弃用。不幸的是,不存在类似的mssql_uu函数,因此您必须使用自己的或类似的函数。更好的方法是使用数据库中立的抽象层,例如支持参数化查询的PDO。

对于MySQL,您希望使用MySQL\u real\u escape\u string。addslashes的功能几乎相同,字母也较少,但显然它有些地方出错了——不要使用它

对于SQL Server,它有点复杂,因为1 MySQL引用的东西不标准,2我没有看到为SQL Server引用东西的函数。但是,以下内容应该适用于您

$escaped_str = str_replace("'", "''", $unsafe_str);

您不应该真正动态地构建SQL语句,因为它既危险又不必要。正确的做法是使用参数化查询,请参见

这更安全,意味着您不必担心转义字符。另一件事是小心区分大小写/不区分大小写的比较。例如,如果您希望电子邮件地址不区分大小写,但密码区分大小写,请使用以下内容:

$sql ="SELECT CustomerID FROM tblCustomer WHERE EmailAddress = ? COLLATE SQL_Latin1_General_CP1_CIAI AND Password = ? COLLATE SQL_Latin1_General_CP1_CSAS";

您是否想知道这是如何在MySQL或SQL Server中实现的?看起来你真的想要后者,尽管你的标签上写的不是这样。我想在SQL Server中使用它。Addslashes的可能副本从来都不安全,因此,ans已从PHP中删除。你需要找到一个不到15年的教程或其他PHP信息源。这只适用于MySQL,而不适用于MS SQL Server。海报似乎也需要一个在MS SQL Server中工作的解决方案。如果我们这样做,查询将像SELECT*一样从tblCustomer输出,其中EmailAddress=和Password=//表单值不会从mysql输出。\u real\u escape\u string我希望我能再次否决这个答案。您的ms_escape_string函数是我引以为豪的一种功能,我没有这样做-数据应该由调用方验证,如果有效,应该不修改地发送到DB。它的示例链接到原始问题。@haim evgi:我也否决了您示例的源代码。任何引用函数都不应损坏数据-它的全部用途是确保数据进入数据库时不受数据库引用语法的影响。addslashes的设计目的不同,有一个细微的错误。不要将它用于MySQL的转义。@staticsan:我觉得有一个原因,就是有一个完整的其他函数使用了不推荐的早期版本!引用MySQL字符串+感谢你提到这件事相应地编辑了我的答案。除了你链接到我刚才两次否决的同一个半途而废的引用函数外,我会+1你。@cHao:我链接到它之前没有仔细查看该函数。我没有注意到它正在破坏数据。谢谢你向我指出这一点。我已经从我的answer.php7更新中删除了攻击性函数的链接:这个扩展在php5.5.0中被弃用,在php7.0.0中被删除。相反,应该使用MySQLi或PDO_MySQL扩展。此函数的替代方法包括:mysqli_real_escape_string、PDO::quote
$sql ="SELECT CustomerID FROM tblCustomer WHERE EmailAddress = ? COLLATE SQL_Latin1_General_CP1_CIAI AND Password = ? COLLATE SQL_Latin1_General_CP1_CSAS";