Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Стандартные функции PHP для работы с MySQL




 

Общая последовательность действий при взаимодействии с сервером MySQL выглядит так:

1. Установить соединение с сервером MySQL. Если попытка завершается неудачей, вывести соответствующее сообщение и завершить процесс.

2. Выбрать базу данных сервера MySQL. Если попытка выбора завершается неудачей, вывести соответствующее сообщение и завершить процесс. Допускается одновременное открытие нескольких баз данных для обработки запросов.

3. Обработать запросы к выбранной базе (или базам).

4. После завершения обработки запросов закрыть соединение с сервером баз данных.

 

В примерах этого раздела используются таблицы products, customers и orders (см. рис. 2).

 

Рис. 2. Пример реляционной БД

 

Итак, начнем с самого начала - то есть с подключения к серверу MySQL.

 

1) mysql_connect()

 

Функция mysql_connect() устанавливает связь с сервером MySQL После успешного подключения к MySQL можно переходить к выбору баз данных, обслуживаемых этим сервером. Синтаксис функции mysql_connect():

 

int mysql_connect ([string хост [:порт] [:/путь//к/сокету] [, string имя пользователя] [, string пароль])

 

В параметре хост передается имя хостового компьютера, указанное в таблицах привилегий сервера MySQL. Конечно, оно же используется для перенаправления запросов на web-сервер, на котором работает MySQL, поскольку к серверу MySQL можно подключаться в удаленном режиме. Наряду с именем хоста могут указываться необязательные параметры -- номер порта, а также путь к сокету (для локального хоста). Параметры имя_пользователя и пароль должны соответствовать имени пользователя и паролю, заданным в таблицах привилегий MySQL. Обратите внимание: все параметры являются необязательными, поскольку таблицы привилегий можно настроить таким образом, чтобы они допускали соединение без проверки. Если параметр хост не задан, mysql_connect() пытается установить связь с локальным хостом.

 

Пример открытия соединения с MySQL:

 

@mysql_connect(" local host", "web", "4tf9zzzf") or die("Could not connect to MySQL server!");

 

В данном примере localhost -- имя компьютера, web-- имя пользователя, а 4tf9zzzf -- пароль. Знак @ перед вызовом функции mysql_connect() подавляет все сообщения об ошибках, выдаваемые при неудачной попытке подключения, -- они заменяются сообщением, указанным при вызове die(). Обратите внимание: значение, возвращаемое при вызове mysql_connect(), в данном примере не используется. Если в программе используется всего одно соединение с сервером MySQL, это вполне нормально. Но если программа устанавливает соединения с несколькими серверами MySQL на разных хостах, следует сохранить идентификатор соединения, возвращаемый при вызове mysql_connect(), чтобы адресовать последующие команды нужному серверу MySQL. Пример:

 

<?

$link1 = @mysql_connect("www.somehost.com", "web", "abcde") or die("Could not connect to MySQL server!");

$link2 = @mysql_connect("www.someotherhost.com", "usr", "secret") or die("Could not connect to MySQL server!");

?>

 

Идентификаторы $link1 и $link2 передаются при последующих обращениях к базам данных с запросами. Вскоре вы узнаете, как именно адресовать запрос нужному серверу при помощи идентификатора соединения.

 

Функция mysql_pconnect() обеспечивает поддержку восстанавливаемых (persistent) соединений. В многопользовательских средах рекомендуется использовать mysql_pconnect() вместо mysql_connect() для экономии системных ресурсов. По типам параметров и возвращаемого значения функция mysql_pconnect() в точности совпадает c mysql_connect().

 

2) mysql_select_db()

 

После успешного соединения с MySQL необходимо выбрать базу данных, находящуюся на сервере. Для этого используется функция mysql_select_db(). Синтаксис функции mysql_select_db():

 

int mysql_select_db (string имя_базы_данных [, int идентификатор_соединения])

 

Параметр имя_базы_данных определяет выбираемую базу данных, идентификатор

которой возвращается функцией mysql_select_db(). Обратите внимание: параметр идентификатор_соединения необязателен лишь при одном открытом соединении с сервером MySQL. При наличии нескольких открытых соединений этот параметр должен указываться. Пример выбора базы данных функцией mysql_select_db():

 

<?

@mysql_connect("localhost", "web". "4tf9zzzf")

or die("Could not connect to MySQL server!");

@mysql_select_db("company") or die("Could not select company database!");

?>

 

Если в программе выбирается только одна база данных, сохранять ее идентификатор не обязательно. Однако при выборе нескольких баз данных возвращаемые идентификаторы сохраняются, чтобы вы могли сослаться на нужную базу при обработке запроса. Если идентификатор не указан, используется последняя выбранная база данных.

 

3) mysql_close()

 

После завершения работы с сервером MySQL соединение необходимо закрыть. Функция mysql_close() закрывает соединение, определяемое необязательным параметром. Если параметр не задан, функция mysql_close() закрывает последнее открытое соединение. Синтаксис функции mysql_close():

 

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

 

Пример использования mysql_close():

 

<?

@mysql_connect("localhost", "web", "4tf9zzzf")

or die("Could not connect to MySQL server!");

@mysql_select_db("company") or die("Could not select company database!"); print "You're connected to a MySQL database!";

?>

 

В этом примере указывать идентификатор соединения не нужно, поскольку на момент вызова mysql_close() существует лишь одно открытое соединение с сервером.

 

Соединения, открытые функцией mysql_pconnect(), закрывать не обязательно.

 

3. Выполнение запросов, выборка наборов данных

 

1) mysql_query()

