PHP中的搜索查询问题

时间:2013-09-26 15:52:10

标签: php

我在PHP中有一个搜索查询,您可以在用户数据库中搜索。重要的是只有连接到一个特定ID(w_id)的用户才能显示。每个用户都有一个。换句话说,我不希望其他管理员看到不属于搜索者的客户。

所以我为每个用户指定了一个w_id。 我的问题是看起来我的查询忽略了这一点。

这是我的代码。

   $raw_search_results = mysqli_query($con,"SELECT * FROM customers
   WHERE (`firstname` LIKE '%".$search."%') 
   OR (`lastname` LIKE '%".$search."%')
   OR (`adress` LIKE '%".$search."%')
   OR (`email` LIKE '%".$search."%') AND w_id='$webshop_info[w_id]' limit 0,50")
   or die(mysqli_error());

此代码显示w_id 4,3,6等所有用户,但应该只有1的用户,因为$webshop_info[w_id]定义为1。

有什么建议吗?

5 个答案:

答案 0 :(得分:4)

使用括号对所有'OR'语句进行分组:

SELECT * FROM customers WHERE (... OR ... OR ...) AND ... 

您可以阅读有关运算符优先级here的更多信息。

答案 1 :(得分:2)

将您的查询更改为:

SELECT *
FROM customers
WHERE ((`firstname` LIKE '%".$search."%')
  OR (`lastname` LIKE '%".$search."%')
  OR (`adress` LIKE '%".$search."%')
  OR (`email` LIKE '%".$search."%'))
  AND (w_id='$webshop_info[w_id]') LIMIT 0, 50

请注意where ( (condition1) or (condition2)) & (condition)

请注意,您的代码容易受到SQL注入攻击,并与利益相关者一起使用准备好的查询。

例如:(请不要复制此代码,仅提供解释)

$query = 'SELECT *
FROM customers
WHERE (
  (`firstname` LIKE ?)
  OR (`lastname` LIKE ?)
  OR (`adress` LIKE ?)
  OR (`email` LIKE ?)
  )
  AND (w_id=?) 
  LIMIT 0, 50';


    $stmt = $mysqli->prepare($query);

    $stmt->bind_param("s", '%'.$search.'%');
    $stmt->bind_param("i", $w_id);

    $search = $_GET['search'];;
    $w_id = $webshop_info['w_id'];

    $stmt->execute();

答案 2 :(得分:0)

试试这个:

SELECT *
FROM customers
WHERE ((`firstname` LIKE '%".$search."%')
  OR (`lastname` LIKE '%".$search."%')
  OR (`adress` LIKE '%".$search."%')
  OR (`email` LIKE '%".$search."%'))
  AND (w_id='{$webshop_info[w_id]}') LIMIT 0, 50

你必须有花括号。

答案 3 :(得分:0)

尝试此查询(引号之间的'w_id'):

"SELECT * FROM customers
   WHERE (`firstname` LIKE '%".$search."%' 
   OR `lastname` LIKE '%".$search."%'
   OR `adress` LIKE '%".$search."%'
   OR `email` LIKE '%".$search."%') AND w_id=". $webshop_info['w_id'] ." limit 0,50"

答案 4 :(得分:0)

为什么'%'。$ search。“%' 另外,将你的OR组合在()

$raw_search_results = mysqli_query($con,"SELECT * FROM customers
       WHERE (`firstname` LIKE '%$search%' 
       OR `lastname` LIKE '%$search%'
       OR `adress` LIKE '%$search%'
       OR `email` LIKE '%$search%') AND w_id='$webshop_info[w_id]' limit 0,50")
       or die(mysqli_error());