你如何使用PHP在SQL查询中转义引号?

时间:2010-07-15 05:16:14

标签: 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 EmailAddress = 'test@ab\'c.com' AND Password = '123'

如果我们在mysql服务器中执行它,它可以工作,但不能在sql server

中执行

这是什么解决方案? 。我使用sql server

4 个答案:

答案 0 :(得分:19)

addslashes()将使用前导反斜杠转义单引号,该反斜杠是MySQL中的有效语法,但不在MS SQL Server中。在MS SQL Server中转义单引号的正确方法是使用另一个单引号。使用mysql_real_escape_string()用于MySQL(mysql_escape_string()已被弃用)。遗憾的是,不存在类似的mssql_函数,因此您必须使用str_replace()preg_replace()或类似的东西来推广自己的函数。更好的是,使用数据库中立的抽象层,例如支持参数化查询的PDO。

答案 1 :(得分:6)

对于MySQL,您想使用mysql_real_escape_stringaddslashes几乎完全相同,字母较少,但显然它有些错误 - 不要使用它。

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

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

答案 2 :(得分:4)

mysql

USE mysql_real_escape_string

http://php.net/manual/en/function.mysql-real-escape-string.php

喜欢:

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

mssql

在这里查看答案:

How to escape strings in SQL Server using PHP?

答案 3 :(得分:2)

你不应该真正动态地构建SQL语句,因为它是危险的(并且是不必要的)。正确的做法是使用paramerised查询,请参阅http://msdn.microsoft.com/en-us/library/cc296201%28SQL.90%29.aspx

$sql ="SELECT CustomerID FROM tblCustomer WHERE EmailAddress = ? AND Password = ?";
$stmt = sqlsrv_query( $conn, $sql, array($_POST['username'], $_POST['password']));

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

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