2015-03-13 30 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

相关问题