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

Все о PHP и даже больше

  Все выпуски  

Все о PHP и даже больше #22


Информационный Канал Subscribe.Ru

Все о PHP и даже больше...

.:: Путь от начинающего до эксперта ::.

# 22
2/2004


19 февраля 2004г.

 
Проект сайта: GreatWeb.Ru
Ведущий рассылки: Бабушкин Евгений

Здоровенько, кодер!

:.:: Наши проекты:


GreatWeb.Ru - Портал продвинутых юзеров. ЕЖЕдневные сетевые новости, обзоры софта и железа, а так же все о веб-дизайне, раскрутке, выбору хостинга и не только... С нами скучать не придется!

Films.GreatWeb.Ru - Огромный каталог фильмов, содержащий самые популярные и известные фильмы! + в каталоге есть короткая рецензия на каждый фильм! Будем киньчик смотреть :)

Форум продвинутых юзеров. Отличный форум! Каждый день наша группа выкладывает свежий софт! Присоединяйся!
Самым активным пользователям будет выделен красивый почтовый ящик на 5 mb. Ваше_имя@greatweb.ru

Лучший хостинг - Лучший хостинг на мой взгляд! GreatWeb.Ru - лежит конечно же на нем :) Цены самые низкие. Можно платить только за то за что ты хочешь! Например, если тебе не нужен PERL, ты переговариваешь с админом, он может снизить тебе цену или добавить места на диске!!! Всем советую!


У Вас есть вопросы о языке PHP? Хотите получить на них ответы? Присылайте все свои вопросы мне на email с темой “Вопрос в рассылку все о PHP”, я обязательно размещу их в моей рассылке. Если вопросов будет много, можно будет открыть рубрику вопрос-ответ! А далее можно открыть отдельную рассылку!

.:: РНР4 и Microsoft Access? Нет ничего проще



Общая информация

В процессе разработки небольшого проекта для одной фирмы возникла потребность перенести информацию из базы данных MS Access в базу данных MySQL. Заполнить всю базу заново - слишком трудоемко, долго и не избежать ошибок. А что если переложить выполнение этой задачи на какую-нибудь программу?

Трудная и неразрешимая на первый взгляд задача, как не странно, решается просто: с помощью ODBC. ODBC (сокращение от "Open Database Connectivity", то есть "открытая архитектура баз данных") представляет собой интерфейс прикладных программ (API), позволяющий использовать общий набор абстрактных функций для работы с разными типами баз данных. И второй приятный момент: поддержка ODBC встроена в комплект поставки РНР, поэтому практически не придется заниматься специальной настройкой.

