Wiki-учебник по веб-технологиям: MySQL/ДоступКMySQL ...

Главная | Каталог |

Доступ к Mysql


Оглавление документа


База данных Mysql® стала самой популярной в мире базой данных с открытым исходным кодом — благодаря ее высокой производительности, надежности и легкости использования. Существует более 6 миллионов установок этой базы данных, начиная от больших корпораций и до специализированных встроенных приложений.



Система PHP предоставляет поддержку для Mysql с помощью набора функций, которые можно использовать для манипуляции данными Mysql. Задача этого учебника состоит в том, чтобы познакомить с этими функциями, используемыми обычно в ориентированных на данные приложениях PHP для извлечения, обновления, добавления и удаления данных. Используемые обычно функции PHP для Mysql описаны ниже.

Mysql_connect(имя сервера Mysql,имя пользователя,пароль) – открывает соединение с сервером Mysql.
Mysql_select_db(имя базы данных,идентификатор_соединения) – выбирает базу данных, расположенную на сервере Mysql. Параметр "имя базы данных" относится к активной базе данных на сервере Mysql, которая была открыта с помощью функции Mysql_connect.


«Идентификатор_соединения» является ссылкой на текущее соединение с Mysql.

Mysql_query(запрос sql) – посылает запрос активной в данный момент базе данных.
Mysql_fetch_array(resourse result) – возвращает массив, который соответствует извлеченной строке, и перемещает внутренний указатель данных вперед.
Mysql_affected_rows(resourse result) – определяет число строк, затронутых предыдущей операцией SQL.
Mysql_close(link_identifier) – закрывает соединение Mysql.


Прежде чем можно будет применять эти функции для создания приложений обработки данных с помощью Mysql, необходимо получить подходящий доступ к серверу Mysql. Для этого требуется учетная запись пользователя и пароль с полномочиями доступа к базе данных и таблицам, содержащим данные, а также имя хоста сервера Mysql или IP-адрес.

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

SQLyog (доступный на http://www.webyog.com) и Mysql Administrator (доступный на http://www.Mysql.com/products/tools/).

1. Добавление записей


С помощью рассмотренных в предыдущем разделе функций Mysql и языка SQL можно добавлять записи в таблицу базы данных. Записи добавляются с помощью формы, предоставляющей области для ввода информации. Нажатие кнопки вызывает затем сценарий PHP для записи новой информации в таблицу с помощью команды SQL INSERT.



Поля формы именованы соответствующим образом:

Name — 'Name', Email — 'Email', Web Connection — 'Connection', Residence (City/ST/Country) — 'Residence', Age — 'Age', Gender — 'Gender',
Comments — 'Comments'.

Прежде чем подробно рассматривать код, будет полезно посмотреть на синтаксис оператора SQL INSERT:

INSERT INTO TableName (FieldName1 [,FieldName2]...) VALUES (Value1 [,Value2]...)


Более подробное рассмотрение оператора INSERT дано в приложении.

Следующий код используется для обработки данных формы VisitorSurvey.php:
VisitorSurvey.php

<?php
if ($_POST[submit] == "Submit")
{
//Получение данных формы и присвоение скалярным переменным
$Name $_POST[Name];
$Email $_POST[Email];
$Connection $_POST[Connection];
$Residence $_POST[Residence];
$Age $_POST[Age];
$Gender $_POST[Gender];
$Comments $_POST[Comments];
//Установление соединения с базой данных
$conn Mysql_connect('localhost','root','xyxyxy');
//Выбор базы данных Mysql
$db Mysql_select_db('Membership'$conn);
//Оператор SQL
$sql "INSERT INTO Survey " .
"(Name,Email,Connection,Residence,Age,Gender,Comments) VALUES ('$Name',
'$Email', '$Connection',
'$Residence', '$Age', '$Gender', '$Comments')"
;
//Выполнение оператора SQL и сохранение результатов в множестве записей
$rs Mysql_query($sql,$conn);
Mysql_close($conn);
}
?>


Пример 10.1.

После нажатия кнопки отправки Submit создается суперглобальный массив $_POST, содержащий значения из формы. Значения массива присваиваются скалярным переменным. Это упрощает кодирование оператора SQL. Затем выполняется оператор Mysql_connect(). Этот оператор требует три параметра – имя хоста сервера Mysql, имя пользователя, и пароль. Здесь для соединения с базой данных Mysql используется строка соединения без DSN. Ссылка на соединение хранится в переменной $conn. Это пример ссылочной переменной PHP. В отличие от скалярных переменных и массивов, ссылочные переменные не применяются непосредственно в программе, но часто используются как параметры для других функций. После соединения с сервером базы данных Mysql следующий шаг состоит в выборе базы данных. Так как экземпляр сервера Mysql может содержать большое число баз данных, то задействуется функция Mysql_select_db для выбора одной из них для использования в приложении. Эта функция требует два параметра – имя базы данных и ссылку на соединение Mysql. Вслед за выбором базы данных формируется оператор SQL INSERT и присваивается переменной $sql. Затем функция Mysql_query() выполняет оператор SQL, создающий множество записей (множество записей базы данных).

Это множество записей присваивается переменной $rs, еще одной ссылочной переменной PHP. Отметим, что функция Mysql_query() требует два параметра — $sql (ссылка на текущий оператор SQL) и $conn (ссылка на текущее соединение с базой данных). Наконец, вызывается функция close() для закрытия текущего соединения с базой данных. Для таких приложений обычно желательно выполнять проверку данных, прежде чем заносить данные в таблицу базы данных. Это необходимо делать перед установлением соединения с базой данных с помощью методов, рассмотренных в разделе 6–2.

В случае ошибки кодирования данные не заносятся в таблицу базы данных, а PHP выведет предупреждение или сообщение об ошибке. В такой ситуации полезно подавить эти критические сообщения, добавить код для проверки ошибок вручную и сгенерировать более понятный для пользователя вывод. Это можно делать сразу после оператора Mysql_query(), проверяя статус вновь созданного множества записей — $rs.

Предположим, что в предыдущем коде функция Mysql_query() содержит вместо $sql параметр $sqlString. В этом случае PHP немедленно прекратит выполнение страницы и выведет сообщение об ошибке.

Вывод сообщения об ошибке PHP можно подавить с помощью оператора управления ошибками "@". При подавленном сообщении об ошибке можно добавить код для создания более понятного пользователю сообщения. Такой подход показан ниже:

VisitorSurvey.php

<?php
if ($_POST[submit] == "Submit")
{
//Получение данных формы и присвоение скалярным переменным
$Name $_POST[Name];
$Email $_POST[Email];
$Connection $_POST[Connection];
$Residence $_POST[Residence];
$Age $_POST[Age];
$Gender $_POST[Gender];
$Comments $_POST[Comments];
//Установление соединения с базой данных
$conn = @Mysql_connect('localhost','root','xyxyxy');
//Выбор базы данных Mysql
$db = @Mysql_select_db('Membership'$conn);
//Оператор SQL
$sql "INSERT INTO Survey " .
"(Name,Email,Connection,Residence,Age,Gender,Comments) VALUES ('$Name',
'$Email', '$Connection',
'$Residence', '$Age', '$Gender', '$Comments')"
;
//Выполнение оператора SQL и сохранение результатов в виде множества записей
$rs = @Mysql_query($sqlstring,$conn);
if (!
$rs)
{
echo 
"Произошла ошибка. Попробуйте еще раз.";
}
else
{
echo 
"Запись была успешно добавлена.";
}
Mysql_close($conn);
}
?>


Пример 10.2.

Вслед за функцией Mysql_query() используется оператор if для проверки статуса множества записей $rs. Если множество записей успешно создается, выводится сообщение «Запись была успешно добавлена». Если возникает проблема, выводится сообщение «Произошла ошибка. Попробуйте еще раз.»

2. Выбор записей


Кроме применения функций Mysql с оператором SQL INSERT для добавления записей в базу данных, можно также извлекать записи из таблицы базы данных с помощью оператора SQL SELECT.

Типичная форма ввода для выбора существующих записей из таблицы Directory показана ниже. В этом примере фиктивная компания, Company XYZ, имеет онлайн форму, которая позволяет пользователям ввести фамилию сотрудника и найти полное имя сотрудника, номер телефона и адрес e-mail.



Оператор SQL SELECT показан ниже:

SELECT * | [DISTINCT] field1 [,field2]... FROM TableName WHERE criteria ORDER BY FieldName1 [ASC|DESC] [,FieldName2 [ASC|DESC] ]...

Более подробно оператор SELECT рассматривается в приложении.

Следующий код используется для обработки формы DirectorySearch.php:

DirectorySearch.php

<?php
if ($_POST[submit] == "Search")
{
//Получение данных формы
$string $_POST['search'];
//Установление соединения с данными
$conn Mysql_connect('localhost','root','xyxyxy');
//Выбор базы данных
$db Mysql_select_db('Membership'$conn);
//Создание оператора SQL SELECT
$sql "SELECT * FROM Directory WHERE LName = '$string'";
$rs Mysql_query($sql$conn);
}
?>


<!DOCTYPE html PUBLIC "-//W3C/DTD/XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml11-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>Страница Web </title>
<style>
body {margin:15px;font:10pt Verdana}
td {vertical-align:top;border:solid 1px gray}
input,textarea{border:0px}
</style>
</head>
<body>
<form action="DirectorySearch.php" method="post">
<p>Введите ниже фамилию и нажмите кнопку "Search",
чтобы найти номер телефона и адрес e-mail сотрудника</p>
<table>
<tr>
<td colspan="2">Company XYZ Directory</td>
</tr>
<td><input type="text" size="15" name="SearchName"/></td>
<td><input type="submit" value="Search" name="submit"/>
</tr>
</table>
</form>
<div>
<?php
if(!empty($_POST))
{
while(
$row Mysql_fetch_array($rs))
{
echo 
"Name: " .$row['FName'] . " ";
echo 
$row['LName'] . "<br/>";
echo 
"Telephone: " $row['Telephone'] . "<br/>";
echo 
"Email: " $row['Email'] . "<br/>";
}
Mysql_close($conn);
}
?>
</div>
</body>
</html>


Пример 10.3.

Эта страница содержит два блока кода PHP. Первый выполняется, когда нажимается кнопка отправки формы “Search”. Введенная пользователем фамилия присваивается скалярной переменной '$string'. Затем создается соединение с базой данных и формируется оператор SQL SELECT для выбора всех (*) полей таблицы записей, в которых поле 'lastname' совпадает со строкой фамилии, введенной пользователем. В конце выполняется оператор SQL. Если найдены подходящие записи, то множество записей присваивается переменной '$rs'.

Второй блок кода появляется в теле документа XHTML. Код, содержащий операторы echo или print, помещается обычно между открывающим и закрывающим тегами <body>, так что он может выводиться или форматироваться в соответствии с другими элементами страницы. Операторы echo и print, появляющиеся в блоках PHP, закодированные выше тега <html>, всегда появляются в верху страницы и предшествуют всем другим ее элементам.

Назначение этого блока кода состоит в выводе извлеченных записей, если в предыдущем блоке кода был выполнен оператор SQL.

Сначала используется оператор if для проверки, что массив $POST не является пустым. Если этот массив будет пустым, то это означает, что форма не была отправлена, и никакие записи не были извлечены. Если этот условный оператор отсутствует, то будет возникать ошибка, так как массив Mysql_fetch_array не будет содержать никаких значений.

Затем используется цикл while для итераций по множеству записей. Во время каждой итерации по множеству записей функция Mysql_fetch_array() создает ассоциативный массив (здесь этот массив назван $row), содержащий значения полей текущей записи. Индексы массива соответствуют именам полей формы, а элемент массива соответствует значению поля. Каждая запись затем выводит
$row['FName'] — значение поля 'FirstName', $row['LName'] -- значение поля 'LastName', $row['Telephone'] – значение поля 'Telephone', и $row['Email'] – значение поля 'Email'. Этот процесс продолжается, пока не будет достигнут конец множества записей, при этом массив $row каждый раз будет содержать новые значения.

После вывода всех записей соединение с базой данных закрывается с помощью функции Mysql_close().

Ниже представлен пример вывода, созданного после поиска в каталоге.



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

DirectorySearch.php

<?php
if(!empty($_POST))
{
while(
$row Mysql_fetch_array($rs))
{
echo 
"Name: " .$row['FName'] . " ";
echo 
$row['LName'] . "<br/>";
echo 
"Telephone: " $row['Telephone'] . "<br/>";
echo 
"Email: " $row['Email'] . "<br/>";
}
if (
Mysql_affected_rows($rs) == 0)
{
echo 
"No records found!";
}
Mysql_close($conn);
}
?>
</div>
</body>
</html>

3. Удаление записей


Оператор SQL DELETE используется для удаления существующих записей в базе данных.

Синтаксис оператора SQL DELETE показан ниже:

DELETE FROM Имя_Таблицы WHERE критерий

Более подробно оператор DELETE рассматривается в приложении.

Следующая форма представляет запись пользователя, которая будет удалена из таблицы базы данных Personnel. Щелчок на кнопке Delete вызывает процедуру PHP, которая выполняет оператор SQL DELETE для удаления этой записи из таблицы базы данных.

Показанный выше измененный сценарий содержит дополнительно функцию Mysql_affected_rows(). Эта функция требует один параметр – ссылку на текущее множество записей $rs и определяет число строк, затронутых последней операцией SQL. Если возвращаемое функцией Mysql_affected_rows() значение равно 0, то оператор SQL SELECT не затронул ни одной строки. Поэтому подходящих записей найдено не было.



скрытое текстовое поле с именем "Auto Num?" со значением, равным полю AutoNum таблицы базы данных. Это поле используется для уникальной идентификации каждой записи. Следующий код демонстрирует, как работает страница:

DirectorySearch.php

<?php
if ($_POST['submitb']=="Delete Record")
{
$conn Mysql_connect('localhost','root','xyxyxy');
$db Mysql_select_db('Membership',$conn);
$sqlDelete "DELETE FROM Personnel WHERE AutoNum =" .
$_POST['AutoNum'];
$rsDelete Mysql_query($sqlDelete,$conn);
if(
Mysql_affected_rows($rsDelete) == 1)
{
echo 
"Запись успешно удалена!";
}
Mysql_close($conn);
}
?>


После нажатия кнопки “Delete Record” устанавливается соединение с базой данных Mysql. Затем создается оператор SQL DELETE для удаления записи из таблицы Personnel со значением поля AutoNum, равным значению скрытого текстового поля AutoNum. Затем оператор SQL выполняется. Результаты работы функции Mysql_query() присваиваются переменной $rsDelete. Последний шаг состоит в проверке, что удаление записи прошло успешно, и в выводе подтверждающего сообщения. Функция Mysql_affected_rows() используется для определения числа строк в множестве результатов ODBC или числа строк, затронутых оператором Mysql_query(). Так как будет удалена только одна запись, то результат Mysql_affected_rows() равный 1 означает, что запись удалена успешно. В конце соединение с базой данных закрывается.