Смекни!
smekni.com

Работа с базой данных MySQL средствами PHP (стр. 2 из 4)

Необходимо сделать нужные изменения (изменить название базы данных на testbase) в файле config.php:

Таблица people создана:

Можно просмотреть перечень таблиц созданной базы данных c помощью оператора SHOW:


Можно отобразить информацию о столбцах всех таблиц c помощью оператора DESCRIBE:

Для просмотра данных, сохраненных в таблице, можно применить оператор SELEKT:

Рекомендуется всегда создавать таблицы прямо в скриптах, которые с ними работают, потому что это делает сценарии автономными. К сожалению многие скрипты так не поступают. Обычно к ним прилагается SQL-файл с командами создания таблиц, который нужно запустить перед установкой скриптов. Этот способ не рекомендуется.

2.2 Вставка записей в таблицу. Функция INSERT

INSERT INTO ИмяТаблицы(ИмяПоля1 ИмяПоля2 ...) VALUES ('зн1', 'зн2',...)

Добавляет в таблицу ИмяТаблицы запись, у которой поля, обозначенные как ИмяПоля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']."&nbsp;</td>

<td>".$author['city']." &nbsp </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>&bsol;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 всегда истинно.

Рассмотрим два способы защиты от подобных ошибок или действий злоумышленника: