
Вставка новых элементов в базу данных поразительно похожа на извлечение элементов из базы данных. Необходимо выполнитьте же действия — установить соединение, отправить запрос и проверить результаты. Только в данном случае вместо оператора 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().
 
               
               
               
               
              
Комментарии(0)
Для добавления комментариев надо войти в систему и авторизоватьсяКомментирование статей доступно только для зарегистрированных пользователей:Зарегистрироваться