Permalänk
Medlem

Sökfunktion [MySQL, PHP]

Skulle behöva lite hjälp med en sökfunktion i PHP/MySQL.

Det man ska kunna söka på är följande:

id
artist
album
tracklist
review
grade
writer
date

Alla dessa är fält i en databas vid namn "sm_light_reviews".

Just för tillfället ser min kod ut så här, men problemet är att den inte funkar (inte så värst förvånande, då jag aldrig skrivit en sökfunktion förut):

<?PHP include("modules/conn.php"); $conn = mysql_connect($mysql_hostname, $mysql_username, $mysql_password); $res = mysql_select_db($mysql_database); if (! $res) { exit("Kunde ej välja databas"); } if(isset($_GET['query'])){ mysql_query("SELECT * FROM `sm_light_reviews` WHERE `id` LIKE ". $_POST['id'] ." AND `artist` LIKE CONVERT( _utf8 '". $_POST['artist'] ."' USING latin1 ) COLLATE latin1_swedish_ci AND `album` LIKE CONVERT( _utf8 '". $_POST['album'] ."' USING latin1 ) COLLATE latin1_swedish_ci AND `tracklist` LIKE CONVERT( _utf8 '". $_POST['tracklist'] ."' USING latin1 ) COLLATE latin1_swedish_ci AND `review` LIKE CONVERT( _utf8 '". $_POST['review'] ."' USING latin1 ) COLLATE latin1_swedish_ci AND `grade` LIKE CONVERT( _utf8 '". $_POST['grade'] ."' USING latin1 ) COLLATE latin1_swedish_ci AND `writer` LIKE CONVERT( _utf8 '". $_POST['writer'] ."' USING latin1 ) COLLATE latin1_swedish_ci AND `date` LIKE CONVERT( _utf8 '". $_POST['date'] ."' USING latin1 ) COLLATE latin1_swedish_ci LIMIT 0 , 30"); } ?> <form action="modules/search.php?query" method="post"> <input type="text" id="id" value="ID" /> <input type="text" id="artist" value="Artist" /> <input type="text" id="album" value="Album" /> <input type="text" id="tracklist" value="Låt" /> <textarea id="review">Innehållssök</textarea> <input type="text" id="grade" value="Betyg" /> <input type="text" id="writer" value="Skribent" /> <input type="text" id="date" value="Datum" /> <input type="submit" value="Sök!" /> </form>

Fick lite gratishjälp av phpMyAdmin, det är därför det nog finns en del onödiga saker, som typ kollationering och CONVERT.

Nu behöver jag alltså hjälp med hur jag ska lägga upp detta så att det funkar. Någon som har nåt tips?

Visa signatur

What is your spaghetti policy around here?

Permalänk
Medlem

En lite lämpligare sql-fråga:

mysql_query("SELECT * FROM sm_light_reviews
WHERE
id LIKE '%$_POST[id]%' AND
artist LIKE '%$_POST[artist]%' AND
album LIKE '%$_POST[album]%' AND
tracklist LIKE '%$_POST[tracklist]%' AND
review LIKE '%$_POST[review]%' AND
grade LIKE '%$_POST[grade]%' AND
writer LIKE '%$_POST[writer]%' AND
dateLIKE '%$_POST[date]%'");

den här frågan måste man ju då fylla i typ alla fält, en normalare sökning söker man kanske bara med ett fält. då skulle det kunna se ut såhär:

mysql_query("SELECT * FROM sm_light_reviews
WHERE
id LIKE '%$_POST[searchstring]%' OR
artist LIKE '%$_POST[searchstring]%' OR
album LIKE '%$_POST[searchstring]%' OR
tracklist LIKE '%$_POST[searchstring]%' OR
review LIKE '%$_POST[searchstring]%' OR
grade LIKE '%$_POST[searchstring]%' OR
writer LIKE '%$_POST[searchstring]%' OR
dateLIKE '%$_POST[searchstring]%'");

ändra även alla id-attribut i inputtaggarna till name-attribut

hoppas det hjälper

Visa signatur

Alexander Engvall
Asus V2S [ c2d T7300 2.0GHz | 2GB ram | 8600M GS 256MB | 160GB hdd 5400rpm | 14,1" 1440*900 | Windows Vista Business ]

Permalänk
Medlem

Tack, det hjälpte en hel del. Jag fick det att fungera, men bara med $_GET['searchstring']. Jag vill ju kunna göra det genom att använda formuläret, och måste därför använda $_POST. Men när jag kör följande händer ingenting alls.

if (isset($HTTP_POST_VARS['submit'])){ $result = mysql_query("SELECT * FROM sm_light_reviews WHERE id LIKE '%$_POST[searchstring]%' OR artist LIKE '%$_POST[searchstring]%' OR album LIKE '%$_POST[searchstring]%' OR tracklist LIKE '%$_POST[searchstring]%' OR review LIKE '%$_POST[searchstring]%' OR grade LIKE '%$_POST[searchstring]%' OR writer LIKE '%$_POST[searchstring]%' OR date LIKE '%$_POST[searchstring]%'"); while($row = mysql_fetch_array($result, MYSQL_BOTH)){ echo ' <a href="?module=reviews&id='. $row['id'] .'">'.$row['artist'].' - '.$row['album'].'</a> <span style="color: #888;">av '. $row['writer'] .'</span><br />'; } } ?> <form action="?module=search" method="post"> <input type="text" name="searchstring" value="Söksträng" /> <input type="submit" value="Sök!" /> </form>

Visa signatur

What is your spaghetti policy around here?

Permalänk
Testpilot

Använd {} runt strängar som du vill ska tolkas som en enhet.

"id LIKE '%{$_POST['searchstring']}%' OR"

Kanske kan hjälpa.
Dock är det inte rekomenderat att ha POST-variabler direkt i SQL-frågan, finns folk som kan förstöra med så kallade SQL-injections då. Använd mysql_real_escape_string för att ta bort "farliga" tecken ur strängarna du tänker använda.

Visa signatur

Kolla gärna in min RGB-LED-ljusstake i galleriet
[Gigabyte GA-Z97MX-Gaming 5][Intel Core i5 4690K][Corsair XMS3 16GB][Asus GeForce RTX 2060 Super Dual Evo OC]

Permalänk
Medlem

Okej, hade jag ingen aning om. Men det fungerar fortfarande inte med ovanstående kod (med {} runt strängarna, som du skrev).

Exakt vad som händer kan du se på http://www.swedenmetal.info/?module=search

Visa signatur

What is your spaghetti policy around here?

Permalänk
Medlem

ändra

if (isset($HTTP_POST_VARS['submit']))

till

if (isset($_POST['searchstring']))

Visa signatur

Alexander Engvall
Asus V2S [ c2d T7300 2.0GHz | 2GB ram | 8600M GS 256MB | 160GB hdd 5400rpm | 14,1" 1440*900 | Windows Vista Business ]

Permalänk
Medlem

Jag löste det själv på ett annat vis, se på http://www.swedenmetal.info/?module=search

if($_POST['searchstring']){ header("Location: ?module=search&searchstring=". $_POST['searchstring']); } // Det var detta ovan som gjorde att det fungerade if(isset($_GET['searchstring'])){ $result = mysql_query("SELECT * FROM sm_light_reviews WHERE id LIKE '%{$_GET['searchstring']}%' OR artist LIKE '%{$_GET['searchstring']}%' OR album LIKE '%{$_GET['searchstring']}%' OR tracklist LIKE '%{$_GET['searchstring']}%' OR review LIKE '%{$_GET['searchstring']}%' OR grade LIKE '%{$_GET['searchstring']}%' OR writer LIKE '%{$_GET['searchstring']}%' OR date LIKE '%{$_GET['searchstring']}%'"); while($row = mysql_fetch_array($result, MYSQL_BOTH)){ echo ' <a href="?module=reviews&id='. $row['id'] .'">'.$row['artist'].' - '.$row['album'].'</a> <span style="color: #888;">av '. $row['writer'] .'</span><br />'; } } ?> <form action="?module=search" method="post">

Tack för hjälpen i alla fall!

Visa signatur

What is your spaghetti policy around here?

Permalänk
Medlem

no problem

Visa signatur

Alexander Engvall
Asus V2S [ c2d T7300 2.0GHz | 2GB ram | 8600M GS 256MB | 160GB hdd 5400rpm | 14,1" 1440*900 | Windows Vista Business ]