Функция mysql_query() обеспечивает интерфейс для обращения с запросами к базам данных. Синтаксис функции mysql_query():

 

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

 

Параметр запрос содержит текст запроса на языке SQL. Запрос передается либо соединению, определяемому необязательным параметром идентификатор_соединения, либо, при отсутствии параметра, последнему открытому соединению.

 

Неопытные программисты часто ошибочно думают, что функция mysql_query() возвращает результаты обработки запроса. Это не так - в зависимости от типа запроса вызов mysql_query() может приводить к разным последствиям. При успешном выполнении команды SQL SELECT возвращается идентификатор результата, который впоследствии передается функции mysql_result() для последующего форматирования и отображения результатов запроса. Если обработка запроса завершилась неудачей, функция возвращает FALSE.

 

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

 

2) mysqL_affected_rows ()

 

Во многих ситуациях требуется узнать количество записей, участвующих в запросе SQL с командами INSERT, UPDATE, REPLACE или DELETE. Задача решается функцией mysql_affected_rows(). Синтаксис функции:

 

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

 

Обратите внимание: параметр идентификатор_соединения не является обязательным. Если он не указывается, mysql_affected_rows() пытается использовать последнее открытое соединение. Пример:

 

<?

// Подключиться к серверу и выбрать базу данных

@mysql_connect("localhost", "web". "4tf9zzzf")

or die("Could not connect to MySQL server!");

 

@mysql_select_db("company") or die("Could not select company database!");

 

// Создать запрос

$query = "UPDATE products SET prod_name = \"cantaloupe\"

WHERE prod_id = \'10001pr\";

 

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

$result = mysql_query($query);

 

// Определить количество обновленных записей

print "Total row updated; ".mysql_affected_rows();

 

mysql_close();

?>

 

При выполнении этого фрагмента будет выведен следующий результат:

 

Total row updated: 1

 

Функция mysql_affected_rows() не работает с запросами, основанными на команде SELECT. Для определения количества записей, возвращенных при вызове SELECT, используется функция mysql_num_rows().

 

В одной специфической ситуации функция mysql_affected_rows() работает с ошибкой. При выполнении команды DELETE без секции WHERE mysql_affected_rows() всегда возвращает 0.

 

