Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Очень просто о PHP, от элементарных понятий до ООП


Это перевод второй части девятой статьи из обучающего курса по языку программирования PHP. Прочитав данный цикл статей, вы получите возможность легко писать программы на языке PHP. Лекция продолжает знакомить нас с работой в базе данных SQLite.

Начали:


Не мой тип

Говоря об INSERT, помните я говорил на предудёщей лекции, что SQLite - бестиповая БД, и вы можете вставлять значения любого типа в любое поле? В этом правиле есть одно важное исключение: поле, помеченные как INTEGER PRIMARY KEY. В SQLite поля, помеченные как INTEGER PRIMARY KEY, выполняют две функции: работаб как уникальный числовой идентификатор каждой записи в таблице, и если вы вставите в это поле значение NULL, SQLite автоматически вставит значение, на 1 больше чем у самой последней записи.

Тем самым поля INTEGER PRIMARY KEY в SQLite являюься эквивалентом полей AUTO_INCREMENT в MySQL. Очевидно, что что вы не можете вставить нечисловые значения в такие поля, и именно поэтому я сказал, что они являются исключением из правила. Подробнее об этом читайте на http://www.sqlite.org/datatypes.html.

Поскольку таблица книг, используемая в первой части лекции, уже содержала такое поле, становится понятно, что каждый INSERT с указанием пустого значения для этого поля создаёт новый номер записи. Если вы хотите получить это число, в PHP есть способ сделать это - просто используйте sqlite_last_insert_rowid(), которая возвращает идентификатор последней добавленной строки (эквивалент mysql_insert_id () PHP в API MySQL).

Чтобы увидеть это в работе, дополните if() в середине предыдущего скрипта вставки данных в таблицу вызовом sqlite_last_insert_rowid():

<?
  // проверяем, была-ли отравлена форма с новой записью
if (isset($_POST['submit'])) { 
    // удостоверимся в том, что указаны и автор, и название
if (!empty($_POST['title']) && !empty($_POST['author'])) { 
        // создадим запрос INSERT
        $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>Запись успешно добавлена, ID: ".sqlite_last_insert_rowid($handle)."!</i><p />"; 
    } 
    else { 
        // нет данных
        // покажем сообщение об ошибке
        echo "<i>Неполный данные. Запись не добавлена!</i><p />"; 
    } 
}
?>

Если требуется, вы можете узнать количество изменённых последним запросом строк при помощи функции sqlite_changes(). Попробуйте!

Начнём с нуля

Если вы помните, в начале этой лекции мы создали базу library.db, используя программу командной строки SQLite. Так вот, чтобы вы таки знали, это не единственный способ создать чистую базу данных SQLite - вы можете использовать для этого PHP, выполняя запросы CREATE TABLE и INSERT при помощи функции sqlite_query(). Пример:

<?
// установим путь к файлу базы данных
$db = $_SERVER['DOCUMENT_ROOT']."/../library2.db"; 

// откроем файл БД
$handle = sqlite_open($db) or die("Не могу открыть БД"); 

// создадим БД
sqlite_query($handle, "CREATE TABLE books (id INTEGER PRIMARY KEY,
 title VARCHAR(255) NOT NULL, author VARCHAR(255) NOT NULL)")
 or die("Ошибка в запросе: ".sqlite_error_string(sqlite_last_error($handle))); 

