[英]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.