Навигация
Главная
Поиск
Форум
FAQ's
Ссылки
Карта сайта
Чат программистов

Статьи
-Delphi
-C/C++
-Turbo Pascal
-Assembler
-Java/JS
-PHP
-Perl
-DHTML
-Prolog
-GPSS
-Сайтостроительство
-CMS: PHP Fusion
-Инвестирование

Файлы
-Для программистов
-Компонеты для Delphi
-Исходники на Delphi
-Исходники на C/C++
-Книги по Delphi
-Книги по С/С++
-Книги по JAVA/JS
-Книги по Basic/VB/.NET
-Книги по PHP/MySQL
-Книги по Assembler
-PHP Fusion MOD'ы
-by Kest
Professional Download System
Реклама
Услуги

Автоматическое добавление статей на сайты на Wordpress, Joomla, DLE
Заказать продвижение сайта
Программа для рисования блок-схем
Инженерный калькулятор онлайн
Таблица сложения онлайн
Популярные статьи
OpenGL и Delphi... 65535
Форум на вашем ... 65535
21 ошибка прогр... 65535
HACK F.A.Q 65535
Бип из системно... 65535
Гостевая книга ... 65535
Invision Power ... 65535
Пример работы с... 65535
Содержание сайт... 65535
ТЕХНОЛОГИИ ДОСТ... 65535
Организация зап... 65535
Вызов хранимых ... 65535
Создание отчето... 65535
Имитационное мо... 65535
Программируемая... 65535
Эмулятор микроп... 65535
Подключение Mic... 65535
Создание потоко... 65535
Приложение «Про... 65535
Оператор выбора... 65535
Реклама
Сейчас на сайте
Гостей: 11
На сайте нет зарегистрированных пользователей

Пользователей: 13,370
новичок: dogoco6
Новости
Реклама
Выполняем курсовые и лабораторные по разным языкам программирования
Подробнее - курсовые и лабораторные на заказ
Delphi, Turbo Pascal, Assembler, C, C++, C#, Visual Basic, Java, GPSS, Prolog, 3D MAX, Компас 3D
Заказать программу для Windows Mobile, Symbian

Меры близости на векторах в Delphi + Блок схемы
Моделирование интернет кафе на GPSS + Отчет
Моделирование станции технического обслуживания на GPSS + Отчет

Использование ext/mysqli: Обзор и подготовленные выражения

Данные запроса не должны проходить через функции вроде mysql_real_escape_string(), чтобы убедиться, что нет угрозы атаки "SQL-впрыска"[4] Вместо этого, клиент и сервер MySQL работают так, чтобы убедиться, что посланные данные безопасно обработаны при их комбинировании с подготовленным выражением.

Шаблон запроса выглядит как-то так:
INSERT INTO City (ID, Name) VALUES (?, ?);

Знак '?' можно использовать в большинстве мест, где используются символьные данные, например запрос может быть переделан из
SELECT Name FROM City WHERE Name = 'Calgary';

в
SELECT Name FROM City WHERE name = ?;

Вот более полный пример, демонстрирующий весь процесс:
$mysqli = new mysqli('localhost', 'user', 'password', 'world');

/* Проверка соединения */
if (mysqli_connect_errno()) {
printf("Подключение невозможно: %s\n", mysqli_connect_error());
exit();
}

$stmt = $mysqli->prepare("INSERT INTO CountryLanguage VALUES (?, ?, ?, ?)");
$stmt->bind_param('sssd', $code, $language, $official, $percent);

$code = 'DEU';
$language = 'Bavarian';
$official = "F";
$percent = 11.2;

/* выполнение подготовленного выражения */
$stmt->execute();

printf("%d Row inserted.\n", $stmt->affected_rows);

/* Закрытие соединения и выражения*/
$stmt->close();

/* Очистить таблицу CountryLanguage */
$mysqli->query("DELETE FROM CountryLanguage WHERE Language='Bavarian'");
printf("%d Row deleted.\n", $mysqli->affected_rows);

/* Закрыть подключение */
$mysqli->close();
?>

Обратите внимание на то, что первым параметром bind_param() является короткая строка. Это строка формата, используемая для определения того, как объявленные параметры должны быть интерпретированы.

В случае вышеприведенного сценария 'sssd' означает, что значения первых трех параметров $code, $language и $official будут посланы как строки, а четвертый параметр $percent будет содержать значения типа double с плавающей запятой.

