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

mysql: apostrophe not being read from varchar column in database?

对于 new_supplier_request 我有以下 table:

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

我也有我的 internal_users table:

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

我正在使用以下 mysql 查询授予管理员权限(已登录)查看某些内容,如果管理员姓名出现在我的 [=22] 的管理员列中的该行数据=] table

$_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,当我检查我的查询时,它失败了,因为它难以阅读名称中的撇号,如果我将亨利的姓氏更改为詹姆斯之类的名字,那么它就可以了。有人可以解释我做错了什么吗?谢谢

检查这个:

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

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

您应该考虑使用 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();