Avatar billede Mik2000 Professor
20. januar 2013 - 02:09 Der 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?
Avatar billede arne_v Ekspert
20. januar 2013 - 02:33 #1
re 2)

Nej.

mysqli::real_escape_string boer aldrig bruges - brug mysqli::prepare og mysqli_statement::bind_param
Avatar billede arne_v Ekspert
20. januar 2013 - 02:36 #2
re 1)

$result->free();
mysqli_free_result($result);

goer det samme bare objekt orienteret og proceduralt

$db->close();
$mysqli->close();

er nok det samme mysqli::close bare med 2 forskellige variabel navne

$result->close();

aner jeg ikke hvad er
Avatar billede Mik2000 Professor
20. januar 2013 - 13:14 #3
Hej Arne

Mange tak for dine svar - nu bliver det nok et måske lidt dumt, og måske også lidt omfattende spørgsmål, men håber du vil hjælpe :)

Jeg har kigge lidt på mysqli::prepare og mysqli_statement::bind_param, men har meget svært ved at se ideen ved dem.

Understående er fra php.net
----------------------------
$stmt = $mysqli->prepare("INSERT INTO CountryLanguage VALUES (?, ?, ?, ?)");
$stmt->bind_param('sssd', $code, $language, $official, $percent);

$code = 'DEU';
$language = 'Bavarian';
$official = "F";
$percent = 11.2;

/* execute prepared statement */
$stmt->execute();

/* 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 :)
Avatar billede arne_v Ekspert
20. januar 2013 - 15:28 #4
re 2)

'sssd' er ikke er vaerdi som skal indsaetted men information om de andre 4 vaerdier

sssd = string string string decimal
Avatar billede arne_v Ekspert
20. januar 2013 - 15:30 #5
re 3)

Ham der har designet mysqli har altsaa valgt at connection og statement bruger close mens result bruger free.

I Danmark koerer vi i en side af vejen - i England koerer de i den anden side af vejen.
Avatar billede arne_v Ekspert
20. januar 2013 - 15:50 #6
re 1 & 4)

Der er nogle forskelle.

* 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
Avatar billede arne_v Ekspert
20. januar 2013 - 15:51 #7
Hvis du synes at mysqli syntaxen er lidt "tung", saa kig evt. paa PDO - den har prepare *og* en lidt simplere syntax.
Avatar billede olebole Juniormester
20. januar 2013 - 19:28 #8
<ole>

$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.

/mvh
</bole>
Avatar billede Mik2000 Professor
20. januar 2013 - 19:51 #9
Hej

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 :)

Smid et svar og så er der point
Avatar billede arne_v Ekspert
20. januar 2013 - 19:58 #10
svar
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
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

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