Для каждой заявленной переменной в bind_param(), должна быть своя буква в строке формата, которая означает, как переменная будет отправлена. Например
$stmt->bind_param('s', $foo);
$stmt->bind_param('si', $foo, $bar);
$stmt->bind_param('sid', $foo, $bar, $baz);

Объявление типов обеспечивает то, что расширение mysqli знает, как зашифровать данные для большей эффективности.

Определения типов очень просты: данные в заданных переменных будут обрабатываться как целочисленные, рациональные числа (double) или как строки.

Также имеется специальный тип, позволяющий отправлять блобы (большие бинарные объекты) порциями.

Следующая таблица иллюстрирует типы и возможности использования: Идентификатор типа Тип столбца
i Все INT типы
d DOUBLE и FLOAT
b BLOB'ы
s Остальные типы
4.2 С заданными результатами

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

Процесс объявления таков:
Создать запрос.
Попросить сервер MySQL заготовить запрос.
Привязать переменные PHP к столбцам в заготовке запроса.
Заставить сервер MySQL выполнить запрос.
Запросить добавление нового ряда данных в привязанные переменные.
Вот простой фрагмент кода, иллюстрирующий процесс:
$mysqli = new mysqli("localhost", "user", "password", "world");

if (mysqli_connect_errno()) {
printf("Подключение невозможно: %s\n", mysqli_connect_error());
exit();
}