В настоящее время существует около 40 общих функций ODBC. Впрочем, для выборки информации из ODBC-совместимой базы данных вполне достаточно нескольких функций, описанных ниже. Полный список общих функций ODBC в РНР приведен в документации (http://www.php.net/manual).

Используя ODBC можно подключаться и работать с любой базой данных, поддерживающей этот стандарт(IBM DB2, Sybase, SQL, MySQL и т.п.). Еще одна полезная возможность - можно использовать графический интерфейс программы MS Access для работы с базами данных MySQL, SQL server и т.п.. В общем возможностей много.

Предварительная подготовка

Перед тем, как писать скрипты для конвертирования данных необходимо подготовить исходные базы данных. Для начала необходимо установить доступ к базе данных MS Access через драйвер ODBC. Далее описывается последовательность для Windows 98. В Windows NT/XP операции немного отличаются.

  1. Выполните команду Пуск > Настройка > Панель управления (Start > Settings > Control Panel). Найдите на панели управления значок Источники данных ODBC (32) (ODBC Data Sources (32 bit)). При помощи этого значка запускается Администратор ODBC, предназначенный для настройки различных драйверов и источников данных в вашей системе. Запустите программу, дважды щелкнув на этом значке. Окно Администратора по умолчанию открывается на вкладке Пользовательский DSN (User DSN). На этой вкладке перечисляются источники данных, которые относятся к конкретному пользователю и могут использоваться только на этом компьютере. В дальнейшем будет использоваться именно такой источник данных. Для демонстрации работы скрипта достаточно. Но можно настроить доступ к любой базе данных по сети или даже через интернет.

  2. Нажмите кнопку Добавить... (Add...) в правой части окна. Открывается новое окно для выбора драйвера, предназначенного для работы с новым источником. Выберите строку Microsoft Access Driver (*.mdb) и нажмите кнопку Finish (Готово).

  3. На экране появляется новое окно Установка драйвера ODBC для Microsoft Access (ODBC Microsoft Access Setup). Найдите в форме текстовое поле Имя источника данных (Data Source Name) и введите в нем имя созданной вами базы данных Access. При желании можете ввести описание в текстовом поле, расположенном непосредственно под полем Имя источника данных.

  4. Нажмите кнопку Выбрать... (Select...) - появляется окно в стиле Проводника Windows. В нем вам предлагается найти базу данных, доступ к которой будет осуществляться средствами ODBC.

  5. Найдите в дереве каталогов свою базу данных и дважды щелкните на ней. Вы снова возвращаетесь к окну Установка драйвера ODBC для Microsoft Access. Путь к выбранной базе данных отображается над кнопкой Выбрать.... Нажмите кнопку ОК.

  6. Готово! Можно работать с базой данных MS Acceess через ODBC.


Написание скрипта на РНР4.

Для демонстрации принципов работы с базами данных через ODBC драйвер создана простейшая база данных. База данных представляет собой простую записную книжку, шесть полей и три заполненных ряда. Далее, собственно, сам скрипт.Для написания скрипта понадобятся всего несколько основных команд-функций. Перед тем как обращаться к ODBC-совместимой базе данных с запросами, необходимо сначала установить с ней связь. Соединение создается командой odbc_connect( ). Синтаксис команды odbc_connect( ):

int odbc_connect (string источник_данных, string имя_пользователя, string пароль [, int тип_курсора])

Параметр источник_данных определяет ODBC-совместимую базу данных, с которой вы пытаетесь установить связь. В параметрах имя_пользователя и пароль, как нетрудно догадаться, передаются имя пользователя и пароль, необходимые для подключения к источнику данных. Необязательный параметр тип_курсора предназначен для устранения проблем, возникающих при работе с некоторыми драйверами ODBC. Он может принимать одно из четырех возможных значений:

  1. SQL_CUR_USE_IF_NEEDED;

  2. SQL_CURSOR_USE_ODBC;

  3. SQL_CUR_USE_DRIVER;

  4. SQL CUR DEFAULT.

Возможно, вам не придется использовать этот параметр, но все же о нем следует помнить на случай, если ваш пакет ODBC не справится с обработкой того или иного запроса.

Существует и противоположная команда закрывающая текущее соединение:

void odbc_close ([int идентификатор_соединения])

В параметре идентификатор_соединения передается идентификатор открытого соединения. Кроме того, можно закрыть все текущие соединения командой odbc_close_all().

По аналогии с MySQL должна быть и команда "выбрать таблицу". Но такой очень удобной команды нет. Подключение производится ко всей базе данных и выбор конкретной таблицы осуществляется в SQL запросах.

Перед непосредственной обработкой запрос необходимо "подготовить". Задача решается командой odbc_prepare( ):

int odbc_prepare (int идентификатор_соединения , string запрос)

В параметре идентификатор_соединения передается идентификатор соединения, возвращаемый командой odbc_connect( ). В параметре запрос передается текст запроса, который должен быть выполнен сервером. Если запрос не может быть выполнен, функция возвращает FALSE; в противном случае возвращается идентификатор результата, в дальнейшем используемый при вызове команды odbc_execute( ) (см. ниже).

Запрос, подготовленный командой odbc_prepare( ), выполняется командой odbc_execute( ). Синтаксис команды odbc_execute( ):

int odbc_execute (int идентификатор результата [, array параметры])

В параметре идентификатор_результата передается идентификатор результата, возвращаемый при успешном вызове odbc_prepare( ). Необязательный параметр передается лишь в том случае, если при вызове функции передаются дополнительные данные.

Есть также более простой путь для исполнения запросов. Команда odbc_exec( ) объединяет odbc_prepare( ) и odbc_execute( ). Ее синтаксис:

int odbc_exec (int идентификатор_соединения , string запрос)

В параметре идентификатор_соединения передается идентификатор соединения, возвращаемый командой odbc_connect( ). В параметре запрос передается текст запроса, который должен быть выполнен сервером. Если запрос не может быть выполнен, команда возвращает FALSE; в противном случае возвращается идентификатор результата, используемый при последующих вызовах команд. Полный синоним этой команды - odbc_do().

Вывод результата осуществляется командой odbc_result(). Синтаксис ее:

string odbc_result (int result_id, mixed field).

Значение mixed field может означать номер поля (тип int) или название поля (тип string).

В отличии от MySQL команд среди ODBC команд есть одна очень полезная команда: odbc_result_all(). Она форматирует и отображает все записи для идентификатора результата, полученного при вызове odbc_exec() или odbc_execute(), в таблицу. Синтаксис команды odbc_result_all():

int odbc_result_all (int идентификатор_результата [, string формат_таблицы])

В параметре идентификатор_результата передается идентификатор результата, возвращаемый при успешном вызове odbc_exec() или odbc_execute(). В необязательном параметре формат_таблицы передаются характеристики таблицы HTML.

В принципе, вышеперечисленных команд вполне достаточно для большинства приложений. С помощью этих команд уже можно работать с базой данных: вносить и исправлять записи, удалять данные и т.д. Однако для полноценной и удобной работы пригодятся еще несколько команд.

  1. int odbc_num_rows (int result_id) - возвращает количество рядов после запроса select,insert и delete. Возвращает -1 в случае ошибки. Может вернуть -1 с некоторыми драйверами ODBC. В частности у меня, на Windows XP & MS Access XP, данная команда не пошла.

  2. int odbc_fetch_row (int result_id [, int row_number]) - выборка ряда. Возвращает true если ряд существует, false если нет. Затем данные из ряда доступны по команде odbc_result().

  3. int odbc_fetch_into (int result_id [, int rownumber, array result_array]) - выборка данных одного ряда в массив. Индекс массива начинается с 0.
Остальные команды в принципе редко востребованы. Более подробную информацию можно посмотреть в документации на РНР (http://www.php.net/manual).

С теоретической частью покончено, можно переходить к написанию скрипта. Итак задача: перенести данные из базы данных MS Access в базу данных MySQL. База данных MySQL приготовлена, названия базы, таблицы и столбцов совпадают с базой MS Access для удобства.

Полный листинг скрипта.

<?
//Подключение к базе
$connect=odbc_connect("data1","","") or die("Не могу подключиться к базе.");
// Создать текст запроса

$query = "select * from Notebook";

// Подготовить запрос

$result = odbc_prepare($connect,$query);

// Выполнить запрос и вывести результаты

odbc_execute($result);
echo "<h3><font color=red>Данные находящиеся в таблице MS Access:</font></h3>";
odbc_result_all($result, "BGCOLOR='#c0c0c0' border=1");
//Подключение к базе и выбор таблицы
mysql_connect('localhost','root','') or die("Не могу подключиться к базе данных");
mysql_select_db('data1') or die("Не могу подключиться к таблице");

for($i=1;odbc_fetch_row($result,$i);$i++){
odbc_fetch_row($result,$i);
$id=odbc_result($result,"id");
$surname=odbc_result($result,"surname");
$name=odbc_result($result,"name");
$subname=odbc_result($result,"subname");
$telefon=odbc_result($result,"telefon");
$note=odbc_result($result,"note");

$query="insert into notebook values('$id','$surname','$name','$subname','$telefon','$note')";
$res=mysql_query($query);
}

// Работа закончена, освободить память
odbc_free_result($result);

// Закрыть соединение
odbc_close($connect);
echo "<br>";
echo "<h3><font color=red>Данные находящиеся в таблице MySQL:</font></h3>";
?>
<table BGCOLOR='#c0c0c0' border=1> <tr><th>id</th><th>Surname</th><th>Name</th><th>Subname</th><th>telefon</th><th>note</th></tr>
<?
$query=mysql_query("select * from Notebook");
$number=mysql_num_rows($query);
for($i=1;$i<=$number;$i++){
$row=mysql_fetch_array($query);
?>
<tr><td><?echo $row["id"];?></td><td><?echo $row["Surname"];?></td><td><?echo $row["Name"];?></td><td><?echo $row["Subname"];?></td><td><?echo $row["telefon"];?></td><td><?echo $row["note"];?></td></tr>
<?
}
echo "</table>";
mysql_close();
?>

Конечно, скрипт весьма далек от совершенства. Его еще улучшать и улучшать. В частности, можно упростить выборку данных из таблицы, добавить всякого рода проверки данных, их совместимости и т.д. Или вообще работать с таблицами MySQL через драйвер ODBC. Но для общего понимания сути работы с ODBC данного скрипта вполне достаточно.

Работа с базой данных MySQL через интерфейс программы MS Access.

Выше уже упоминалось, что с использованием ODBC можно работать с базой данных MySQL через интерфейс программы MS Access. Для полноты картины опишу и эту полезную возможность ODBC. Вдруг кого-нибудь заинтересует.

Для начала необходимо зайти на официальный сайт MySQL и скачать программу установки драйвера MyODBC для вашей операционной системы. Последняя рабочая версия на 11.07.02 myodbc-2.50.39, размер архива около 1.5М. Установка драйвера трудностей не вызывает. Следуйте инструкции программы-установщика, никаких особых настроек производить не нужно.

После установки драйвера необходимо настроить доступ к базе MySQL. Доступ устанавливается также, как и для баз данных MS Access. Необходимо только правильно настроить имя хоста(или его IP), логин и пароль для доступа. Остальные настройки опциональны. Вся продцедура настройки не вызывает особых трудностей. Обратите только внимание, что настроить доступ к источнику можно и локально (только для этого компьютера) и глобально (для всех пользователей сети).

Ну и наконец последняя операция. Запустите MS Access, выберите меню Открыть. В открывшемся окне выберите тип файлов ODBC database. Появится меню Выбор источника данных. Далее выбираете вкладку Файлы на этом компьютере для локальных источников баз данных и непосредственно саму базу данных. Далее откроется окно с перечнем таблиц выбранной базы данных. Выберите нужные таблицы из списка(или весь список). Все! Теперь можно работать с базой данных MySQL как с обычной базой MS Access.

На этом пожалуй и закончу. В ближайших планах у меня написание универсального скрипта на РНР4 для переноса данных из произвольной базы данных формата MS Access(а равно и иных форматов баз данных с поддержкой ODBC) в формат MySQL. Напишу и опишу все подробно.

Буду рад, если информация о работе с ODBC кому-то поможет!

Автор статьи: Жолобенко С.В. - огромный респект ему от меня за отличную статью!

Все свои вопросы Вы можете задавать на нашем форуме.

© 2002-2004 Copyright by GreatWeb.Ru
Копирование материалов рассылки возможно только в случае явного указания на сайт "GreatWeb.RU" как на источник информации.



http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное