我有一个查询
$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
答案 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_string
。 addslashes
几乎完全相同,字母较少,但显然它有些错误 - 不要使用它。
对于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
在这里查看答案:
答案 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";