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