3) mysql_num_rows()

 

Функция mysql_num_rows() определяет количество записей, возвращаемых командой SELECT. Синтаксис функции mysql_num_rows():

 

int mysql_num_rows(int результат)

 

Пример использования mysql_num_rows():

 

<?

// Подключиться к серверу и выбрать базу данных @mysql_connect("localhost", "web", "4tf9zzzf")

or die("Could not connect to MySQL server!");

 

@mysql_select_db("company") or die("Could not select company database!");

 

// Выбрать все товары, названия которых начинаются с 'р'

$query = "SELECT prod_name FROM products WHERE prod_name LIKE \"p*\"";

 

// Выполнить запрос $result = mysql_query($query);

print "Total rows selected: ".mysql_num_rows($result);

 

mysql_close();

?>

 

Поскольку таблица содержит лишь один товар, название которого начинается с буквы р (pears), возвращается только одна запись. Результат:

 

Total rows selected: 1

 

4)mysql_result()

 

Функция mysql_result() используется в сочетании с mysql_query() (при выполнении запроса с командой SELECT) для получения набора данных. Синтаксис функции mysql_resu1t():

 

int mysql_result (int идентификатор_результата, int запись [. mixed поле"]')

 

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

· смещение поля в таблице;

· имя поля;

· имя поля в формате имя_поля_имя_тдблицы.

 

В листинге 2.1 используется база данных, изображенная на рис. 2.

 

Листинг 2.1. Выборка и форматирование данных в базе данных MySQL

 

<?

@mysql_connect("localhost", "web", "ffttss")

or die("Could not connect to MySQL server!");

@mysql_select_db("company")

or die("Could not select products database!");

 

// Выбрать все записи из таблицы products

$query = "SELECT * FROM products"; $result = mysql_query($query);

 

$x = 0;

 

print "<table>\n";

print "<tr>\n<th>Product ID</th><th>Product Name</th><th>Product Price</th>\n</tr>\n";

 

while ($x < mysql_numrows($result)):

$id = mysql_result($result. $x. 'prod_id');

$name = mysql_result($result, $x, 'prod_name');

$price = mysql_result($result. $x, 'prod_price');

 

print "<tr>\n";

print "<td>$id</td>\n<td>$name</td>\n<td>$price</td>\n";

print "</tr>\n";

 

$x++;

endwhile;

 

print "</table>";

mysql_close();

?>

 

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

 

Листинг 2.2. Результат выполнения листинга 2.1

 

<table>

<tr>

<th>Product ID</th><th>Product Name</th><th>Product Price</th>

</tr>

<tr>

<td>1000pr</td>

<td>apples</td>

<td>1.23</td>

</tr>

<tr>

<td>1001pr</td>

<td>oranges</td>

<td>2.34</td>

</tr>

<tr>

<td>1002pr</td>

<td>bananas</td>

<td>3.45</td>

</tr>

<tr>

<td>1003pr</td>

<td>pears</td>

<td>4.45</td>

</tr>

</table>

 

Функция mysql_result() удобна для работы с относительно небольшими наборами данных, однако существуют и другие функции, работающие намного эффективнее, а именно, функции mysql_fetch_row() и mysql_fetch_array().

 

5) mysql_fetch_row()

 

Обычно гораздо удобнее сразу присвоить значения всех полей записи элементам индексируемого массива (начиная с индекса 0), нежели многократно вызывать mysql_result() для получения отдельных полей. Задача решается функцией mysql_fetch_row(), имеющей следующий синтаксис:

 

array mysql_fetch_row (int результат)

 

Использование функции list() в сочетании с mysql_fetch_row() позволяет сэкономить несколько команд, необходимых при использовании mysql_result(). В листинге 2.3 приведен код листинга 2.1, переписанный с использованием list() и mysql_fetch_row().

 

Листинг 2.3. Выборка данных функцией mysql_fetch_row()

 

<?

@mysql_connect("localhost", "web", "ffttss") or die("Could not connect to MySQL server!");

@mysql_select_db("company") or die("Could not select products database!");

$query = "SELECT * FROM products";

$result = mysql_query($query);

print "<table>\n";

print "<tr>\n<th>Product ID</th><th>Product Name</th><th>

Product Price</th>\n</tr>\n";

 

while ($row = mysql_fetch_array($result)):

print "<tr>\n":

print "<td>".$row["prod_id"]."</td>\n<td>".$row["prod_name"]."

</td>\n<td>".$row["prod_price"]. "</td>\n";

print "</tr>\n";

endwhile;

 

print "</table>";

mysql_close();

?>

 

Листинг 2.3 выдает тот же результат, что и листинг 2.1, но использует при этом меньшее количество команд.

 

6) my sql_fetch_array ()

 

