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();
对于 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();