代码之家  ›  专栏  ›  技术社区  ›  James Gayle

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

  •  0
  • James Gayle  · 技术社区  · 10 年前

    对于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
    

    如果newsupplier_request表的manager列中出现了该行数据的manager名称,我将使用下面的mysql查询来授予管理员权限(已登录)以查看某些内容

    $_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);
    

    由于某种原因,如果姓氏不包含撇号,这很好,但因为我在查询中检查时,由于某种原因这个经理的姓是奥布莱恩,所以它失败了,因为它很难读取名字中的撇号,如果我将亨利的姓改为类似于詹姆斯的名字,那么它就会起作用。有人能解释一下我做错了什么吗?谢谢

    3 回复  |  直到 10 年前
        1
  •  1
  •   Blackus    9 年前

    你应该考虑使用 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();
    
        2
  •  0
  •   prava    10 年前

    选中此项:

    $_SESSION['username'] = mysqli_real_escape_string($conn, internal_users.user_first_name);
    $_SESSION['username2'] = mysqli_real_escape_string($conn, internal_users.user_last_name);
    
        3
  •  0
  •   aergistal    10 年前

    通过 $conn->real_escape_string($user) 而不是 $user 在查询中。您不应该在查询中直接使用变量值而不强制执行类型或对其进行转义,因为这样会使代码容易受到SQL注入攻击。

    enter image description here