我在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。
有什么建议吗?
答案 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());