Feil i SELECT php kode?

kongen

kongemedlem
Sliter med å få frem et resultat fra mysql database.
Jeg har prøvd 2 forskjellige koder og begge gir ingenting tilbake,
selv om databasen har innholdet det spørres om.

PHP:
$person = $_GET['person'];
sql = mysqli_query($mysqlconnection,"SELECT navn FROM db WHERE person='$person'");
$results = mysqli_query($mysqlconnection, $sql);

$person = $_GET['person'];
$sql = "SELECT navn FROM db WHERE person='$person'";
$results = $mysqlconnection->query($sql);

Ser dere hva som er galt med disse kodene?
 

kongen

kongemedlem
Det gikk litt kjapt med copy/paste, men $ er egentlig med i koden.

Noe annet som kan være galt?
 

adeneo

Medlem
Du må jo nesten se hva feilen er, enten ved feilmeldinger i PHP eller fra MySQL

PHP:
$person = $_GET['person']; 
sql = "SELECT navn FROM db WHERE person='$person'"; 
$results = mysqli_query($mysqlconnection, $sql)  or 
           trigger_error("FEIL: " . mysqli_error($mysqlconnection), E_USER_ERROR);
 

kongen

kongemedlem
Skjønner ikke hva som var galt, jeg gikk gjennom koden igjen
og igjen og igjen og fant aldri noe feil. Så kodet jeg alt på nytt
og da virket det som det skulle, rare greier.

Ettersom jeg er ute etter kun én verdi, navnet,
og "person" er en unik id i databasen, finnes det
noe bedre å bruke enn mysqli_fetch_array?
 

kongen

kongemedlem
Nå er det en annen del an koden som oppfører seg rart.
Alt virket i natt, men nå virker det ikke igjen.
Dette skal da ikke være mulig, koden er jo akkurat den samme?

PHP:
if (!$results) {
gjør ditt 
} else {
gjør datt
}

Nå oppfører siden seg slik at den finner noe i databasen, selv om det ikke er noe der.
Den gjør datt når den skal gjøre ditt.
 

Frosk Media

New Member
Om du driver en liten nettside er det ikke noe problem, men om du satser på at du kanskje kan "hisse på deg" kvalifiserte personer, bør du vurdere å gå over til PDO istedenfor MySQLi siden PDO tar vekk risikoen for SQL injection 99,9%.

Velger du å fortsette med MySQLi så bør du lese deg opp om prepared statements.

PDO kan være vrient å bli vant til, men du vil garantert tjene på det om du vil utvikle flere dynamiske websider i fremtiden.
 

selbekk

Medlem
jeg ventet nesten bare på at noen skulle peke ut den åpenbare SQL-injection muligheten denne koden gir.

Skriv om koden din slik:
Kode:
$person = $_GET['person']; 
[B]$query = mysqli_real_escape_string("SELECT navn FROM db WHERE person='$person'");[/B]
$sql = mysqli_query($mysqlconnection, $query);

Husk at alt som kommer inn fra brukeren i en SQL-streng gir dem muligheten til å bryte seg inn på siden din, slette innhold og mye annet slemt. Les mer her.

Og hvorfor queryer du to ganger? Du spør databasen om å søke gjennom alle filene sine to ganger - hvordan får du engang dette til å fungere?
 

kongen

kongemedlem
Koden ser slik ut nå, er det fortsatt muligheter for sql-injection?

PHP:
$person = $_GET['person'];
$person = mysqli_real_escape_string($mysqlconnection, $person)
$sql = mysqli_query($mysqlconnection, "SELECT navn FROM db WHERE person='$person'");


Og hvorfor queryer du to ganger? Du spør databasen om å søke gjennom alle filene sine to ganger - hvordan får du engang dette til å fungere?

Jeg bruker bare en query. Jeg viste bare hvilke to måter jeg har prøvd og som ikke virket.
 

selbekk

Medlem
Koden ser slik ut nå, er det fortsatt muligheter for sql-injection?
Jeg bruker bare en query. Jeg viste bare hvilke to måter jeg har prøvd og som ikke virket.

I eksempel 1 så skriver du:

PHP:
$person = $_GET['person']; 
sql = mysqli_query($mysqlconnection,"SELECT navn FROM db WHERE person='$person'"); 
$results = mysqli_query($mysqlconnection, $sql);

Her kaller du mysqli_query to ganger.

I den nye koden din så er du sikret for SQL-injections :)
 

kongen

kongemedlem
Leste en plass at man skulle bruke "function" for å sjekke om servere var satt opp til å fjerne tegn via magic quotes og hvis den var det så skulle man ikke bruke escape for da ble det dobbel-escape som var det samme som å ikke escape. Er dette riktig?
 

selbekk

Medlem
Jeg ser det nå. Kanskje derfor det ikke virket slik det skulle.

Bør ting og tang som skal i database også "santizes" i tillegg til "escapes"?

Sanering og "escaping" av innhold er basically det samme - litt avhengig av hvem du spør. At innhold escapes betyr rett og slett at brukerne ikke har muligheten til å hacke databasen din via SQL-spørringene dine. Les mer om SQL injection her. Mange vil nok ikke krange om du sier at sanering av input er det samme. Andre vil derimot hevde at sanering er mer rettet på å sikre at databasen din kun inneholder gyldige data, som f.eks. validert input (epost-adresser, telefonnumre, you name it). Jeg bruker uttrykkene litt om hverandre to be honest.

Leste en plass at man skulle bruke "function" for å sjekke om servere var satt opp til å fjerne tegn via magic quotes og hvis den var det så skulle man ikke bruke escape for da ble det dobbel-escape som var det samme som å ikke escape. Er dette riktig?

Jeg har aldri hørt om noe slikt, ei heller vært borti det, men det kan godt hende noen servere gjør det slik. Høres forsåvidt ut som en idiotisk og usikker løsning, da a) databaseserveren ikke kan vite hvordan du skriver dine SQL-spørringer i utgangspunktet, og b) det spikra garrantert finnes en grei måte å komme seg rundt det på.

Aner ikke hva denne "function" du prater om gjør - høres ut som du får lese hva enn du leste en gang til :)
 

adeneo

Medlem
Magic Quotes er borte, slettet, finito, for evig og alltid. Ikke noe å bekymre seg for i dag.

Dersom du absolutt må kan du kjøre en get_magic_quotes_gpc for å sjekke om det er slått på.
 
Topp