2015-03-13 73 views
0

我有new_supplier_request如下表:mysql:撇號不從數據庫中的varchar列讀取?

Id | ref | User | Manager (Varchar) 
1  12  James  Henry O'Brien 

我也有我的internal_users表:

Id | User_firs_name | user_last_name(Varchar)  
1  Henry    O'Brien 

我使用下面的MySQL查詢給經理的權限(誰是登錄)到如果在我的new_supplier_request表的manager列中出現管理員名稱,則查看一些內容

$_SESSION['username'] = internal_users.user_first_name 
$_SESSION['username2'] = internal_users.user_last_name 
$user = $_SESSION['username']." ".$_SESSION['username2']; 

$sql34 = "select * from new_supplier_request, internal_users where new_supplier_request.status!= 'complete' and new_supplier_request.action_taken ='none' AND new_supplier_request.user_id = internal_users.user_id AND requestee_manager = '$user'"; 
$result = $conn->query($sql34); 

由於某種原因,如果姓氏不包含撇號,這可以正常工作,但由於某些原因,當我檢查我的查詢時,此經理的姓氏是O'Brien,因此無法閱讀名稱中的撇號,如果我把亨利的姓改成詹姆斯那樣的話,那麼它就會起作用。有人能解釋我做錯了什麼嗎?由於

+0

使用'mysqli_real_escape_string' – prava 2015-03-13 09:35:52

+0

您使用MySQLi的,所以要學會使用綁定變量....然後你不必擔心轉義特殊字符,如引號 – 2015-03-13 09:37:27

+0

這時候,你不」,你會得到什麼使用預先準備好的語句 – 2015-03-13 09:55:04

回答

0

檢查這一項:

$_SESSION['username'] = mysqli_real_escape_string($conn, internal_users.user_first_name); 
$_SESSION['username2'] = mysqli_real_escape_string($conn, internal_users.user_last_name); 
+1

你應該建議使用準備好的語句而不是字符串轉義,真的。 – 2015-03-13 09:55:56

0

$conn->real_escape_string($user)而不是在查詢$user。您不應該直接在查詢中使用變量值,也不要強制使用類型或轉義它們,因爲您將使代碼易受SQL注入攻擊的影響。

enter image description here

1

您應該考慮使用PDO的用綁定參數準備好的語句。

這樣,你的請求會更安全,並且應該解決很多字符串參數問題。

$query = $pdo->prepare(' 
select * 
from new_supplier_request, internal_users 
where new_supplier_request.status <> :status 
and new_supplier_request.action_taken = :action_taken 
AND new_supplier_request.user_id = internal_users.user_id 
AND requestee_manager = :user 
'); 

$query->bindValue(':status', 'complete'); 
$query->bindValue(':action_taken', 'none'); 
$query->bindValue(':user', $user); 

$query->execute(); 

$results = $query->fetchAll(); 
+0

mysqli對準備語句有類似的方法 – 2015-03-13 09:55:22

+0

我完全同意你的看法,但是根據我的說法,使用命名參數和準備語句更容易使用(和閱讀)PDO。它也更靈活,但這不是這裏的主題。 – Blackus 2015-03-13 09:58:27