mysql:没有从数据库中的varchar列读取撇号?

时间:2015-03-13 09:34:17

标签: php mysql apostrophe

我有new_supplier_request的下表:

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因为某些原因在我查询我的查询时它失败了,因为它很难阅读撇号在名字中,如果我将亨利的姓改变为像詹姆斯这样的东西那么它就有效了。有谁可以解释我做错了什么?感谢

3 个答案:

答案 0 :(得分: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();

答案 1 :(得分: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);

答案 2 :(得分:0)

在查询中传递$conn->real_escape_string($user)而不是$user。您不应该直接在查询中使用变量值而不强制执行类型或转义它们,因为您将使代码容易受到SQL注入攻击。

enter image description here