p align="left">Добавляет в таблицу ИмяТаблицы запись, у которой поля, обозначенные как ИмяПоля1 ИмяПоля2 ...установлены в значения соответственно зн№. Те поля, которые в этой команде не перечислены, получают "неопределенные" значения. Неопределенное значение (NULL) -- это не пустая строка, а просто признак, который говорит MySQL, что у данного поля нет никакого значения. Впрочем, если для неуказанного здесь поля при создании таблицы был задан NOT NULL, то поле получит значение по умолчанию (чаще всего 0 или пустая строка). Значения полей можно заключать и в обычные кавычки, но апострофы тут использовать удобнее; к тому же, так положено по стандарту SQL. При вставке в таблицу бинарных данных (или текстовых, содержащих апострофы и слэши) некоторые символы должны быть "защищены" обратными слэшами, а именно символы \, ' и символ с нулевым кодом (в РНР обозначается как "\х00" или chr(0)). Существует альтернативный синтаксис для данной команды, специфичный для MySQL: INSERT INTO ИмяТаблицы SET ИмяПоля1='зн1', ИмяПоля2='зн2', . . . На практике он часто оказывается удобнее первого. 2.3 Удаление записей. Функция DELETE DELETE FROM ИмяТаблицы WHERE выражение Удаляет из таблицы ИмяТаблицы все записи, для которых выполнено выражение. Параметр выражение -- это просто логическое выражение, составленное "почти" по правилам РНР. Вот показательный пример: DELETE FROM topics WHERE forum_id=10 AND user != "moderator" В выражении, помимо имен полей, констант и операторов, могут также встречаться простейшие "вычисляемые" части, например: (id < 10+11*234). Вообще говоря, формат выражения един для всех команд запросов, которые мы встретим в дальнейшем. Например, он же используется и в операции SELECN, и в операции UPDATE. 2.3 Обновление записей. Функция UPDATE UPDATE ИмяТаблицы SET (ИмяПоля1= 'зн1', ИмяПоля1-- 'зн2', ...) WHERE выражение В таблице ИмяТаблицы для всех записей, удовлетворяющих выражению выражение, указанные поля устанавливаются в соответствующие значения. При этом остальные поля остаются без изменения. Эта команда часто выполняется, если не требуется обновлять сразу все поля какой-то записи, а нужно затронуть только некоторые. 2. Отправка запроса серверу для извлечения одной стоки из таблицы базы данных. Функция mysql_query resource mysql_query (string query) Эта функция применяется для отправки серверу SQL-запросов. Функция возвращает дескриптор запроса в случае успеха и false -- в случае неудачного выполнения запроса. В листинге показан код, с помощью которого извлекается одна строка из таблицы customers базы данных books: <? include "config.php";//Подключение к серверу и выбор базы данныхх $ath = mysql_query("select * from customers;"); if($ath) { $author = mysql_fetch_array($ath); echo "<br>имя = ".$author['name']."<br>"; echo "адрес = ".$author['city']."<br>"; } else { echo "<p><b>Error: ".mysql_error () . "</b></p>" ; exit () ; } ?> Результат выполнения запроса для вывода одной строки из таблицы: 2.. Вывод всех строк таблицы базы данных в виде ассоциативного массива. Функция mysql_fetch_array array mysql_fetch_array (resource result) Эта функция возвращает значения полей в виде ассоциативного массива. В качестве аргумента принимает дескриптор запроса, возвращаемый функцией mysql_query. В листинге показано, как с помощью этой функции можно вывести все строки таблицы customers:базы данных books <? include "config.php";//Подключение к серверу и выбор базы данных $ath = mysql_query("select * from customers;"); if($ath) { //Определяем таблицу и заголовок echo "<table border=1>"; echo"<tr> <td>имя</td> <td>адрес</td> </tr>"; //Так как запрос возвращает несколько строк, применяем цикл while($author = mysql_fetch_array($ath)) { echo "<tr> <td>".$author['name']." </td> <td>".$author['city']."   </td> </tr>"; } echo "</table>"; } else { echo "<p><b>Error: " .mysql_error () . "</b><p>"; exit () ; } ?> Результат выполнения запроса для вывода всех строк из таблицы: 2.. Доступ к отдельному полю записи. Функция mysql_result mixed mysql_result (resource result, int row) С помощью этой функции можно получить доступ к отдельному полю записи. Допустим, нам нужно вывести имя автора, которое первым найдется в базе данных. Сделать это можно следующим образом: <? include "config.php";//Подключение к серверу и выбор базы данных $ath = mysql_query("select name from customers;"); if($ath) { echo mysql_result($ath,0,'name'); } else { echo "<p><b>Error: " .mysql_error () . "</b><p>"; exit () ; } ?> 2.. Возвращение поля записи в виде объекта. Функция mysql_fetch_object object mysql_fetch_object (resource result) Эта функция возвращает поля записи данных в виде объекта. В листинге приведен пример, в котором с помощью этой функции из таблицы customers выводятся имя, и адрес авторов: <? include "config.php";//Подключение к серверу и выбор базы данных $ath = mysql_query("select * from customers;"); if($ath) { while($row = mysql_fetch_object($ath)) { echo "<p>имя: ".$row->name."</p>"; echo "<p>адрес: ".$row-> city."</p>"; } } else { echo "<p><b>Error: ".mysql_error () . "</b><p>"; exit(); } ?> Результат выполнения скрипта: 2.. Возвращение массива, в котором содержится значение поля. Функция mysql_fetch_row array mysql_fetch_row (resource result) В отличие от функции mysql_fetch_object, эта функция возвращает не объект, а массив, в котором содержатся значения полей: <? include "config.php";//Подключение к серверу и выбор базы данных $ath = mysql_query("select * from customers;"); if($ath) { while($row = mysql_fetch_row($ath)) { echo "<p>имя: ".$row[3]."</p>"; echo "<p>адрес: ".$row[2]."</p>"; } } else { echo "<p><b>Error: " .mysql_error () . "</b><p>"; exit (); } ?> Результаты выполнения этого кода: 2.. Пример комплексного использования информационных функций Листинг info_1.php <?php ## Получение информации о таблице. include "config.php";//Подключение к серверу и выбор базы данных // Получаем все данные таблицы. $result = mysql_query('SELECT * FROM people'); // Запрашиваем идентификатор данных о полях таблицы. $fields = mysql_num_fields ($result); // Узнаем число записей в таблице. $rows = mysql_num_rows($result); // Получаем имя таблицы (правда, мы его и так знаем, но все же...) $table = mysql_field_table($result,0); echo "Таблица '$table' содержит $fields колонок и $rows cтpoк<BR>" echo "Таблица содержит следующие поля:<ВR>"; // "Проходимся" по всем полям и выводим информацию о них. for ($i=0; $i<$fields; $i++) { $type = mysql_field_type($result, $i); $name = mysql_field_name($result, $i); $len = mysql_field_len($result, $i); $flags.= mysql_field_flags($result, $i) ; echo "$name $type($len) $flags<BR>\n"; } ?> 3. MySQL И ПРОБЛЕМЫ БЕЗОПАСНОСТИ Запросы, отправляемые серверу MySQL, представляют собой обыкновенные строки РНР: mysql_query("INSERT INTO table SET name='$name'"); В $name может храниться строка, содержащая апострофы. Рассмотрим, какой запрос придет серверу MySQL, если $name равно "cat's": INSERT INTO table SET name='cat's' Эта команда синтаксически некорректна и породит ошибку во время выполнения. Но может быть и хуже. Рассмотрим такой запрос: mysql_query("DELETE FROM table WHERE name='$name'"); Если параметр $name приходит из формы, и злоумышленник указал в нем следующую строку: "!' or 1=1 or '!", то после подстановки получится такой запрос к базе данных: DELETE FROM table- WHERE name=' !' OR 1=1 OR ' !' Этот запрос удалит все записи из таблицы table, потому что выражение SQL 1=1 всегда истинно. Рассмотрим два способы защиты от подобных ошибок или действий злоумышленника: ? Экранирование спецсимволов. ? Шаблоны запросов и placeholders. 3.1 Экранирование спецсимволов Прежде чем передавать значения переменных формы в SQL-запросы, необходимо специальным образом экранировать в них некоторые символы (в частности, апостроф), например, поставить перед ними обратный слэш. Для вставки предназначена функция: mysql_escape_string() string mysql_escape_string(string $str) Функция похожа на другую функцию addslashes(), однако она добавляет слэши перед более полным набором специальных символов. Практика показывает, что для текстовых данных можно применять и функцию addslashes() вместо mysql_escape_string(). Во многих скриптах так и делается. По стандарту MySQL экранированию подвергаются символы, которые в РНР записываются так: "\х00", "\n", "\г", "\\", ""', "" и "\х1А". В это число входит символ с нулевым ASCII-кодом, а поэтому mysql_escape_string() допустимо применять не только для текстовых, но также и для бинарных данных. Можно, например, считать в переменную GIF-изображение (функция file_get_contents ()), а затем вставить его в базу данных, предварительно проэкранировав все спецсимволы. При извлечении картинка окажется в том же виде, в котором она была изначально. Экранирование символов это лишь способ записи корректных SQL-выражений, не более того. С данными ничего не происходит, и они хранятся в базе без дополнительных слэшей -- так, как выглядели изначально, еще до экранирования. С использованием mysql_escape_string()код предыдущего запроса выглядит так: mysql_query( "DELETE FROM table WHERE name='".mysql_escape_string($name)."'" ); Это длинно, неуклюже и некрасиво. 3.2 Шаблоны запросов и placeholders Рассмотрим другое решение. Вместо явного экранирования и вставки переменных в запрос на их место помещают специальные маркеры (placeholders, "хранители места"), обычно выглядящие как ?. Те же значения, которые будут подставлены вместо них, передаются отдельно, дополнительными параметрами. С использованием гипотетической функции mysql_qwo, код которой будет представлен ниже, предыдущий запрос может быть переписан так: mysql_qw ('DELETE FROM table WHERE name=?', $name); Запрос стал короче и лучше защищен: теперь мы уже при написании кода не сможем случайно пропустить вызов функции mysql_escape_string() и, таким образом, попасться на уловку хакера. Все преобразования происходят автоматически, внутри функции. В листинге lib_mysql_qw.php содержится простейшая реализация функции mysql_qw() (qw -- от англ. query wrapper, "обертка для запроса").
Страницы: 1, 2, 3
|