PHP 搜索显示与查询完全不同的重复结果
PHP search displaying duplicate results that are nothing like query
所以我只是想创建一个基本的搜索栏来增加我的 php 和 mysql 知识,但我很困惑。
我遵循了一个教程并自己尝试了代码,但我不知道搜索查询会显示结果,但显示的结果与显示许多重复结果的搜索查询完全不同。
我有 2 个不同的人有 2 个不同的产品链接到他们,这就是它所显示的。
这是我正在搜索的查询。
这是我的代码,我希望有更多知识的人能够提供帮助,希望这不仅仅是我犯的一个简单错误:O
<?php
$query = $_GET['q'];
// gets value sent over search form
$min_length = 3;
// you can set minimum length of the query if you want
if(strlen($query) >= $min_length){ // if query length is more or equal minimum length then
$query = htmlspecialchars($query);
// changes characters used in html to their equivalents, for example: < to >
$query = mysql_real_escape_string($query);
// makes sure nobody uses SQL injection
$raw_results = DB::query("SELECT * FROM forsale, users WHERE forsale.productname LIKE '%" . $query . "%' OR users.username LIKE '%" . $query ."%'");
if (count($raw_results) > 0) {
foreach($raw_results as $results) {
echo $results['productname'];
echo $results['username'];
echo $results['price'];
}
}else{ // if there is no matching rows do following
echo "No results";
}
}else{ // if query length is less than minimum
echo "Minimum length is ".$min_length;
}
?>
非常感谢您。
作为检查其是否有效的快速修复,您需要使用 user_id...
link 将两个表放在一起
$raw_results = DB::query("SELECT *
FROM forsale, users
WHERE forsale.user_id = users.user_id
and (forsale.productname LIKE '%" . $query . "%'
OR users.username LIKE '%" . $query ."%'"));
我想建议转向更新的 JOIN 格式 (https://dev.mysql.com/doc/refman/8.0/en/join.html) 以及研究使用准备好的语句和绑定变量。
试试这个:
$raw_results = DB::query("SELECT f.* FROM forsale f LEFT JOIN users u ON f.user_id = u.id WHERE f.productname LIKE '%" . $query . "%' OR u.username LIKE '%" . $query ."%'");
您实际上需要 LEFT JOIN
它们才能使查询正常工作。
所以我只是想创建一个基本的搜索栏来增加我的 php 和 mysql 知识,但我很困惑。
我遵循了一个教程并自己尝试了代码,但我不知道搜索查询会显示结果,但显示的结果与显示许多重复结果的搜索查询完全不同。
我有 2 个不同的人有 2 个不同的产品链接到他们,这就是它所显示的。
这是我正在搜索的查询。
这是我的代码,我希望有更多知识的人能够提供帮助,希望这不仅仅是我犯的一个简单错误:O
<?php
$query = $_GET['q'];
// gets value sent over search form
$min_length = 3;
// you can set minimum length of the query if you want
if(strlen($query) >= $min_length){ // if query length is more or equal minimum length then
$query = htmlspecialchars($query);
// changes characters used in html to their equivalents, for example: < to >
$query = mysql_real_escape_string($query);
// makes sure nobody uses SQL injection
$raw_results = DB::query("SELECT * FROM forsale, users WHERE forsale.productname LIKE '%" . $query . "%' OR users.username LIKE '%" . $query ."%'");
if (count($raw_results) > 0) {
foreach($raw_results as $results) {
echo $results['productname'];
echo $results['username'];
echo $results['price'];
}
}else{ // if there is no matching rows do following
echo "No results";
}
}else{ // if query length is less than minimum
echo "Minimum length is ".$min_length;
}
?>
非常感谢您。
作为检查其是否有效的快速修复,您需要使用 user_id...
link 将两个表放在一起$raw_results = DB::query("SELECT *
FROM forsale, users
WHERE forsale.user_id = users.user_id
and (forsale.productname LIKE '%" . $query . "%'
OR users.username LIKE '%" . $query ."%'"));
我想建议转向更新的 JOIN 格式 (https://dev.mysql.com/doc/refman/8.0/en/join.html) 以及研究使用准备好的语句和绑定变量。
试试这个:
$raw_results = DB::query("SELECT f.* FROM forsale f LEFT JOIN users u ON f.user_id = u.id WHERE f.productname LIKE '%" . $query . "%' OR u.username LIKE '%" . $query ."%'");
您实际上需要 LEFT JOIN
它们才能使查询正常工作。