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);
[/PHP]
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);[/PHP]
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?
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
}
[/PHP]
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.
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%.
jeg ventet nesten bare på at noen skulle peke ut den åpenbare SQL-injection muligheten denne koden gir.
Skriv om koden din slik:
$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?
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’”);
[/PHP]
Jeg bruker bare en query. Jeg viste bare hvilke to måter jeg har prøvd og som ikke virket.
[PHP]
$person = $_GET[‘person’];
sql = mysqli_query($mysqlconnection,“SELECT navn FROM db WHERE person=‘$person’”);
$results = mysqli_query($mysqlconnection, $sql);
[/PHP]
Her kaller du mysqli_query to ganger.
I den nye koden din så er du sikret for SQL-injections
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?
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.
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