[英]How do you escape quotes in a sql query using php?
我有一个查询
$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
addslashes()
会在单引号前加上反斜杠,这在MySQL中有效,但在MS SQL Server中无效。 在MS SQL Server中转义单引号的正确方法是使用另一个单引号。 对MySQL使用mysql_real_escape_string()
mysql_escape_string()
已弃用mysql_escape_string()
)。 不幸的是,不存在类似的mssql_
函数,因此您必须使用str_replace()
, preg_replace()
或类似的东西来滚动自己的函数。 更好的是,使用支持参数化查询的数据库中性抽象层(例如PDO)。
对于MySQL,您想使用mysql_real_escape_string
。 addslashes
几乎做同样的事情,并且字母更少,但是显然它弄错了一些东西,请不要使用它。
对于SQL Server,它有点复杂,因为(1)MySQL非标准地引用内容,(2)我看不到为SQL Server引用内容的函数。 但是,以下应为您工作...
$escaped_str = str_replace("'", "''", $unsafe_str);
对于mysql
使用mysql_real_escape_string
http://php.net/manual/zh/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
在这里查看答案:
您不应该真正地动态构建SQL语句,因为它很危险(也是不必要的)。 正确的做法是使用参数化查询,请参阅http://msdn.microsoft.com/zh-cn/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";
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.