Бегло просмотрев справочник функций по работе с MySQL в PHP, я не обнаружил действительно удобного способа квотирования специальных символов (кавычек, обрывов строк и т.д. ) в PHP.
Я нашел функцию
string mysql_real_escape_string (string unescaped_string [, resource link_identifier])
Но, на мой взгляд ее использование при большом количестве входных данных не очень удобно.
Хотелось бы привести пример скрипта на Перл, к котором есть более удобный, на мой взгляд, способ решения этой проблемы и спросить у форумчан: есть ли подобная возможность квотирования в языке php:
Perl код:
use strict;
use DBI;
my $dbh = DBI->connect('DBI:mysql:database_name:localhost','user', 'password');
my $external_item1 = 10;
my $external_item2 = 20;
my $external_item3 = '"Hello';
# Создаем запрос. Знаки вопроса означают, что на их место будут вставленны
# данные при выполнении функции executemy $sth = $dbh->preare("SELECT * FROM table_name
WHERE id = ?
AND value = ?
AND name = ? ");
# А эта функция вставляет данные на место знаков вопроссов,
# автоматически квотируя их
# Т.е. вместо первого знака вопроса вставится квотированное значение
# $external_item1 ... вместо 3-го - $external_item3
$sth->execute($external_item1, $external_item2, $external_item3);
while (my @array = $sth->fetchrow_array()) {
print"Получен новый столбец!\n";
}
Re: Квотирование данных MySQL запроса в PHP по сравнению с P
Используй PHP-модуль mysqli вместо mysql (поддерживает сервера MySQL4.1 и выше; вопрос только в том, есть ли этот модуль у хостеров). Там есть функции mysqli_stmt_init(), mysqli_stmt_prepare(), mysqli_stmt_bind_param(). Выглядит жутковато, но удобный враппер написать несложно.
ДГ>Здравствуйте, DmitryZhariy,
ДГ>Используй PHP-модуль mysqli вместо mysql (поддерживает сервера MySQL4.1 и выше; вопрос только в том, есть ли этот модуль у хостеров). Там есть функции mysqli_stmt_init(), mysqli_stmt_prepare(), mysqli_stmt_bind_param(). Выглядит жутковато, но удобный враппер написать несложно.
Можно также использовать уже существующие врапперы типа PEAR::MDB2, AdoDb, которые предоставляют возможность подготовки запросов
To Дм.Григорьев
[quote]
Используй PHP-модуль mysqli вместо mysql (поддерживает сервера MySQL4.1 и выше; вопрос только в том, есть ли этот модуль у хостеров).
[/quote]
Спасибо. Если функции типа prepare() поддерживаются на уровне екстеншена – то это очень хорошо, так как екстеншен – это бинарник, и, возможно будет работать быстрее скриптового аналога. Но, вот возможность отсутствия екстеншена у хостера несколько останавливает в написании чего-либо с его использованием.
To Mamut
[quote]
Можно также использовать уже существующие врапперы типа PEAR::MDB2, AdoDb, которые предоставляют возможность подготовки запросов
[/quote]
Спасибо. Побежал разбираться с этими модулями.
Re[4]: Квотирование данных MySQL запроса в PHP по сравнению
Похожа по действию на оператор формат. вывода printf, что делает ее довольно гибкой.
Зендовский способ использования плейсхолдеров также очень не плох.
Но, подход DbSimple, с возможностью указания формата плейсхолдеров мне кажется лучше и гибче.
Re[6]: Квотирование данных MySQL запроса в PHP по сравнению
Даже подстановка масивов в ДбСимпл выглядит намного гибче Зендовского варианта.
$rows = $DB->select('
SELECT * FROM user
WHERE
1=0
{ OR user_id IN(?a) }
',
$listOfUserIdsMayBeEmpty
// Если пусто, разворачивается в 1=0, т.е. false.
);