簡體   English   中英

如何使用php在SQL查詢中轉義引號?

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

在這里查看答案:

如何使用PHP在SQL Server中轉義字符串?

您不應該真正地動態構建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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM