ресурс для начинающих веб-разработчиков
комплексные веб-услуги по созданию сайтов

Справочный материал по основным языкам программирования и верстки сайтов.

Готовая методика создания простых и сложных динамичных сайтов, с использованием PHP и MySQL.

Использование веб-редактора Adobe Dreamweaver в разработке сайтов.

Использование графических редакторов Adobe Flash, Adobe Photoshop, Adobe Fireworks в подготовке веб-графики.

Разработка веб-сайтов под "ключ".

Разработка отдельных фрагментов сайтов, консультации по вопросам верстки веб-страниц и веб-программирования.

Внесение новой информации в базу данных. Использование подготовленных операторов

Внесение новой информации в базу данных

Вставка новых элементов в базу данных поразительно похожа на извлечение элементов из базы данных. Необходимо выполнитьте же действия — установить соединение, отправить запрос и проверить результаты. Только в данном случае вместо оператора SELECT будет использоваться INSERT.

newbook.php — HTML-код страницы ввода информации о новых книгах

<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>Интернет-магазин - Форма ввода новой книги</title>
</head>

<body>
<h1>Интернет-магазин - Форма ввода новой книги</h1>
<form action="insert_book.php" method="post">
<table width="60%" border="0" >
<tr>
<td width="34%">ISBN</td>
<td width="66%"><input name="isbn" type="text" size="13" maxlength="13" /></td>
</tr>
<tr>
<td>Автор </td>
<td><input name="author" type="text" size="30" maxlength="30" /></td>
</tr>
<tr>
<td>Название</td>
<td><input name="title" type="text" size="30" maxlength="60" /></td>
</tr>
<tr>
<td>Цена, руб</td>
<td><input name="price" type="text" size="8" maxlength="8" /></td>
</tr>
<tr>
<td colspan="2"><input name="input" type="submit" value="Зарегистрировать" /></td>
</tr>
</table>
</form>
</body>
</html>

Результаты заполнения этой формы передаются в insert_book.php, а сценарий, занимающийся деталями, выполняет несколько несложных проверок и пытается записать данные в базу данных.

insert_book.php —этот сценарий записывает новые книги в базу данных

<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>Интернет-магазин - Результаты ввода новой книги</title>
</head>

<body>
<h1>Интернет-магазин - Результаты ввода новой книги</h1>
<?php
//создание коротких имен переменных
$isbn = $_POST['isbn'];
$author = $_POST['author'];
$title = $_POST['title'];
$price = $_POST['price'];

if (!isbn || !$author || !$title || !$price)
{
echo 'Вы ввели не все необходимые сведения. <br>'
.'Пожалуйста, вернитесь на предыдущую страницу и повторите ввод.';
exit;
}
if (!get_magic_quotes_gpc())
{
$isbn = addslashes ($isbn);
$author = addslashes ($author);
$title = addslashes ($title);
$price = doubleval ($price);
}
@ $db = new mysqli ('localhost', 'root', 'tktyf', 'books');
if (mysqli_connect_errno())
{
echo 'Ошибка: Не удалось установить соединение с базой данных. Пожалуйста повторите попытку позже.';
exit;
}
$query = "insert into books values
('".$isbn."', '".$author."', '".$title."', '".$price."')"
;
$result = $db -> query($query);
if ($result)
echo $db -> affected_rows. " книг (а,и) добавлено в базу данных.";
?>
</body>
</html>

Результаты успешного добавления книги.

Сценарий завершен успешно и сообщает о добавлении книги в базу данных

После изучения кода insert_book.php становится ясно, что во многом похож на код сценария для извлечения информации из базы данных. Мы проверяем, что все поля формы заполнены, и если необходимо, с помощью функции addslashes() соответствующим образом их форматируем для вставки в базу данных:

if (!get_magic_quotes_gpc())
{
$isbn = addslashes ($isbn);
$author = addslashes ($author);
$title = addslashes ($title);
$price = doubleval ($price);
}

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

Мы снова соединяемся с базой данных, создавая экземпляр mysqli и подготавливая запрос, который должен быть отправлен базе данных. В данном случае это SQL запрос INSERT.

$query = "insert into books values
('".$isbn."', '".$author."', '".$title."', '".$price."')";
$result = $db -> query($query);

Этот запрос выполняется в базе данных как обычно — с помощью вызова $db -> query() или mysqli_query, если используется процедурный подход.

Одно существенное различие между SQL-оператором INSERT и SELECT связано с использованием функции mysqli_affected_rows(). В процедурной версии это действительно функция, тогда как в объектно-ориентированной версии она представляет собой переменную-член класса:

echo $db -> affected_rows. " книг (а,и) добавлено в базу данных.";

В предыдущем сценарии функция mysqli_num_rows() применялась для определения количества строк, возвращаемых запросом SELECT. При написании запросов, которые изменяют базу данных, например, INSERT,DELETE, UPDATE, вместо этой функции следует использовать mysqli_affected_rows().

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

Библиотека mysqli поддерживает использование подготовленных операторов. Они полезны для ускорения выполнения множества одних и тех же запросов, но сразными данными. Подготовленные операторы также предохраняют от атак внедрения SQL-кода во вводимые данные.

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

В сценарии insert_book.php подготовленные операторы можно использовать следующим образом:

$query = "insert into books values (?, ?, ?, ?)";
$stmt = $db -> prepare ($query);
$stmt -> bing_param ("sssd", $isbn, $author, $title, $price);
$stmt -> execute();
echo $stmt -> affected_rows. ' книг (а,и) добавлено в базу данных.';
$stmt -> close();

Рассмотрим приведенный код.

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

Во второй строке вызывается $db -> prepare ($query), или mysqli_stmt_prepare() в процедурной версии. Эта строка создает объект оператора или ресурс, который затем будет использоваться для дальнейшей обработки.

В объекте оператора определен метод bing_param (). В процедурной версии это функция mysqli_stmt_bing_param(). Назначение bing_param() состоит в том, чтобы сообщить PHP, какими переменными должны быть замещены знаки вопроса в запросе. Первый параметр представляет собой строку формата, чем-то похожую на строку формата, используемую в функции printf(). Используемое значение "sssd", означает, что будут передоваться три строки и число двоичной точности. Допускается также передача целочисленного значения (i) и большого двоичного объекта (b). После параметра формата должны следовать переменные, значения который будут замещать знаки вопроса в запросе, в порядке их следования.

Вызов $stmt -> execute() или mysqli_stmt_execute() в процедурной версии, выполняет запрос. Затем можно посмотреть количество задействованных строк и закрыть оператор.

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

Подобно связыванию параметров, можно связать и результаты. Для запросов SELECT можно использовать $stmt -> bing_result() или mysqli_stmt_bing_result(), для построения списка переменных, в которых должны помещаться столбцы результата. Каждый раз, когда вы вызываете $stmt -> fetch () или mysqli_stmt_fetch(), значения столбцов из следующей строки результирующего набора заносятся в заданные переменные связи. Например, в рассмотренном выше сценарии поиска книг, можно было бы воспользоваться следующим оператором:

$stmt -> bing_result ($isbn, $author, $title, $price);

для связывания перечисленных четырех переменных с четырмя столбцами, возвращаемыми запросом. После вызова

$stmt -> execute();

можно сделать следующий вызов:

$stmt -> fetch ();

в цикле. Каждое такое обращение извлекает следующую строку из результата и заносит ее в переменные.

В одном и том же сценарии можно использовать и mysqli_stmt_bing_param(), и mysqli_stmt_bing_result().