/* Подготовленное выражение */
if ($stmt = $mysqli->prepare("SELECT Code, Name FROM Country ORDER BY Name LIMIT 5")) {
$stmt->execute();

/* Привязывание переменных к заготовке */
$stmt->bind_result($col1, $col2);

/* Выборка значений */
while ($stmt->fetch()) {
printf("%s %s\n", $col1, $col2);
}

/* Закрытие оператора $stmt->close();
}
/* Закрытие соединения */
$mysqli->close();

?>
4.3 Использование заданных параметров и результатов вместе

Вот более полный пример, демонстрирующий использование и заданных параметров, и заданных результатов одновременно:
$mysqli = new mysqli("localhost", "user", "password", "world");

if (mysqli_connect_errno()) {
printf("Подключение невозможно: %s\n", mysqli_connect_error());
exit();
}

/* Подготовленное выражение */
if ($stmt = $mysqli->prepare("SELECT Code, Name FROM Country WHERE Code LIKE ? LIMIT 5")) {

$stmt->bind_param("s", $code);
$code = "C%";

$stmt->execute();

/* Объявление переменных для заготовленного выражения*/
$stmt->bind_result($col1, $col2);

/* Выборка значений */
while ($stmt->fetch()) {
printf("%s %s\n", $col1, $col2);
}

/* Закрытие выражения */
$stmt->close();
}
/* Закрытие подключение */
$mysqli->close();

?>
5. Резюме

В этой статье мы привели обзор возможностей и архитектуры ext/mysqli, а также краткое изложение истории его развития. К этому моменту вы должны понимать, как использовать и получать выгоду от подготовленных выражений MySQL и должны чувствовать удобство использования объектно-ориентированного интерфейса к ext/mysqli.
6. Словарь терминов

ext/mysql - старое расширение PHP для работы с MySQL. Не поддерживает всех возможностей MySQL версий 4.1 и выше.

ext/mysqli - новое расширение PHP 5 для работы с MySQL. Поддерживает возможности MySQL версий от 3.22 до 5.0

Клиентская библиотека MySQL - Компонент MySQL RDBMS (MySQL Relational DataBase Management System - Система управления реляционной базой данных MySQL - прим. переводчика), который позволяет программам общаться с RDBMS.

Сервер MySQL - Компонент MySQL RDBMS, который обрабатывает и отвечает на запросы, управляет файловым представлением данных внутри базы и т.д.

[1] - Функция mysql_pconnect() была создана для предоставления механизма уменьшения затрат на установление и разрыв соединений с сервером MySQL. К сожалению, из-за взаимодействия между архитектурами сервера Apache и PHP, большой трафик на сайте, использующем pconnect, мог быстро загрязнить сервер MySQL большим количеством неиспользуемых соединений, которые мешали активным соединениям получать доступ к базе данных.

[2] - Возможности автоматического соединения позволяли определенным вызовам функций автоматически соединяться с базой данных (если правильная информация о соединении находилась в конфигурационном файле php.ini). Возможность соединения по умолчанию работала по следующему принципу. Последнее открытое соединение с базой MySQL становится используемым соединением, если параметр соединения не был явно указан в аргументах функции.

[3] - Это расширение все еще находится в стадии разработки. В то время как набор возможностей ядра должен быть действительно стабильным, ни MySQL 4.1, ни PHP 5.0 не имеют стабильных релизов (статья появилась до выхода PHP 5.0.0 - прим. переводчика). Также, дополнительный набор возможностей, который не очень аккуратно использует клиентскую библиотеку MySQL, все еще дорабатывается.

[4] - Атаки типа "SQL-впрыск" возможны, когда данные входят в запрос, заставляя его совершать неожиданные и/или злонамеренные действия. Пусть, для примера, дан простой запрос в PHP скрипте типа "DELETE FROM grades WHERE class_name='test_$class'". Атакующий может получить контроль над переменной $class и получить возможность an attacker who can gain control over the value of $class can force unintended deletes to occur by changing the value of $class to something like "oops' or class_name LIKE '%'".
7. Об авторах

Зак Грэнт (Zak Greant) - профессиональный защитник концепции Open Source, писатель и программист. Он работает в MySQL AB пропагандистом Сообщества. Зак поддерживает оба расширения PHP для работы с MySQL и является соавтором PHP Functions Essential Reference.

Георг Рихтер (Georg Richter) - создатель расширения mysqli. Он также поддерживает расширения mysql и ncurses. Он работает в MySQL AB Старшим Разработчиком и является членом Apache Software Foundation.
Опубликовал Kest November 02 2008 14:23:51 · 0 Комментариев · 10009 Прочтений · Для печати

• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •


Страница 2 из 2 < 1 2
Комментарии
Нет комментариев.
Добавить комментарий
Имя:



smiley smiley smiley smiley smiley smiley smiley smiley smiley
Запретить смайлики в комментариях

Введите проверочный код:* =
Рейтинги
Рейтинг доступен только для пользователей.

Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.

Нет данных для оценки.
Гость
Имя

Пароль



Вы не зарегистрированны?
Нажмите здесь для регистрации.

Забыли пароль?
Запросите новый здесь.
Поделиться ссылкой
Фолловь меня в Твиттере! • Смотрите канал о путешествияхКак приготовить мидии в тайланде?
Загрузки
Новые загрузки
iChat v.7.0 Final...
iComm v.6.1 - выв...
Visual Studio 200...
CodeGear RAD Stud...
Шаблон для новост...

Случайные загрузки
Язык программиров...
Matrix2D
Illusion
TMS
Delphix Sample [И...
Prolog Interprete...
PBEditPack
WinAmp
Простой текстовый...
PHP 5. Полное рук...
Керниган Б.В., Ри...
Защита от спама ...
Программирование ...
Delphi 6/7 базы д...
Proeffectimage
Род Стивенс. Delp...
Создание меню на ...
Scrrlcaptoin
Формирование отче...
Развивающийся фла...

Топ загрузок
Приложение Клие... 100774
Delphi 7 Enterp... 97836
Converter AMR<-... 20268
GPSS World Stud... 17014
Borland C++Buil... 14191
Borland Delphi ... 10291
Turbo Pascal fo... 7374
Калькулятор [Ис... 5984
Visual Studio 2... 5207
Microsoft SQL S... 3661
Случайные статьи
Операции над матри...
Web-дизайн
Установка съемной ...
Благодарности
Загрузка файлов CM...
Наиболее элементар...
Занятие 3. Защита ...
Где купить сила им...
Страница, имеющая ...
Главный долгострой...
Протокол RSVP
Класс-адаптер для...
Разборка Mac на части
Если у клиента либ...
Вычислительная мат...
Другие способы лам...
8.4. Трассировка ...
Заказчик на месте ...
Мягкая мебель
Задача о шахматах....
Вопросы проектиров...
Линия тренда
Illegal assignment
10.4. Методы умень...
Пропускная способн...
Статистика



Друзья сайта
Программы, игры


Полезно
В какую объединенную сеть входит классовая сеть? Суммирование маршрутов Занимают ли таблицы память маршрутизатора?