PHP search displaying duplicate results that are nothing like query

The name of the pictureThe name of the pictureThe name of the pictureClash Royale CLAN TAG#URR8PPP



PHP search displaying duplicate results that are nothing like query



So I'm just trying to create a basic search bar to increase my php and mysql knowledge but I am seriously confused.



I have followed a tutorial and played around with the code myself but I am at a loss the search query kind of works it will display results but the results displayed are nothing like the search query it is displaying many duplicate results.



I have 2 different people with 2 different products linking to them and this is what it is showing.



enter image description here



And here is the query that I am searching.



enter image description here



and here is my code and I'm hoping someone with more knowledge might be able to help out, hoping its not just a simple mistake that I've made :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 &gt;

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



?>



Thank you very much in advance.





How are the forsale and user tables linked, there needs to be some common field which you use in your SELECT to tell it how to combine the rows.
– Nigel Ren
Aug 12 at 14:06


forsale


user





@NigelRen They are linked through a user_id relationship.
– Jonny Gina Dommett
Aug 12 at 14:08





@JonnyGinaDommett if they are linked through a user_id relationship, you should use "LEFT JOIN" clause in order to join them.
– southpaw93
Aug 12 at 14:11





Two reasons could have happened: wrong query OR query function return assoc and an array together. Let check your query directly with MySQL first. If the query has no problem, check your query function php.net/manual/en/mysqli-result.fetch-all.php (read more).
– Vuong
Aug 12 at 14:13





2 Answers
2



As a quick fix to check if it works, you need to link the two tables together using the user_id...


$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 ."%'"));



I would like to recommend moving to the newer JOIN format (https://dev.mysql.com/doc/refman/8.0/en/join.html) as well as looking into using prepared statements and bind variables.





Thanks Nigel, that worked. Why did that work and mine didn't? The only thing that is still not working tho is the search query displays Jonnydoby and not just results with Josh. Do you know why that is a thing?
– Jonny Gina Dommett
Aug 12 at 14:17





As I mentioned, you have to say how to link the two tables together, so your saying the item for sale is linked to the user selling it by the user_id. Second part - depends on what you pass in as $query will depend on the results it finds.
– Nigel Ren
Aug 12 at 14:19


$query





In your example, you have 'josh' and 'Josh' as the case doesn't match it won't find it, have a read of stackoverflow.com/questions/2876789/…
– Nigel Ren
Aug 12 at 14:21





Can it be matching something in the productname?
– Nigel Ren
Aug 12 at 14:23





So I should add in a uppercase/lowercase thing so It will always match. Thank you very much for this helped me out a lot. :)
– Jonny Gina Dommett
Aug 12 at 14:24



Try this:



$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 ."%'");


$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 ."%'");



You need to actually LEFT JOIN them in order for the query to work.


LEFT JOIN






By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

Popular posts from this blog

Firebase Auth - with Email and Password - Check user already registered

Dynamically update html content plain JS

How to determine optimal route across keyboard