Forum > Övriga serverspråk > PHP
Hej, jag håller på att göra en sökfunktion till ett forum. Problemet är att jag bara sparat id:t från den som postade tråden.I min sökfunktion har jag lagt till så man ska kunna välja mellan att söka bland trådrubrikerna eller trådskaparen.
Min kod: http://www.aspkoll.se/code/Index.asp?id=655
Hur ska jag skriva ut en query som jämför skapare_id i tabellen forum med id i tabellen user?
| Skriv utSamma sätt som du hämtar användarnanet när du presentera vem som har skrivit i forumet, en join fråga.
Men mitt stora problem är ju att jag måste göra om ett Användarnamn till id.
$query = mysql_query('SELECT * FROM forum WHERE '.$_POST['typ'].' LIKE "%'.$_POST['sok'].'%"');
Så ser min query ut för att hämta ut sök resultat. Svårt att förklara men sok strängen måste ju göras om innan den kommer till queryn ovan. Har försökt i några timmar nu xD
Något tips på var/hur jag ska placera in hämtningen från user?
Har provat redigera koden till detta: http://www.aspkoll.se/code/Index.asp?id=657
Men tycks inte bli någon skillnad.
Något tips på var/hur jag ska placera in hämtningen från user?
http://www.w3schools.com/sql/sql_join.asp
ser även att du har samma namn på trådID som du har för userId på tabellerna, så då få du kolla på alias också för att inte skapa en konflikt där.
Tackar!
Löste det så här:
$typ = $_POST['typ'];
if($typ == 'user.anvnamn') {
$query = mysql_query('SELECT * FROM forum LEFT JOIN user ON forum.skapare_id=user.id WHERE user.anvnamn LIKE "%'.$_POST['sok'].'%"');
} elseif($typ == 'forum.rubrik') {
$query = mysql_query('SELECT * FROM forum LEFT JOIN user ON forum.skapare_id=user.id WHERE forum.rubrik LIKE "%'.$_POST['sok'].'%"');
}
Det funkar dock inte så snyggt med if-satsen pga att man tydligen inte kunde sätta $typ efter WHERE.
Tack voigtan! (:
Varför går det inte att sätta in $typ efter WHERE? Jag använder liknande metoder ganska ofta faktiskt. Nu testar jag att skriva lite kod här, du kan kontrollera den och testa den
<?php
$mySql = "SELECT *
FROM forum
LEFT JOIN user ON forum.skapare_id = user.id
WHERE ".$typ." = LIKE '%".$sokord."%'";
$query = mysql_query($mySql);
?>
Känns inte som en jätte smart idé Shadi, känns som det är ett enkelt sätt att kunna göra lite större skada i databasen, om nu $typ är något klient användaren kan styra på något sätt.
Sen bör du aldrig använda * Erik, jag har nog påpekat det ett par gånger, prestanda + det kan ställa till oönskat resultat speciellt på en join sats.
Exempel:
Vi har en databas som ser ut:
Users
- ID
- Name
- Password
Posts
- ID
- Name
Om du hämtar * så kommer den i en JOIN sats hämta ut allt från users + posts vilket kommer ge dig en konflikt då ID och Name finns i båda tabellerna så om du försöker skriva ut ID så kommer den ge dig lite oönskat resultat, kolla på hur man jobbar med fält (Alias) och hämta endast ut de fält du verkligen behöver i dina frågor.
Koden jag skrev är i utbildningssyfte, inte för skarpanvändning :). Säkerheten lämnar jag utanför då det inte är det som diskuteras. Jag använder mig av liknande funktionalitet, men med säkerhetsåtgärder förståss, och det fungerar mer än väl.
Allt beror på hur systemet är uppbyggt. Om $typ = $_POST['typ'] så blir det farligt ja. Men om värdet på $typ bestäms av en kontrollfråga som baseras på $_POST['typ'] så blir det säkrare. Jag själv har en klass som jag skickar in allt till och som tar hand om alla värden automatiskt, t.ex.:
<?php
$id = (isset($_POST['id']) && is_numeric($_POST['id'])) ? $_POST['id'] : 'NULL';
$result = $sql->query("SELECT ? FROM forum WHERE ? = ?", "username", "userid", $id); ?>
Där behöver jag inte ens kontrollera värdet mer än vad jag gjort innan jag skickar in det till SQL Query, utan klassen sköter allt automatiskt, vilket underlättar en hel del. En liten avstickare :)
Sen måste jag också trycka på det som voigtan skrev, och det är att vara försiktig med * såvida du inte vet att det inte sänker prestandan.