20. januar 2013 - 02:09Der er
9 kommentarer og 1 løsning
Korrekt brug mysqli_query
Hej
Håber nogle af de erfarne kan kaste lidt lys over de her ting.
--------------------------------
1: Jeg er stødt på mange forskellige ting til at rydde op efter en forspørgsel. Hvilke er de rigtige at bruge og hvornår af følgende: $result->free(); mysqli_free_result($result); $result->close(); $db->close(); $mysqli->close();
--------------------------------
Derudover er jeg også lidt i tvivl om hvad der skal til for det er sikkert, især imod hijacks. Jeg har kun set følgende - er det alt hvad man behøver for at sikre den er sikker (nedenstående bruges kun når input er fra bruger, og de skal bruges i query går jeg ud fra) $navn = $db->real_escape_string('This is an unescaped "string"');
2: Men er der andre ting man skal, og er ovenstående korrekt?
/* close statement and connection */ $stmt->close(); ----------------------------
1: Forstår ikke hvorfor det er mere sikkert, da det vel stadig bare er nogle variabler der sættes ind. Så hvorfor er det bedre end mysqli::real_escape_string?
2: I linjen $stmt->bind_param('sssd', $code, $language, $official, $percent); er der 5 værdier og i sætningen over er der 4 spørgsmålstegn - hvordan hænger det sammen?
3: I eksemplet her bruges $stmt->close(); i stedet for $stmt->free(); (senere bruges close på hele databasen) - hvad er så rigtigt?
4: Koden ser da ud til at blive længere, og mere rodet da man har spørgsmålstegn og rækkefølger man skal holde øje med, så hvad er fordelen ved at bruge prepare, bind og execute?
Beklager det var så mange spørgsmål, men ved du har styr på det, og håber derfor, du kan gøre en der er lidt forvirret, lidt klogere i stedet, da jeg jo gerne vil gøre det mest korrekt :)
* real_escape_string virker paa strenge men ikke paa tal, prepare og bind_param kan bruges paa alt
* det er langt nemmere at checke for om der i kode konsekvent er brugt prepare og bind_param end for om der er brugt de gammeldags metoder
* den gammeldags metode konstruerer en SQL streng paa PHP siden med nogle escapes og sender den til MySQL - prepare sender faktisk dens SQL til MySQL faar en gandle tilbage og execute kalder saa den handle med parameterne - forskellen er hvis samme SQL saetning skal udfoeres mange gange - med den gammeldags maader parser MySQL N gange og udfoerer N gange - med prepare saa parser MySQL 1 gang og udfoerer N gange
$stmt->free(); bruges ikke. Et statement lukkes med close - mens et result renses/lukkes med free.
$stmt->close(); bruges, når et statement skal lukkes. Det skal det ikke nødvendigvis samtidigt med forbindelsen til databasen.
Det skal heller ikke nødvendigvis lukkes, når forespørgslen er afsluttet. En af de store fordele ved prepared statements er netop, at du kan bruge samme statement med mange forskellige variabler. Så genbrgues dit statement, men du binder nye parametre og eksekverer det flere gange.
Tak for tålmodigheden og svarene Arne, og også tak til dig Ole, så blev jeg noget klogere og så er der i hvert fald grundlag for lidt mere læsning hvor jeg forstår tingene :)
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.