Avatar billede mac10 Nybegynder
02. november 2007 - 13:50 Der er 20 kommentarer og
1 løsning

SELECT via forskellige GET's?

Hej alle

Jeg har en lille tricky en jeg ikke ved, hvordan jeg skal håndtere.

Jeg bruger en $_GET til at få noget data.

Der er tale om 2 data. "Navn" og "alder". Men begge to behøver ikke nødvendigvis blive valgt.

Lad os sige man skriver index.php?navn=john&alder=20 så skal den finde alle der hedder john som er 20. Hvis man bare skriver index?navn=john så skal den finde alle der hedder john i alle aldre.

Hvordan gør man dette?
Avatar billede pidgeot Nybegynder
02. november 2007 - 14:00 #1
Opbyg din SQL dynamisk i en variabel ved at checke på de enkelte ting om de skal med, og så tilføje dem til din SQL-streng som nødvendigt. Efter du har gjort det, sender du bare den streng du har genereret afsted som normalt.
Avatar billede mac10 Nybegynder
02. november 2007 - 14:04 #2
Kan jeg evt. få et kode eksempel?
Avatar billede pidgeot Nybegynder
02. november 2007 - 14:08 #3
$sql='SELECT * FROM tabel WHERE 1'
if (isset($_GET['navn'))
  $sql.=" AND navn = '".mysql_real_esacpe_string($_GET['navn'])."'";
if (isset($_GET['alder'))
  $sql.=" AND alder = '".mysql_real_escape_string($_GET['alder'])."'";

...

mysql_query($sql);

Samme princip for flere felter. Det ekstra 1-tal er for at gøre koden en lille smule simplere - så skal du ikke holde styr på om du allerede har tilføjet en betingelse og dermed skal smide en AND med ind.
Avatar billede nielle Nybegynder
02. november 2007 - 14:15 #4
Eller sådan:

$sql = 'SELECT * FROM tabel'

$whereArr = array();

if (isset($_GET['navn'))
    $whereArr[] = "navn = '" . mysql_real_escape_string($_GET['navn']) . "'";

if (isset($_GET['alder'))
    $whereArr[] = "alder = '" . mysql_real_escape_string($_GET['alder']) . "'";

$whare = implode(' AND ', $whereArr);
if ($where != "")
    $where = ' WHERE ' . $where;

$sql .= $where;
Avatar billede mac10 Nybegynder
02. november 2007 - 14:16 #5
Parse error: syntax error, unexpected T_IF

:S
Avatar billede mac10 Nybegynder
02. november 2007 - 14:21 #6
nielle, med din får jeg:

Parse error: syntax error, unexpected T_VARIABLE på "$whereArr = array();
" linjen
Avatar billede michael_stim Ekspert
02. november 2007 - 14:23 #7
$whare = implode(' AND ', $whereArr);
til
$where = implode(' AND ', $whereArr);
Avatar billede mac10 Nybegynder
02. november 2007 - 14:24 #8
Ja så også lige den michael, men stadigvæk samme fejl :S
Avatar billede pidgeot Nybegynder
02. november 2007 - 14:24 #9
Der skulle selvfølgelig lige en ; ind efter den første linje.
Avatar billede mac10 Nybegynder
02. november 2007 - 14:27 #10
Ja og
if (isset($_GET['navn'))
skal være
if (isset($_GET['navn']))

Men nu siger den

Fatal error: Call to undefined function mysql_real_esacpe_string()

på denne linje

  $sql.=" AND genre = '".mysql_real_esacpe_string($_GET[navn])."'";
Avatar billede mac10 Nybegynder
02. november 2007 - 14:30 #11
Du havde skrevet
mysql_real_esacpe_string
istedet for
mysql_real_escape_string

Men den viser stadigvæk samme fejl :S
Avatar billede mac10 Nybegynder
02. november 2007 - 14:33 #12
Men det du beder den om med den kommando hvis begge bliver valgt er jo:
SELECT * FROM stations WHERE AND name = "navn" AND alder = "alder"

Den kan da ikke lave WHERE and ?
Avatar billede nielle Nybegynder
02. november 2007 - 14:33 #13
Hvordan ser koden ud lige nu?
Avatar billede mac10 Nybegynder
02. november 2007 - 14:38 #14
Har prøvet at lave lidt om på pidgeot's kode:

$sql='SELECT * FROM personer WHERE';
if (isset($_GET['navn']))
  $sql.=" navn = '".mysql_real_escape_string($_GET['navn'])."'";
elseif (isset($_GET['alder']))
  $sql.=" alder = '".mysql_real_escape_string($_GET['alder'])."'";
elseif (isset($_GET['navn']) && $_GET['alder'])
  $sql.=" navn = $_GET[navn] AND alder= $_GET[alder]";

              while($row = mysql_fetch_array($sql)){

Men virker heller ikk
Avatar billede pidgeot Nybegynder
02. november 2007 - 14:43 #15
Nej, min ville komme med SELECT * FROM stations WHERE 1 AND name = "navn" AND alder = "alder" - hvilket svarer til SELECT * FROM stations WHERE name = "navn" AND alder = "alder".

Fordelen er at du kun henviser til feltet en gang, og dermed holder kompleksiteten lav - for det bliver jo et helvede hvis du skal holde styr på alle de muligheder det kan kombineres på når der kommer flere felter til, ikke mindst fordi man også skal huske escaping alle de steder.

Derudover så kører du ikke queryen med mysql_query i din udgave af koden, hvilket du jo er nødt til først.
Avatar billede mac10 Nybegynder
02. november 2007 - 14:46 #16
Forstår det slet ikke når det bliver så indviklet :D

Når jeg har indsat mysql_query efter $sql= hvor indsætter jeg så at den skal slutte?
Avatar billede pidgeot Nybegynder
02. november 2007 - 14:49 #17
...at hvad skal slutte? Det er ikke spor anderledes end ethvert andet SQL-træk - udover at i stedet for du skriver SQL'en direkte som parameter til mysql_query, laver du den i en variabel.
Avatar billede mac10 Nybegynder
02. november 2007 - 14:52 #18
Ja normalt gør jeg sådan:

$sql = mysql_query("SELECT * FROM personer WHERE navn = $_GET[navn]") or die(      mysql_error());

Men hvor skal jeg slutte query´en af henne?


$sql= mysql_query('SELECT * FROM personer WHERE';
if (isset($_GET['navn']))
  $sql.=" navn = '".mysql_real_escape_string($_GET['navn'])."'";
elseif (isset($_GET['alder']))
  $sql.=" alder = '".mysql_real_escape_string($_GET['alder'])."'";
elseif (isset($_GET['navn']) && $_GET['alder'])
  $sql.=" navn = $_GET[navn] AND alder= $_GET[alder]";

Hvor skal jeg slutte den med ') til sidst?
Avatar billede mac10 Nybegynder
02. november 2007 - 15:02 #19
Nu har jeg prøvet med

$sql = "mysql_query('SELECT * FROM personer WHERE 1";
if (isset($_GET['navn']))
  $sql.=" AND navn = '".mysql_real_escape_string($_GET['navn'])."'";
if (isset($_GET['alder']))
  $sql.=" AND alder = '".mysql_real_escape_string($_GET['alder'])."'";
  $sql.="');";

Virker stadigvæk ikk. Fatter slet ikk det her :S

Er der ikk en der kan give en færdig kode der virker inden jeg går psykisk ned?
Avatar billede mac10 Nybegynder
02. november 2007 - 15:18 #20
Nå så fik jeg endelig udfordret "eksperterne" og fandt selv svaret (efter lidt hjælp selvfølgelig)

$sql='SELECT * FROM profiler WHERE 1';
if (isset($_GET['navn']))
  $sql.=" AND navn = '".mysql_real_escape_string($_GET['navn'])."'";
if (isset($_GET['alder']))
  $sql.=" AND alder = '".mysql_real_escape_string($_GET['alder'])."'";
 
$foresp = mysql_query("$sql");
while($row = mysql_fetch_array($foresp)){


Lav svar tak
Avatar billede michael_stim Ekspert
02. november 2007 - 15:41 #21
Kommentar: pidgeot
02/11-2007 14:49:09
;o)
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