Avatar billede compac Seniormester
11. december 2020 - 11:04 Der er 5 kommentarer og
2 løsninger

Sikker kode

Jeg er blevet "læst og påskrevet" angående sikker kode i dette forum.
Nu har jeg et eksempel, som jeg beder jer kommentere:
Før:
$tur = mysqli_query($link, $query ="SELECT * FROM vandreture ORDER BY dato DESC limit $vis_fra, $pr_side");

Efter:
$stmt = mysqli_prepare($link,"SELECT * FROM vandreture ORDER BY dato DESC limit ?,?"); 
    $stmt ->bind_param("si",$vis_fra,$pr_side);
    $stmt->execute();
    $tur = $stmt->get_result();
Avatar billede Slater Ekspert
11. december 2020 - 11:11 #1
Er $vis_fra ikke også et tal? I så fald bør din parameterstreng være "ii" i stedet for "si", men sikkerhedsmæssigt er det perfekt 👍
Avatar billede arne_v Ekspert
11. december 2020 - 14:38 #2
Jep.

Med den lille 'i' ting på plads så er det som det skal være med hensyn til prepare og beskyttelse mod SQL injection.

Når du er igang med at smukkesere koden, så ville jeg erstate '*' med en liste af de felter som du faktisk skal bruge.
Avatar billede compac Seniormester
11. december 2020 - 16:58 #3
Et tillægsspørgsmål:
Når jeg skal finde antallet af poster - hvis det er > 0 gør jeg sådan:
if ($result = mysqli_query($link, "SELECT id,dato,titel,mappe FROM vandreture ORDER BY dato")) {
    $row_cnt = mysqli_num_rows($result);
    $antal = $row_cnt;
}
else
{ ...
Der må da findes en smukkere metode?
Avatar billede Slater Ekspert
11. december 2020 - 17:10 #4
Det giver ikke mening at sætte en variabel til en anden variabel. Nu har du to variabler der indeholder det samme.

Men ud over det, kommer det an på hvordan du skal bruge det. Hvis du kun vil vide om der er mere end 0 rækker, men ikke skrive dem ud, så er det den korrekte måde at gøre det. Skal du også skrive dataene ud, hvis der er mere end én, så kan du lige så godt bare tjekke om dit fetch-kald returnerer null eller ej.
Avatar billede Slater Ekspert
11. december 2020 - 17:12 #5
"Hvis der er mindst én", skulle der stå. Ikke "hvis der er mere end én".
Avatar billede arne_v Ekspert
11. december 2020 - 17:39 #6
Jeg vil mene at en normal model er:

[quote]
if($rs = mysqli_query($con, $sql)) {
    $data = false;
    while($row = mysqli_fetch_array($rs, MYSQLI_ASSOC)) {
        // process $row
        $data = true;
    }
    if(!$data) {
        // do whatever for no data case
    }
} else {
    // do whatever for bad SQL case
}
[/quote]
Avatar billede arne_v Ekspert
11. december 2020 - 17:39 #7
quote -> div


if($rs = mysqli_query($con, $sql)) {
$data = false;
while($row = mysqli_fetch_array($rs, MYSQLI_ASSOC)) {
// process $row
$data = true;
}
if(!$data) {
// do whatever for no data case
}
} else {
// do whatever for bad SQL case
}
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

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