Навигация
Главная
Поиск
Форум
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
Реклама
Сейчас на сайте
Гостей: 88
На сайте нет зарегистрированных пользователей

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

Моделирование работы перекрёстка по регулированию движения на GPSS + Поя...
Моделирование процесса передачи данных по магистрали с основным и резерв...
Расчет размера дохода на одного человека в Turbo Pascal

Использование 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 Комментариев · 10043 Прочтений · Для печати

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


Страница 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...
Шаблон для новост...

Случайные загрузки
Ehlib
Visual Basic Script
Иллюстрированный ...
Заставка. Изображ...
Длинный заголовок...
JanComp
Удаление своего EXE
Разработка интерн...
AUTOWEB
AlignEdit
PDJ_Anima
Rss Parser
Crypt32
Info
Email
Основы программир...
C# в кратком изло...
Drag&Drop
Dynamic Titles дл...
Отключение и вклю...

Топ загрузок
Приложение Клие... 100774
Delphi 7 Enterp... 97854
Converter AMR<-... 20269
GPSS World Stud... 17021
Borland C++Buil... 14196
Borland Delphi ... 10307
Turbo Pascal fo... 7376
Калькулятор [Ис... 5990
Visual Studio 2... 5207
Microsoft SQL S... 3661
Случайные статьи
Содержание
Фирма Adobe
6.2. Уровни разраб...
Удаление ранее вве...
Установка дистанци...
Абстрактная машина...
Жидкость oldchemist
Процесс компиляции
внутренней сети
9.1. Типичная история
Замечания и задачи
Уход за компьютеро...
Разработка Web-фо...
Каналы STREAMS
Можно ли найти сам...
Лучшие игры в кази...
Объектно-ориентиро...
Функция-фильтр «ум...
Глава 2. Интерфейсы
IT-персонал
Схема кодирования,...
Как узнать свой снилс
использования в их...
RMULT (УСТАНОВИТЬ ...
использование SNMP...
Статистика



Друзья сайта
Программы, игры
Error: Incorrect password!
Error: Incorrect password!


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