Avatar billede pemo123456 Novice
28. maj 2011 - 10:45 Der er 7 kommentarer og
1 løsning

Problemer med if / else filtrering af dataudtræk fra MySQL db.

Hej

Jeg forsøger at lave en filtrering af et MySQL udtræk ved hjælp af 3 if / else. De første 2 virker fint, men den tredje virker ikke som den skal, da den tager mere end bedrooms=1 med eksempelvis bedrooms=2 og bedrooms=3. Meningen er, at den kun skal lave udtræk, hvor bedroom=1.


Hvad gør jeg forkert, og er der en bedre/smartere måde at lave filtreringen på

På side 1 har jeg disse filtreringsparametre:

<?
$_SESSION['filter_1'] = "Apartment for Rent";
$_SESSION['filter_2'] = "Villa for Rent";
$_SESSION['filter_3'] = 1;
?>

På side 2 forsøger jeg mig med følgende script (har bare taget det væsentlige med, da scriptet virker så langt at første 2 if/else filtrerer fint, mens tredje tager mere end 1 bedroom med):

<?php

  $filter_1 = $_SESSION['filter_1'];
  $filter_2 = $_SESSION['filter_2'];
  $filter_3 = $_SESSION['filter_3'];

  $choise_1 = $row["property_type"];
  $choise_2 = $row["property_type"];   
  $choise_3 = $row["bedrooms"];

if ( $filter_1 == $choise_1 ) {
    $filt_1 = "";
} else {
    $filt_1 = "property_type='$filter_1'";
}

if ( $filter_2 == $choise_2 ) {
    $filt_2 = "";
} else {
    $filt_2 = "|| property_type='$filter_2'";         
}

if ( $filter_3 == $choise_3 ) {
    $filt_3 = "";
} else {
    $filt_3 = "&& bedrooms='$choise_3'";         
}

$sqlCommand = "SELECT * FROM propertyinfo WHERE $filt_1 $filt_2 $filt_3 ORDER BY prop_price_sort ASC";

....
.... ?>
Avatar billede welcor Nybegynder
28. maj 2011 - 11:12 #1
to ting:
brug (x || y) && z
- ellers bliver z aldrig udført når x er sand.

Og så SKAL du escape dine verdier før du kommer dem ind i en sql-sætning. msql_real_escape_string() er din ven her.
Avatar billede welcor Nybegynder
28. maj 2011 - 11:15 #2
Prøv evt dette:

$sqlCommand = "SELECT * FROM propertyinfo WHERE ($filt_1|| $filt_2) && $filt_3 ORDER BY prop_price_sort ASC"

og så lad filtrene være enten "bedrooms=1" eller "1=1".
Avatar billede pemo123456 Novice
28. maj 2011 - 11:25 #3
Hej

Tak for dit svar. Og undskyld et måske lidt banalt spørgsmål, men hvor skal jeg sætte

msql_real_escape_string()

ind?
Avatar billede pemo123456 Novice
28. maj 2011 - 12:21 #4
jubii

Nu kører det uden if / else, og hvor jeg blot bruger denne:

$sqlCommand = "SELECT * FROM propertyinfo WHERE (property_type='$filter_1' || property_type='$filter_2') && bedrooms='$filter_3' ORDER BY prop_price_sort ASC";

Smid et svar, så er der point på vej. :-)
Avatar billede welcor Nybegynder
28. maj 2011 - 16:21 #5
Brug

$filter_1 = mysql_real_escape_string($_SESSION['filter_1']);
..

Typisk vil disse sessionvariable bare blive sat af dig selv, så det er ikke SÅ farligt. Men tænk hvis nogen læste dette og brugte $_GET[] eller $_POST[] i deres kode ... så åbner de for sql injection (google dette) angreb.
Avatar billede pemo123456 Novice
28. maj 2011 - 16:44 #6
Hvis jeg forstår dig rigtigt, så er det en rigtig god idé eller måske nærmere en nødvendighed, at jeg ændre alle mine kald af sessioner til det du skriver f.eks.

$filter_1 = mysql_real_escape_string($_SESSION['filter_1']);
$filter_2 = mysql_real_escape_string($_SESSION['filter_2']);
$filter_3 = mysql_real_escape_string($_SESSION['filter_3']);

i stedet for som jeg har dem på nuværende tidspunkt eller indtil nu! :-)

  $filter_1 = $_SESSION['filter_1'];
  $filter_2 = $_SESSION['filter_2'];
  $filter_3 = $_SESSION['filter_3'];
Avatar billede pemo123456 Novice
28. maj 2011 - 17:10 #7
Hej

Måske jeg lige kan nå at klemme et lille ekstra spørgsmål ind.

I forlængelse af mit spørgsmål i #6, skal jeg så gøre noget tilsvarende af hensyn til sikkerhed, hvis jeg bruger _GET eller _POST eller _REQUEST?

Og i øvrigt tak for hjælpen (fik jeg vist ikke skrevet).
Avatar billede welcor Nybegynder
28. maj 2011 - 17:46 #8
hvis du har tænkt dig at putte dine variabler ind i et sql-script, skal du først escape dem. Hvis de ikke skal i et sql-script, er der måske andre ting du bøær ha i tankerne.

Er der for eksempel ting jeg skriver ind på dit site som kan ses af andre? så skal du escape html i det før du skriver det ud til dem. For eksempel bliver html escapet her på sitet (sådan at <script>alert("!");</script> ikke bliver kørt for dig).
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester