dynamisk SELECT udfra $_GET

Tags:    mysql php form

Jeg skal lave et dynamisk MYSQL SELECT statement ud fra $_GET
Indholdet af $_GET er:
Array
(
[kategori] => supermarked
[kundetype] => Eksisterende
[kontakt] =>
[catering] =>
[postnr_1] =>
[postnr_2] =>
)
Det vil sige at min select denne gang skal have værdierne:
Fold kodeboks ind/udPHP kode 

Hvordan får jeg trukket selve [kategori] og [kundetype] ind i min select statement.
Samt => supermarked og => Eksisterende



Indlæg senest redigeret d. 09.06.2014 00:34 af Bruger #16819
8 svar postet i denne tråd vises herunder
2 indlæg har modtaget i alt 3 karma
Sorter efter stemmer Sorter efter dato
http://php.net/manual/en/security.database.sql-injection.php
http://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php


en løsning kunne være at bruge real-escape-string eller quote afh af mysql API inde i foreach, eller lave en "afvaskning/validering" før det kom til foreach
http://www.php.net/manual/en/function.mysql-real-escape-string.php (forældet API)
http://www.php.net/manual/en/mysqli.real-escape-string.php
http://www.php.net/manual/en/pdo.quote.php (dette API vil jeg anbefale)


kunne også anvende prepare statement (KUN mysqli og PDO)

man kunne jo også validere med gump inde i foreach løkken
download https://github.com/Wixel/GUMP
(denne skal jeg selv lege lidt med)





foreach er din gode ven, løb dit array igennem, og for hver key tester du om værdien er forskællig fra blank, og er den det konkatenerer du nøglen og værdien til din string samt sætter et && tegn for at klargører til næste konkatenering, og saamtidig et flag, så du kan se der er valgt nogle

Fold kodeboks ind/udKode 





Hej Ronny
Mange tak for hjælpen :-)
Når jeg udfylder postnr fungerer det som det skal.
Men hvis jeg udfylder de andre felter får jeg fejl meddelelsen:
eksempel:
SELECT * FROM stamdata where kunde_type=EksisterendeUnknown column 'Eksisterende' in 'where clause'
Det er som om jeg kun får fejl når det er tekst der søges på, og ikke på tal.
Har du en ide om hvorfor?




prøv at sætte nogle enkelt plnger omkring din value
$where .= $key ."='".$value."' && ";
så er alle felter stringe og ikke numre





Perfekt :-)
Mange tak :-)

$ar =$_GET;
$poster=0;
$where = " where ";
foreach($ar as $key => $value){
if ($value !=""){
$poster++;
$where .= $key ."='".$value."' && ";
}
}
$where = substr($where, 0 , -4); // fjerner de sidste " && "

if($poster>0){
$sql = "SELECT * FROM stamdata ".$where;
}
else {
echo "der er ikke valgt nogle felter";
}



super ... lige klar til en gang sql injection



og hvordan undgår jeg så den?
Har sat denne for at undgå lidt af det.
<form action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>" method="GET">






Det der hjælper da ikke imod injection. Du skal gøre det, på det data du får fra GET.



t