Авторские статьи Учимся использовать SQLite и PHP.

Discussion in 'Статьи' started by blaga, 15 Jan 2007.

  1. blaga

    blaga Elder - Старейшина

    Joined:
    23 Mar 2006
    Messages:
    884
    Likes Received:
    273
    Reputations:
    106
    Здравствуйте!

    Сегодня я хотел бы рассказать вам о SQLite. Эта статья написана НЕ для новичков в PHP. Если вы не знаете PHP, то дальше можете не читать. Потому как вряд ли что ни будь поймете. А если вы знакомы с PHP да еще и знаете как на PHP работать с базами данных MySQL тогда вообще хорошо. Далее я буду обращаться к читателю на «ты», т.к. для меня это удобнее и проще.

    Итак, ты наверное уже все горло прокричал когда доказывал своим друзьям-хацкерам что БД MySQL лучше всех в Интернете. Типа и бесплатная она и скорость у нее больше чем на текстовых файлах)) и все такое. Так вот, дружок, давай попробуем тебя в этом разубедить и доказать тебе что SQLite лучше. Итак начнем с того что SQLite это реляционная база данных, использующая запросы языка SQL. Помимо всего прочего эта библиотека маленькая и быстрая (в большинстве случаев быстрее MySQL)
    На картинке вы можете просмотреть график скорости Некоторых баз данных, в частности SQLite, MySQL, PostgreSQL.

    [​IMG]
    По данным тестирования - www.hwaci.com/sw/sqlite/speed.html

    Какие же еще преимущества есть у SQLite? Самое основное отличие SQLite от MySQL является то, что SQLite не подключается к серверу БД как MySQL, он сам является сервером. SQLite читает таблицы прямо с жесткого диска, в то время как MySQL состоит из отдельного сервера который поддерживает работу БД и одновременно прослушивает определенный порт на предмет обращения клиентов (кстати PHP тоже является одним из клиентов). А в SQLite движок и интерфейс к ней реализованы в одной библиотеке (такой сервер называют встроенным). Кстати встроенный сервер есть и у MySQL, но за его использование нужно платить, а платить мы не любим) поэтому встроенный сервер MySQL не получил широкого распространения. Так же к преимуществам я отнесу то что SQLite бесплатна. Все БД хранятся непосредственно на жестком диске в виде файлов. По одному файлу на базу. Количество файлов, а также таблиц в БД огрничено только местом на жестком диске. А максимальный объем одной БД составляет 2тб!!! Кстати, исходя из того что все файлы находятся прямо на харде, то у тебя не будет проблем с переносом БД на другой хост, достаточно просто скопировать файл и все. Однако у данной БД есть и свои недостатки. К недостаткам я бы отнес то что БД и сами скрипты ее использующие не могут храниться на разных серверах. Хотя это и не очень критично, но все же чуток не универсально.

    Если ты хочешь поставить себе SQLite на Windows машину тогда тебе просто стоит скачать дистрибутив PHP5. Так как с 5 версий PHP SQLite включается в состав по умолчанию. Тебе достаточно раскомментировать в php.ini строки extension= php_pdo.dll и extension=php_sqlite.dll. Честно говоря я не ставил SQLite на Линукс, но я думаю если ты захочешь то и сам найдешь инфу как это сделать.

    Итак приступим к самому интересному – непосредственно к программированию.
    Вначале давайте рассмотрим встроенные константы SQLite:
    - SQLITE_ASSOC – результат будет возвращен в виде ассоциативного массива.
    - SQL_NUM – результат будет возвращен в виде списка(ключ массива - число).
    - SQL_BOTH – результат будет возвращен как в виде ассоциативного массива так и в виде списка. То есть ты можеш работать с ним и так и так.
    (Все вышеуказанные константы аналогичны константам MYSQL_ASSOC, MYSQL_NUM, MYSQL_BOTH)

    Теперь перейдем непосредственно к списку функций (что бы не перепечатывать элементарное я просто скопировал список функций с сайта php.su, кое где изменив и дополнив их):
    sqlite_array_query -- Выполняет запрос к базе данных и возвращает результат в виде массива, тип которого задан константами упомянутыми выше.
    sqlite_busy_timeout -- Устанавливает таим-аут(время ожидания)
    sqlite_changes -- Возвращает количество записей, которые были изменены последним SQL запросом
    sqlite_close -- Закрывает базу данных SQLite
    sqlite_column -- Получает одно поле из записи(возвращает одну колонку результата)
    sqlite_create_aggregate -- Регистрирует агрегатную функцию для использования в SQL запросах
    sqlite_create_function -- Регистрирует функцию для использования в SQL запросах
    sqlite_current -- Возвращает текущую запись результата
    sqlite_error_string -- Возвращает тестовое описание ошибки
    sqlite_escape_string -- Экранирует спецсимволы в строке для использования в запросе
    sqlite_exec -- Выполняет запрос, не возвращающий записей
    sqlite_factory -- Открывает базу данных SQLite и возвращает объект
    sqlite_fetch_all -- Выбирает все записи из результата запроса и возвращает массив массивов
    sqlite_fetch_array -- Выбирает следующую запись из массива результата. sqlite_fetch_column_types -- Возвращает массив, содержащий информацию о типах полей в таблице
    sqlite_fetch_object -- Выбирает следующую запись из результата запроса и возвращает объект
    sqlite_fetch_single -- Выбирает значение первого поля из результат запроса в виде строки
    sqlite_fetch_string -- Псевдоним функции sqlite_fetch_single()
    sqlite_field_name -- Возвращает имя указанного поля
    sqlite_has_more -- Определяет, есть ли еще записи в результате запроса
    sqlite_has_prev -- Определяет, доступна ли предыдущая запись
    sqlite_key – возвращает текущий индекс ряда.
    sqlite_last_error -- Возвращает код ошибки последней операции с SQLite
    sqlite_last_insert_rowid -- Возвращает идентификатор последней вставленной записи
    sqlite_libencoding -- Возвращает кодировку, используемую подключенной библиотекой SQLite
    sqlite_libversion -- Возвращает версию подключенной библиотеки SQLite
    sqlite_next -- Переходит на следующую запись
    sqlite_num_fields -- Возвращает количество полей в результате запроса
    sqlite_num_rows -- Возвращает количество записей в результате запроса
    sqlite_open -- Открывает или создает базу данных SQLite
    sqlite_popen -- Открывает или создает базу данных SQLite, делая подключение постоянным
    sqlite_prev -- Переходит на предыдущую запись
    sqlite_query -- Выполняет запрос к базе данных и возвращает идентификатор результата
    sqlite_rewind -- Переходит к первой записи
    sqlite_seek -- Переходит к определенному номеру записи
    sqlite_single_query -- Выполняет SQL зпрос и возвращает массив со значениями одного поля или первую запись
    sqlite_udf_decode_binary -- Декодирует бинарные данные, переданные в пользовательскую функцию
    sqlite_udf_encode_binary -- Кодирует бинарные данные, возвращаемые пользовательской функцией
    sqlite_unbuffered_query -- Выполняет запрос без буферизации результатов
    sqlite_valid – возвращает доступные ряды(не уверен)

    Вполне возможно что это не все функции SQLite, но перечисленных точно хватит для нашей работы с БД.

    Открытие и закрытие БД.
    Для открытия или создания БД используется функция sqlite_open():
    sqlite_open(string $filename [, int $mode [, string $error_massage]]);
    где $filename это имя файла(и БД одновременно), $mode это режим доступа к таблице. По умолчанию используются права 0666, позволяющие читать и записывать файл. И наконец $error_massage это строка в которую занесется сообщение об ошибке если БД невозможно будет открыть.

    Чтобы закрыть БД нужно использовать функцию sqlite_close():
    sqlite_close(‘тут дескриптор БД’);

    Если тебе нужно постоянное соединение с БД тогда используй функцию sqlite_popen(). Ее аргументы аналогичны функции sqlite_open(). Функция sqlite_popen() при первом из соединений и работает, затем работа сценария завершается. При следующем запуске скрипта функция ищет постоянное соединение, если оно существует тогда она будет его использовать если нет тогда откроет БД заново. Если твой скрипт часто запускают то эта функция может повысить производительность твоего скрипта.


    Выполнение запросов к БД
    Выполнение запросов к БД осуществляется с помощью функции sqlite_query():
    sqlite_query ( resource dbhandle, string query );
    sqlite_query ( string query, resource dbhandle );
    Смотри, как интересно. Функцию можно вызывать двояко: или сначала указать дескриптор БД а потом запрос либо наоборот. Итак, давай попробуем все вышесказанное обьеденить в один листинг:

    PHP:
    <?php
    //открытие БД
    if ($db sqlite_open('mysqlitedb'0666$sqliteerror))
    {
        
    //создание тблицы tbl
        
    sqlite_query($db'CREATE TABLE tbl (bar varchar(20))');
        
    // добавим в таблицу записи
        
    sqlite_query($db"INSERT INTO tbl VALUES ('val')");
        
    //получим результат
        
    $result=sqlite_query($db'SELECT bar FROM tbl');
        
    // и выведем его
        
    var_dump(sqlite_fetch_array($result));
    }
    else
    {    
        
    //иначе выведем ошибку
        
    die ($sqliteerror);
    }
    ?>
    Как видиш все просто, и ничего сложного тут нет.(если запрос не выполнится тогда функция sqlite_query() возвратит FALSE)

    Так же, ниже я приведу несколько скриптов для управления БД написанных НЕ мной.

    Вывод нескольких записей из базы данных:

    PHP:
    <?php 
        
    //    Гончаров А.Н.
      // Создадим новую базу данных 
      
    $db sqlite_open("my_database.db"); 
      if (!
    $db) exit("Невозможно создать базу данных!"); 
      
    // Создадим таблицу "table1" в базе 
      
    $query_table sqlite_query($db"CREATE TABLE table1 
                                  (id INTEGER PRIMARY KEY, 
                                   /* id автоматически станет автоинкрементным */ 
                                   field1 TEXT, 
                                   field2 TEXT); 
                                  "
    ); 
      if (!
    $query_table) exit("Невозможно создать таблицу в базе данных!"); 
      
    // Запишем что-нибудь в таблицу 
      
    sqlite_query($db"INSERT INTO table1(field1, field2) VALUES ('PHP5+', 'Apache');"); 
      
    sqlite_query($db"INSERT INTO table1(field1, field2) VALUES ('SQLite – ', 'классная вещь');"); 
      
    sqlite_query($db"INSERT INTO table1(field1, field2) VALUES ('Посетите ', 'sqlite.org');"); 
      
    // Сделаем выборку данных 
      
    $res sqlite_query($db"SELECT * FROM table1;"); 
      
    // В цикле выведем все полученные данные 
      
    while ($array sqlite_fetch_array($res)) 
      { 
        echo(
    $array['field1'].$array['field2']." (id записи:".$array['id'].")<br />"); 
      } 
    ?>
    Редактрирование записи: Для изменения поля воспользуемся функцией sqlite_query() и передадим ей запрос на обновление (UPDATE).

    PHP:
    <?php 
        
    //    Гончаров А.Н.
      // Создадим новую базу данных 
      
    $db sqlite_open("my_database.db"); 
      if (!
    $db) exit("Невозможно создать базу данных!"); 
      
    // Создадим таблицу "table1" в базе 
      
    $query_table sqlite_query($db"CREATE TABLE table1 
                                  (id INTEGER PRIMARY KEY, 
                                   /* id автоматически станет автоинкрементным */ 
                                   field1 TEXT, 
                                   field2 TEXT); 
                                  "
    ); 
      if (!
    $query_table) exit("Невозможно создать таблицу в базе данных!"); 
      
    // Запишем что-нибудь в таблицу 
      
    sqlite_query($db"INSERT INTO table1(field1, field2) VALUES ('PHP5+', 'Apache');"); 
      
    sqlite_query($db"INSERT INTO table1(field1, field2) VALUES ('SQLite – ', 'классная вещь');"); 
      
    sqlite_query($db"INSERT INTO table1(field1, field2) VALUES ('Посетите ', 'sqlite.org');"); 
      
    // Изменим поле с id=1 
      
    sqlite_query($db"UPDATE table1 SET field2='Apache+Linux' WHERE id=1;"); 
      
    // Сделаем выборку данных 
      
    $query sqlite_query($db"SELECT * FROM table1;"); 
      
    // В цикле выведем все полученные данные 
      
    while ($array sqlite_fetch_array($query)) 

        echo(
    $array['field1'].$array['field2']." (id записи:".$array['id'].")<br />"); 
      } 
    ?>
    Удаление записи из таблицы: Чтобы удалить запись из таблицы, нужно передать функции sqlite_query() запрос на удаление (DELETE).

    PHP:
    <?php
        
    //     Гончаров А.Н.
      // Создадим новую базу данных 
      
    $db sqlite_open("my_database.db"); 
      if (!
    $db) exit("Невозможно создать базу данных!"); 
      
    // Создадим таблицу "table1" в базе 
      
    $query_table sqlite_query($db"CREATE TABLE table1 
                                  (id INTEGER PRIMARY KEY, 
                                   /* id автоматически станет автоинкрементным */ 
                                   field1 TEXT, 
                                   field2 TEXT); 
                                  "
    ); 
      if (!
    $query_table) exit("Невозможно создать таблицу в базе данных!"); 
      
    // Запишем что-нибудь в таблицу 
      
    sqlite_query($db"INSERT INTO table1(field1, field2) VALUES ('PHP5+', 'Apache');"); 
      
    sqlite_query($db"INSERT INTO table1(field1, field2) VALUES ('SQLite – ', 'классная вещь');"); 
      
    sqlite_query($db"INSERT INTO table1(field1, field2) VALUES ('Посетите ', 'sqlite.org');"); 
      
    // Удалим поле с id=2 
      
    sqlite_query($db"DELETE FROM table1 WHERE id=2;"); 
      
    // Сделаем выборку данных 
      
    $query sqlite_query($db"SELECT * FROM table1;"); 
      
    // В цикле выведем все полученные данные 
      
    while ($array sqlite_fetch_array($query)) 
      { 
        echo(
    $array['field1'].$array['field2']." (id записи:".$array['id'].")<br />"); 
      } 
    ?>
    Итак, я думаю что этого вполне хватит что бы писать скрипты с использованием SQLlite на первых порах. Что то вы измените что то добавите и тогда сможете без проблем оперировать всеми функциями.
    В PHP я не новичок, но и профи меня не назовешь, так что прошу сильно не судить если в статье будут какие то технические неточности. Если народ захочет то я смогу дополнить эту статью еще описаниями функций. Жду с нетерпением ваших комментариев. Так же хотелось бы услышать что бы вы хотели видеть еще в этой статье помимо представленного. Спасибо, за внимание. И удачного вам использования SQLite! :)
     
    #1 blaga, 15 Jan 2007
    Last edited: 15 Jan 2007
    9 people like this.