Вставка новых элементов в базу данных поразительно похожа на извлечение элементов из базы данных. Необходимо выполнитьте же действия — установить соединение, отправить запрос и проверить результаты. Только в данном случае вместо оператора SELECT будет использоваться INSERT.
newbook.php — HTML-код страницы ввода информации о новых книгах
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />
<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 PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />
<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().