Gå til innhold

Søkescript som søker i database


Anbefalte innlegg

Skrevet

Lager en enkel søkeside. Ønsker at det skal stå "ingen treff" eller noe liknende når spørringen som blir utført i databasen ikke finner noe. Får det ikke til.

 

Koden er:

 

<?php
/* 
Det nedenfor inkluderer filen functions.php som inneholder flere funksjoner, og setter inn variabler
slik at headeren og title blir definert her istedetfor
det som er forhåndsdefinert i funksjonen htmlstart
*/ 
include_once("smstbl_functions.php");
$GLOBALS[overskrift]="Søkeresultat";

htmlstart(); // Funksjonen htmlstart
dbconnect(); //Funksjonen dbconnect


// Variabel som henter søkeordet fra GET
$sok=$_GET['sok'];



// Hvis søkeordet er blankt, gir den feilmelding og avslutter. Viser også ny søkeboks
if ($sok == "")
 {
 echo "Vennligst skriv inn et søkeord.";

 echo '<br><br><br><br>Nytt søk:<br><br>';

echo '<form name="form" action="rch_sokresultat.php" method="get">
 <input type="text" name="sok"><br><br>
 <input type="submit" value="Søk">
</form>
</font></center></body></html>';
die(); //All php-aktivitet slutter

 }



// Spørringa som henter oppskriftid og navn fra tabell oppskrift og søker med wildcard på søkeord, og kun oppskrifter som er godkjent
$query="select oppskriftid,navn from oppskrift where navn like '%$sok%' AND godkjent = 1;"; 


//Melding som viser hva du søkte på
echo "Du søkte etter "$sok".";

echo '<br><br><br>';

echo "Resultater:<br><br><br><br>";

//Spørringen blir utført her
$result=mysql_query($query);


****************************
if($result=="0"){
echo 'Ingen treff på ditt søk, vennligst prøv på nytt.';
}
*****************************

//Denne while-loopen skriver ut resultatet av søket og legger til link
while($row = mysql_fetch_array($result))
{
  echo " <a href=jmj_vise_side_med_oppskrift.php?id=$row[oppskriftid]>$row[oppskriftid].  $row[navn]</A><br>";

}
//Nytt søk
echo '<br><br><br><br>Nytt søk:<br><br>';

echo '<form name="form" action="rch_sokresultat.php" method="get">
 <input type="text" name="sok"><br><br>
 <input type="submit" value="Søk">
</form>';

htmlstop();

?>

 

Alt fungerer bortsett fra det som står inni der det er merket med stjerne. Har prøvd $result==0, blankt, resource id #4 osv.

Og jaada, har sikkert gjort det tungvint og teit osv, men er n00b og skal ha det slik foreløpig. Hjelp meg med selve spørsmålet før dere kommer med forslag på nye script :p

 

Que que?

Videoannonse
Annonse
Skrevet

$num_rows = mysql_num_rows($result);

if($num_rows == NULL)

echo 'Ingen treff på ditt søk, vennligst prøv på nytt.';

 

 

Du kan da også bruke $num_rows til og vise hvor mange treff det faktisk var :)

Skrevet
$num_rows = mysql_num_rows($result);

if($num_rows == NULL)

echo 'Ingen treff på ditt søk, vennligst prøv på nytt.';

 

 

Du kan da også bruke $num_rows til og vise hvor mange treff det faktisk var :)

 

How?

 

Og takk for hjelpen, funker knall nå! :)

Skrevet (endret)
How?

 

Og takk for hjelpen, funker knall nå! :)

 

hmmm, om ikke jeg tar feil, så skal du vel kunne bruke: echo "Du fikk $num_rows treff på søket ditt.";

Endret av pulse
Skrevet (endret)
$num_rows = mysql_num_rows($result);

if($num_rows == NULL)

echo 'Ingen treff på ditt søk, vennligst prøv på nytt.';

 

 

...mysql_num_rows vil så langt jeg ser ut i fra dokumentasjonen aldri returnere null. Det vil enten returnere int eller false. Tallet 0 vil bli returnert om ingen treff intraff, false hvis det skjedde en feil (f.eks. ved å kjøre funksjonen etter en INSERT / UPDATE etc)

 

Med andre ord:

//****************************
if( mysql_num_rows($result) === 0 ){
echo 'Ingen treff på ditt søk, vennligst prøv på nytt.';
}
//*****************************

 

Ser også at du ikke escaper variabelen du bruker i SQL queryen, noe som er relativt farlig.

Hva skjer hvis noen sender inn i $sok:

'; DELETE FROM oppskrift; --

Den første ' avslutter LIKE strengen, ; avslutter SELECT kommandoen, og DELETE sletter alle radene i tabellen din. -- kommenterer ut det som står bak, altså "%$sok%' AND godkjent = 1;";" slik at det ikke skal skape noen feilmeldinger.

 

