Panelen



Forumnavigering
Senast inloggade
RSS
Sponsorer

Forum > Övriga serverspråk > PHP

Sökfunktion

Erik
Erik

Gradering

#20632

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?

ID: #20632 | Skapades: 2011-01-19 22:31:11 | Tråden har 7 svar och har lästs 435 gånger.

voigtan
voigtan

Gradering

#20634

Samma sätt som du hämtar användarnanet när du presentera vem som har skrivit i forumet, en join fråga.

Hur man ställer en fråga: http://support.microsoft.com/kb/q555375
ID: #20634 | Skapades: 2011-01-19 22:49:51

Erik
Erik

Gradering

#20635

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.

Redigerades av Erik den 19 januari 2011. Läs tidigare inlägg.
ID: #20635 | Skapades: 2011-01-19 23:23:17

voigtan
voigtan

Gradering

#20636

Citerar Erik:

Något tips på var/hur jag ska placera in hämtningen från user?

Som jag skrev i förra inlägget, använd en JOIN sats för att hämta användarnamnet mot användarID på tråd inlägget, skriv inte en SQL fråga för att endast hämta ut användarnamnet, är en riktigt flaskhalls.

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.

 

Hur man ställer en fråga: http://support.microsoft.com/kb/q555375
Redigerades av voigtan den 20 januari 2011. Läs tidigare inlägg.
Redigerades av voigtan den 20 januari 2011. Läs tidigare inlägg.
ID: #20636 | Skapades: 2011-01-20 07:13:35

Erik
Erik

Gradering

#20638

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! (:

ID: #20638 | Skapades: 2011-01-20 17:18:05

Shadi
Shadi

Gradering

#20639

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);
?>

Administratör på AspKoll.se!
ID: #20639 | Skapades: 2011-01-21 09:36:55

voigtan
voigtan

Gradering

#20640

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.

Hur man ställer en fråga: http://support.microsoft.com/kb/q555375
Redigerades av voigtan den 21 januari 2011. Läs tidigare inlägg.
ID: #20640 | Skapades: 2011-01-21 09:59:45

Shadi
Shadi

Gradering

#20641

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.

Administratör på AspKoll.se!
ID: #20641 | Skapades: 2011-01-21 13:12:45
© Copyright 2007-2009 Shadi Domat | Version 3.0 | Sidkarta | Policy