Функция mysql_fetch_array() аналогична mysql_fetch_row(), однако по умолчанию значения полей записи сохраняются в ассоциативном массиве. Впрочем, вы можете выбрать тип индексации (ассоциативная, числовая или комбинированная). Синтаксис функции mysql_fetch_array():

 

array mysql_fetch_array (int идентификатор результата [, тип_индексации])

 

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

MYSQL_ASSOC - функция mysql_fetch_array() возвращает ассоциативный массив. Если параметр не указан, это значение используется по умолчанию;

MYSQL_NUM - функция mysql_fetch_array() возвращает массив с числовой индексацией;

MYSQL_BOTH - к полям возвращаемой записи можно обращаться как по числовым, так и по ассоциативным индексам.

 

Листинг 2.4 содержит очередной вариант кода листингов 2.1 и 2.3. На этот раз используется функция mysql_fetch_array(), возвращающая ассоциативный массив полей.

 

Листинг 2.4. Выборка данных функцией mysql_fetch_array()

 

<?

@mysql_connect("local host", "web", "ffttss")

or die("Could not connect to MySQL server!");

@mysql_select_db("company")

or die("Could not select products database!");

$query = "SELECT * FROM products";

$result = mysql_query($query);

"<table>\n";

print "<tr>\n<th>Product ID</th><th>Product Name</th> <th>Product Price</th>\n</tr>\n";

 

while ($row = mysql_fetch_array($result));

print "<tr>\n";

print "<td>".$row["prod_id"]."</td>\n <td>".$row["prod_name"]."</td>\n <td>". $row["prod_price"]. "</td>\n";

print "</tr>\n";

endwhile;

 

print "</table>";

mysql_close();

?>

 

Листинг 2.4 выдает тот же результат, что и листинги 2.1 и 2.3.

 

4. Использование PEAR для доступа к базе данных

 

PEAR::DB — это абстрактный класс доступа к базам данных, написанный на PHP.

 

Поясню на примере:

 

Предположим вы написали скрипт под mysql. И тут заказчик говорит Вам, что хостинг меняется и там есть только PostgreSQL. Если вы не использовали класс абстрактного доступа к базам данных, то вам пришлось бы:

· заменить весь код работы с mysql на postgresql

· переписать SQL-запросы (так как есть отличия)

 

Если бы вы использовали абстрактный слой доступа к БД, то вам скорее всего не пришлось бы менять php-код (только в одном месте указали бы что используете postgresql) и изменить SQL-запросы (хотя иногда и это не понадобилось бы).

 

D этом описании намеренно использовалась фраза "абстрактный класс доступа к БД", поскольку Pear::DB не единственный подобный класс. Наиболее известные конкуренты:

· ADODB

· Pear::MDB

 

Противники таких массивных классов, как ADODB или Pear::DB утверждают, что их использование плохо сказывается на производительности. Однако:

­ Скорость не часто является самым важным фактором

­ Использование таких классов повышает производительность программиста

­ При использовании софта, типа phpAccelerator падение производительности будет не таким заметным

