Nu-i „tipul” meu
Acum, ca ne aflam asupra subiectului INSERT, iti amintesti afirmatia mea de acum cateva pagini despre faptul ca SQLite nu tine seama de tipuri si deci poti insera valori de orice tip, indiferent de camp? Mai exista o exceptie importanta de la aceasta regula: un camp care este marcat ca INTEGER PRIMARY KEY (cheie primara integer). In SQLite, campurile marcate ca INTEGER PRIMARY KEY indeplinesc doua functii importante: ele asigura un identificator numeric unic pentru fiecare inregistrare din tabel, si, daca le inserezi o valoare NULL, SQLite va insera in mod automat o valoare care este cu 1 mai mare decat cea mai mare valoare deja prezenta in campul respectiv.
Campurie INTEGER PRIMARY KEY din SQLite indeplinesc deci un rol echivalent campurilor AUTO_INCREMENT („auto-incrementare”) din MySQL, si reprezinta o modalitate convenabila de a-ti numerota in mod automat inregistrarile. Evident, nu poti insera valori non-numerice intr-un asemenea camp, si de aceea am spus ca ele constituie o exceptie de la regula de independenta fata de tip. Citeste mai mult despre acestea la http://www.sqlite.org/datatypes.html.
Din moment ce tabelul books folosit in exemplul precedent contine deja un asemenea camp, (campul id), este clar ca fiecare INSERT efectuat in acesta cu o valoare NULL pentru campul respectiv genereaza un nou numar de inregistrare. Daca ai dori sa recuperezi acest numar, PHP are o cale de a face si acest lucru – doar foloseste functia sqlite_last_insert_rowid(), care returneaza ID-ul ultimului rand inserat (echivalent functiei mysql_insert_id() din PHP MySQL API).
Pentru a observa acest lucru pe viu, actualizeaza bucla if() din mijlocul secventei de instructiuni anterioare pentru a include o apelare la sqlite_last_insert_rowid(), dupa cum urmeaza:
<?php
if (isset($_POST['submit'])) {
if (!empty($_POST['title']) && !empty($_POST['author'])) {
$insQuery = "INSERT INTO books (title, author) VALUES (\"".
sqlite_escape_string ($_POST['title'])."\", \"".
sqlite_escape_string($_POST['author'])."\")";
$insResult = sqlite_query($handle, $insQuery) or die
("Error in query: ".sqlite_error_string
(sqlite_last_error($handle)));
echo "<i>Record successfully inserted with ID "
.sqlite_last_insert_rowid($handle)."!</i><p />";
}
else {
echo "<i>Incomplete form input. Record not inserted!</i><p />";
}
}
?>
Daca ai nevoie, poti afla de asemenea afla cate randuri au fost afectate folosind functia sqlite_changes() –incearca si tu si vei vedea!
O luam de la capat
Iti vei aminti, de la inceputul acestui tutorial, ca ti-am sugerat sa initializezi baza de date library.db folosind programul de linii de comanda SQLite. Ei bine, asta nu e singura modalitate de a crea o baza de date SQLite noua – poti folosi chiar PHP pentru a efectua acest lucru, emitand comenzile necesare CREATE TABLE si INSERT prin intermediul functiei sqlite_query(). Iata cum:
<?php
$db = $_SERVER['DOCUMENT_ROOT']."/../library2.db";
$handle = sqlite_open($db) or die("Could not open database");
sqlite_query($handle, "CREATE TABLE books (id INTEGER PRIMARY KEY,
title VARCHAR(255) NOT NULL, author VARCHAR(255) NOT NULL)")
or die("Error in query: "
.sqlite_error_string(sqlite_last_error($handle)));
sqlite_query($handle, "INSERT INTO books (title, author) VALUES
('The Lord Of The Rings', 'J.R.R. Tolkien')") or die("Error in query:"
.sqlite_error_string(sqlite_last_error($handle)));
sqlite_query($handle, "INSERT INTO books (title, author) VALUES
('The Murders In The Rue Morgue', 'Edgar Allan Poe')")
or die("Error in query: "
.sqlite_error_string(sqlite_last_error($handle)));
sqlite_query($handle, "INSERT INTO books (title, author) VALUES
('Three Men In A Boat', 'Jerome K. Jerome')") or die("Error in query:"
.sqlite_error_string(sqlite_last_error($handle)));
sqlite_query($handle, "INSERT INTO books (title, author) VALUES
('A Study In Scarlet', 'Arthur Conan Doyle')") or die("Error in query:"
.sqlite_error_string(sqlite_last_error($handle)));
sqlite_query($handle, "INSERT INTO books (title, author) VALUES
('Alice In Wonderland', 'Lewis Carroll')") or die("Error in query:"
.sqlite_error_string(sqlite_last_error($handle)));
echo "<i>Database successfully initialized!";
sqlite_close($handle);
?>
Sau, in PHP 5, poti folosi demersul cu orientare pe obiecte:
<?php
$file = $_SERVER['DOCUMENT_ROOT']."/../library3.db";
$db = new SQLiteDatabase($file) or die("Could not open database");
$db = query("CREATE TABLE books (id INTEGER PRIMARY KEY, title
VARCHAR(255) NOT NULL, author VARCHAR(255) NOT NULL)")
or die("Error in query");
$db = query("INSERT INTO books (title, author) VALUES
('The Lord Of The Rings', 'J.R.R. Tolkien')")
or die("Error in query");
$db = query("INSERT INTO books (title, author) VALUES
('The Murders In The Rue Morgue', 'Edgar Allan Poe')")
or die("Error in query");
$db = query("INSERT INTO books (title, author) VALUES
('Three Men In A Boat', 'Jerome K. Jerome')")
or die("Error in query");
$db = query("INSERT INTO books (title, author) VALUES
('A Study In Scarlet', 'Arthur Conan Doyle')")
or die("Error in query");
$db = query("INSERT INTO books (title, author) VALUES
('Alice In Wonderland', 'Lewis Carroll')")
or die("Error in query");
echo "<i>Database successfully initialized!";
unset($db);
?>
Cateva unelte in plus
In sfarsit, SQLite API include de asemenea niste functii auxiliare, pentru a-ti furniza informatii asupra versiunii SQLite precum si a encodarii, codul de eroare si mesajul generat de ultima operatie esuata. Urmatorul exemplu face o demonstratie a functiilor sqlite_libversion() si sqlite_libencoding(), care returneaza numarul si encodarea respectiva, a versiunii bibliotecii de conectare SQLite:
<?php
echo "SQLite version: ".sqlite_libversion()."<br />";
echo "SQLite encoding: ".sqlite_libencoding()."<br />";
?>
Cand lucrurile nu merg bine, apeleaza la functia sqlite_last_error(), care returneaza ultimul cod de eroare returnat de catre SQLite. Desigur, acest cod de eroare – o valoare numerica – nu este foarte util in sine; pentru a-l converti intr-un mesaj care sa poata fi citit de catre o persoana, cupleaza-l la functia sqlite_error_string(). Ia in considerare urmatorul exemplu, care are valoare ilustrativa, incercand sa ruleze o interogare cu o eroare voita, intentionata, in cadrul ei:
<?php
$db = $_SERVER['DOCUMENT_ROOT']."/../library.db";
$handle = sqlite_open($db) or die("Could not open database");
$query = "DELETE books WHERE id = 1";
$result = sqlite_query($handle, $query) or die("Error in query: "
.sqlite_error_string(sqlite_last_error($handle)));
sqlite_close($handle);
?>
Iata cum arata iesirile:
Ia aminte la faptul ca, desi par similare, functiile sqlite_last_error() si sqlite_error_string() nu functioneaza chiar in acelasi mod ca functiile mysql_errno() si mysql_error(). Functiile mysql_errno() si mysql_error() pot fi folosite in mod independent una fata de cealalta pentru a recupera ultimul cod de eroare si mesajul aferent, insa sqlite_error_string() este dependent de codul de eroare returnat de catre sqlite_last_error().
Daca apetitul tau abia a fost trezit, poti citi mai multe despre lucrurile pe care le poate face PHP cu SQLite in sectiunea lui Zend, PHP 5 In Depth.
|