MySqli prepared statements

Eelmises postituses selgitasin MySqli põhilist kasutamis võimalust, kuid Mysqli-ga kaasneb üks väga tähtis osa mis on prepared statments. Eesti keeles ei ole kahjuks leidnud ühtegi mõistlikut vastet, kuid võib ehk nii tõlkida, valmis tingimused.

Lihtsam oleks arusaada, kui selgitaksin järgnevalt näiteks meil on SQL päring SELECT name FROM users WHERE id = 1 ja näiteks id on hoopis muutuja …WHERE id = $_POST[‘id’]. Kohe tekib vastuolu, ei tohi ühtegi andmet väljastada ilma seda kontrollimata, vaja kasutada mysql_escape_string funktsiooni. Escape-me päringu ning saadame selle SQL baasile ja kõik. Kas lihtsamalt saab ? Selleks ongi prepared statements, mis puhul sisestatakse muutujate asemele ? märk. Kõik väärtused, mis sisestatakse küsimärgiga tehtakse automaatselt escape funktsioon, seega jääb vähem probleeme sellega. Prepared statements on kõige lihtsam ettekujutada nagu vormi. Lisaks jäävad  ära prepared statmentidega mõningad protsessid, päring täidetakse kiiremalt, kuna tegu on olemas oleva vormiga. Näiteks ülevalpool mainitud päring näeks välja selline: SELECT name FROM users WHERE id = ?.


$mysqli = new mysqli('localhost', 'root', '', 'andmed');

if (mysqli_connect_errno()) {
 echo 'Tekkis viga andmebaasi ühendamisel: '. mysqli_connect_error();
 exit();
}

$stmt = $mysqli->prepare("INSERT INTO project VALUES (?, ?)");
$stmt->bind_param('is', $id, $nimi);
$id = 14;
$nimi = 'Uus Euro projekt';

$stmt->execute();
echo 'Rea sisestamine '. (($stmt->affected_rows != -1) ? 'õnnestus' : 'ebaõnnestus');  
$stmt->close();

$mysqli->close();

Midagi maagilist enne $stmt muutujat polegi, kuid nüüd tuleb prepared statmenti juures appi klass Statement. Prepare osa ei tohiks olla arusaamatu, tegu siis tavalise päringuga, kuhu märgitakse muutujad ? märgiga. Selleks, et ? märgid täita on vaja andmeid ning need pannakse bind_param meetodiga paika, milles esimene parameeter on sõne. Sinna märgitakse ära vastavad andme tüübid, mis on järgmised:

  1. i – kõik INT põhilised andmed, täisarvud
  2. d – DOUBLE ja FLOAT, ehk tegu koma sisaldavate arvudega
  3. b – BLOB
  4. s – kõik ülejäänud tüüpi, sõned, ajad, boolean väärtused jne.

Meie näites on olnud kasutusel, ‘is’, $id, $nimi ehk esimene näitab, et tegu numbriga, teine aga sõnega. Viimaseks käsuks on execute(), mis viib käsu ellu.


$mysqli = new mysqli('localhost', 'root', '', 'andmed');

if (mysqli_connect_errno()) {
 echo 'Tekkis viga andmebaasi ühendamisel: '. mysqli_connect_error();
 exit();
}

$stmt = $mysqli->prepare("INSERT INTO project VALUES (?, ?)");
$stmt->bind_param('is', $id, $nimi);
$id = 15;
$nimi = 'Uus Euro projekt';

$stmt->execute();

$id = 16;
$nimi = 'Ahoi kapten';
$stmt->execute();

echo 'Rea sisestamine '. (($stmt->affected_rows != -1) ? 'õnnestus' : 'ebaõnnestus');  
$stmt->close();

$mysqli->close();

Selles näites on näha, et vahpeal pole vaja luua uut päringut vaid saab kasutada vana vormi.

Loodan, et see kontsept sai natukene selgemaks või vähemalt prepared statementi mõttele pihta. Samas ei käsitlenud, selles artiklis, kuidas andmeid esitada, see käib väheke teistmoodi kui tava päringute puhul.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s