02. november 2007 - 13:50Der 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.
Denne side indeholder artikler med forskellige perspektiver på Identity & Access Management i private og offentlige organisationer. Artiklerne behandler aktuelle IAM-emner og leveres af producenter, rådgivere og implementeringspartnere.
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.
$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.
$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]";
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.
...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.
$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]";
$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?
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'])."'";
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.