// вставим запись
sqlite_query($handle, "INSERT INTO books (title, author)
 VALUES ('Властелин колец', 'Дж. Р. Р. Толкиен')")
 or die("Ошибка в запросе: ".sqlite_error_string(sqlite_last_error($handle))); 

sqlite_query($handle, "INSERT INTO books (title, author)
 VALUES ('Убийство на улице Морг', 'Эдгар Алан По')")
 or die("Ошибка в запросе: ".sqlite_error_string(sqlite_last_error($handle))); 

sqlite_query($handle, "INSERT INTO books (title, author)
 VALUES ('Трое в лодке', 'Джером Клапка Джером')")
 or die("Ошибка в запросе: ".sqlite_error_string(sqlite_last_error($handle))); 

sqlite_query($handle, "INSERT INTO books (title, author)
 VALUES ('Этюд в багровых тонах', 'Артур Конан Дойл')")
 or die("Ошибка в запросе: ".sqlite_error_string(sqlite_last_error($handle))); 

sqlite_query($handle, "INSERT INTO books (title, author)
 VALUES ('Алиса в стране чудес', 'Льюис Кэрролл')")
 or die("Ошибка в запросе: ".sqlite_error_string(sqlite_last_error($handle))); 

// print success message 
echo "База данных успешно создана!"; 

// всё сделано 
// закроем файл БД
sqlite_close($handle);
?>

Или, в случае PHP 5, можно сделать то-же самое в обьектно-ориентированном стиле:

<?
// установим путь к файлу базы данных
$file = $_SERVER['DOCUMENT_ROOT']."/../library3.db"; 

// создадим обьект БД
$db = new SQLiteDatabase($file) or die("Не могу открыть БД");

// создадим БД
$db->query($handle, "CREATE TABLE books (id INTEGER PRIMARY KEY,
 title VARCHAR(255) NOT NULL, author VARCHAR(255) NOT NULL)")
 or die("Ошибка в запросе: ".sqlite_error_string(sqlite_last_error($handle))); 

// вставим запись
$db->query($handle, "INSERT INTO books (title, author)
 VALUES ('Властелин колец', 'Дж. Р. Р. Толкиен')")
 or die("Ошибка в запросе: ".sqlite_error_string(sqlite_last_error($handle))); 

$db->query($handle, "INSERT INTO books (title, author)
 VALUES ('Убийство на улице Морг', 'Эдгар Алан По')")
 or die("Ошибка в запросе: ".sqlite_error_string(sqlite_last_error($handle))); 

$db->query($handle, "INSERT INTO books (title, author)
 VALUES ('Трое в лодке', 'Джером Клапка Джером')")
 or die("Ошибка в запросе: ".sqlite_error_string(sqlite_last_error($handle))); 

$db->query($handle, "INSERT INTO books (title, author)
 VALUES ('Этюд в багровых тонах', 'Артур Конан Дойл')")
 or die("Ошибка в запросе: ".sqlite_error_string(sqlite_last_error($handle))); 

$db->query($handle, "INSERT INTO books (title, author)
 VALUES ('Алиса в стране чудес', 'Льюис Кэрролл')")
 or die("Ошибка в запросе: ".sqlite_error_string(sqlite_last_error($handle))); 

// print success message 
echo "База данных успешно создана!"; 

// всё сделано
//уничтожим обьект БД
unset($db);
?>

Ещё парочка инструментов

Наконец, API SQLite также включает в себя некоторые дополнительные функции для полученя версии SQLite и кодировки, код и сообщение ошибки, вызванной последним действием. Следующий пример иллюстрирует работу функций sqlite_libversion() и sqlite_libencoding(), которые возвращают номер версии и кодировку подключённой библиотеки SQLite соответственно:

<?
// версия 
echo "Версия SQLite: ".sqlite_libversion()."
"; // кодировка echo "Кодировка SQLite: ".sqlite_libencoding()."
"; ?>

Если дела плохи, попробуйте функцию sqlite_last_error(), которая вернёт код последней ошибки, сообщённой SQLite. Конечно, код ошибки - числовое значение - не очень полезен сам по себе, поэтому используйте функцию sqlite_error_string() для превращения его в понятное человеку сообщение. Рассмотрим следующий пример, который показывает попытку выполнения ошибочного запроса:

<?
// установим путь к файлу
$db = $_SERVER['DOCUMENT_ROOT']."/../library.db"; 

// откроем файл БД
$handle = sqlite_open($db) or die("Не могу открыть БД"); 

// создадим строку запроса
// она содержит преднамеренную ошибку
$query = "DELETE books WHERE id = 1"; 

// выполним запрос
$result = sqlite_query($handle, $query)
 or die("Ошибка в запросе: ".sqlite_error_string(sqlite_last_error($handle))); 

// всё сделано
// закроем файл БД
sqlite_close($handle);
?>

Результат будет подобен следующему:

Warning: sqlite_query() [function.sqlite-query]: near "books": syntax error in /usr/local/apache/htdocs/x5.php on line 13
Ошибка в запросе: SQL logic error or missing database

Заметим, что хотя они могут показаться похожими, функции sqlite_last_error() и sqlite_error_string() не работают точно так же, как функции mysql_errno() и mysql_error().
Функции mysql_errno() и mysql_error() могут быть использованы независимо друг от друга, для получения кода последней ошибки и сообщения соответственно, а sqlite_error_string () зависит от кода ошибки возвращается sqlite_last_error().

Если у вас разыгрался аппетит, вы можете прочитать больше о вещах, которые на PHP можно сделать с SQLite, на сайте Zend.

Вот и всё по этой теме. Больше секретов ждёт вас в десятой главе курса, так что приходите!

Оригинал перевода: http://www.figli-migli.org.ua/books/1796-php101-9b


В избранное