En annen mulighet for litt hacking er å sende som GET parameter:

minSøkestreng'; --

Som gjør noe litt mindre farlig: Finner alle oppskrifter som matcher, uansett om de er godkjent eller ikke. Hvis man sender inn % istedenfor minSøkestreng vil man tømme hele tabellen din. Ikke at dette virker som noen kritisk tabell å tømme men, kan jo være greit å sikre seg mot slikt uansett ;-)

 

Dette gjøres sikrere ved:

$sok = mysql_real_escape_string($_GET['sok']); som escaper tegn som har spesiell betydning i SQL som f.eks, '; osv slik at de ikke får lov til å avslutte strengen.

Endret av luxus
Skrevet
$num_rows = mysql_num_rows($result);

if($num_rows == NULL)

echo 'Ingen treff på ditt søk, vennligst prøv på nytt.';

 

 

...mysql_num_rows vil så langt jeg ser ut i fra dokumentasjonen aldri returnere null. Det vil enten returnere int eller false. Tallet 0 vil bli returnert om ingen treff intraff, false hvis det skjedde en feil (f.eks. ved å kjøre funksjonen etter en INSERT / UPDATE etc)

 

Med andre ord:

//****************************
if( mysql_num_rows($result) === 0 ){
echo 'Ingen treff på ditt søk, vennligst prøv på nytt.';
}
//*****************************

 

Ser også at du ikke escaper variabelen du bruker i SQL queryen, noe som er relativt farlig.

Hva skjer hvis noen sender inn i $sok:

'; DELETE FROM oppskrift; --

Den første ' avslutter LIKE strengen, ; avslutter SELECT kommandoen, og DELETE sletter alle radene i tabellen din. -- kommenterer ut det som står bak, altså "%$sok%' AND godkjent = 1;";" slik at det ikke skal skape noen feilmeldinger.

 

En annen mulighet for litt hacking er å sende som GET parameter:

minSøkestreng'; --

Som gjør noe litt mindre farlig: Finner alle oppskrifter som matcher, uansett om de er godkjent eller ikke. Hvis man sender inn % istedenfor minSøkestreng vil man tømme hele tabellen din. Ikke at dette virker som noen kritisk tabell å tømme men, kan jo være greit å sikre seg mot slikt uansett ;-)

 

Dette gjøres sikrere ved:

$sok = mysql_real_escape_string($_GET['sok']); som escaper tegn som har spesiell betydning i SQL som f.eks, '; osv slik at de ikke får lov til å avslutte strengen.

 

 

pulse, funket flott det også! :)

 

Og luxus, takk skal du ha, var ikke klar over det der. Har satt inn $sok = mysql_real_escape_string($_GET['sok']);

Er det nok da for at andre ikke skal kunne skrive inn egne spørringer da eller?

Skrevet
Og luxus, takk skal du ha, var ikke klar over det der. Har satt inn $sok = mysql_real_escape_string($_GET['sok']);

Er det nok da for at andre ikke skal kunne skrive inn egne spørringer da eller?

Det burde være nok ja, men en annen ting du burde tenkte på, hvis dette er en database som fler enn deg har tilgang til å skrive inn i, er cross site scripting faren.. Dvs at noen som skriver inn en oppskrift også baker inn (hoho, tørt ordspill ;-) ) HTML tags som f.eks. <script type="text/javascript">Ikke snill JS kode her</script>. Alle leserene som ser på den oppskriften vil ha browseren sin utføre et javascript som kan finne på å gjøre slemme ting. Løsningen på det er å bruke f.eks. htmlspecialchars() når data kommer ut igjen fra databasen på vei inn i HTML dokumentet.

Skrevet
Og luxus, takk skal du ha, var ikke klar over det der. Har satt inn $sok = mysql_real_escape_string($_GET['sok']);

Er det nok da for at andre ikke skal kunne skrive inn egne spørringer da eller?

Det burde være nok ja, men en annen ting du burde tenkte på, hvis dette er en database som fler enn deg har tilgang til å skrive inn i, er cross site scripting faren.. Dvs at noen som skriver inn en oppskrift også baker inn (hoho, tørt ordspill ;-) ) HTML tags som f.eks. <script type="text/javascript">Ikke snill JS kode her</script>. Alle leserene som ser på den oppskriften vil ha browseren sin utføre et javascript som kan finne på å gjøre slemme ting. Løsningen på det er å bruke f.eks. htmlspecialchars() når data kommer ut igjen fra databasen på vei inn i HTML dokumentet.

 

 

Okei, får se på det. Men alle oppskrifter skal godkjennes av administrator før de legges ut offentlig da :)

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...