­ Разработчики ADODB написали php-extension, который ускоряет работу класса (но работать можно и без него).

 

Для начала работы необходимо скачать пакет для работы с базами данных PEAR DB 1.7.14RC1 и основной пакет PEAR 1.7.0RC1. В корень сайта закачиваем скрипт примера, названный connect.php и создаем там папку PEAR/, куда из первого пакета закачиваем папку с файлами DB/ и файл DB.php, а из второго пакета только файл PEAR.php. Получилась следующая структура папок и файлов:

 

PEAR/

DB/

common.php

mysql.php

pgsql.php

DB.php

PEAR.php

connect.php

 

 

Теперь постепенно рассмотрим пример connect.php:

 

//подключение класса PEAR DB.

require_once("PEAR/DB.php");

 

 

Формируем массив параметров подключения. В данном примере идет подключение к mysql, изменив значение phptype вы не меняя кода (разве что учитывая особенности SQL запросов соответствующей БД) можете легко перейти с того же MySQL на упомянутый ранее PostgreSQL (pgsql):

 

$dsn = array(

'phptype' => 'mysql',

'username' => 'root',

'password' => '',

'hostspec' => 'localhost',

'database' => 'testdb',

);

 

Формируем массив опций подключения (в нашем примере это: отладка и переносимость):

 

$options = array(

'debug' => 2,

'portability' => DB_PORTABILITY_ALL,

);

 

 

Создаем объект $db и подключаемся к базе данных, при этом делаем проверку на работоспособность:

 

$db =& DB::connect($dsn, $options);

if (PEAR::isError($db)) die($db->getMessage());

 

Устанавливаем формат выдачи данных, в нашем случае в виде ассоциативного массива, подробней смотрите пояснения по DB_common::setFetchMode:

 

$db->setFetchMode(DB_FETCHMODE_ASSOC);

 

Формируем SQL запрос $sql к таблице testtable и выполняем его используя query, присваивая результат переменной $res, а затем проверяем на работоспособность:

 

$sql = "SELECT * FROM testtable LIMIT 10";

$res =& $db->query($sql);

if (PEAR::isError($res)) die($res->getMessage());

 

Выводим количество строк в результате запроса:

 

echo 'numRows: '.$res->numRows().'<br>';

 

 

Выводим данные строк результата запроса, перебирая данные в переменной $res, используя fetchRow, кусочки которых, в виде ассоциативного массива, присваиваем переменной $row.

echo '<pre>';

while ($row =& $res->fetchRow()) {

print_r($row);

}

echo '</pre>';

 

 

Очищаем переменную $res с данными запроса:

$res->free();

 

Отключаем соединение к базе данных:

$db->disconnect();

 

5. Внесение данных через PHP

 

Для добавления данных в БД посредствам php. можно использовать функцию mysql_query() и оператор INSERT.

Синтаксис оператора INSERT:

 

INSERT INTO Имя_таблицы [(Список полей)]VALUES (Список констант);

 

После выполнения оператора INSERT будет создана новая запись, в качестве значений полей будут использованы соответствующие константы, указанные в списке VALUES.

Рассмотрим пример использование оператора INSERT:

 

INSERT INTO CLIENTS

VALUES (1, 'Иванов И.И.', 'Вокзальная 3', 'Москва', '09599911100');

 

Добавляемые значения должны соответствовать тому порядку, в котором поля перечислены в операторе CREATE. Если вы хотите добавлять информацию в другом порядке, то вы должны указать этот порядок в операторе INSERT. С помощью INSERT мы можем добавлять данные и в определенные поля.

 

Пример:

 

//Функция добавления данных в БД

function getInsert($name,$age)

{

//Создаем запрос к БД

$insert = mysql_query("INSERT INTO test (name,age) VALUES('$name','$age')");

if(!$insert)

{

return exit('Ошибка добавления данных в БД');

}

//Если данные добавились успешно

echo "Данные успешно добавлены";

}

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...