2012-03-19 5 views
0

У меня есть запрос здесь (PHP с Zend Framework в базе данных MySQL), используя один параметр POST в качестве аргумента в SQL-заявлении.Метод mysql_real_escape_string действительно медленный (почти 1 секунда)

Итак, у меня есть локальная установка XAMPP на моей машине разработки, а время выполнения этого маленького скрипта - это что-то вроде 150 мс независимо от того, передаю ли я аргумент с или без использования mysql_real_escape_string() в этом аргументе раньше.

Затем у меня есть виртуальный сервер с установленным BitNami-WAMP-Stack. Когда я запускаю сценарий там (100% то же содержимое базы данных), он занимает около 260 мс без mysql_real_escape_string, это не так «быстро» (я знаю, что 150 мс вообще не очень быстро) в качестве моей локальной машины, но все будет в порядке. Но если я добавлю только один mysql_real_escape_string() к аргументу из переменной POST, все это займет 1,2 секунды.

И еще я заметил, что каждый вызов mysql_real_escape_string заставляет скрипт работать на 1 секунду медленнее на виртуальном сервере. На моей локальной машине это не имеет никакого эффекта.

Как это может быть? Является ли это установкой MySQL или вещью PHP.ini или что? Поскольку у меня есть 100% -ная база данных и источник PHP на обеих машинах, я думаю, это может быть только параметризация?

Спасибо за любую помощь заранее!

EDIT:

Так вот что я делаю, первое подключение к БД (в Bootstrap.php):

$GLOBALS["db"]= new Zend_Db_Adapter_Pdo_Mysql(array(
      'host'  => "localhost", 
      'username' => "user", 
      'password' => "password", 
      'dbname' => "database" 
      )); 

А потом в нужде для запроса к базе данных:

global $db; 

$query = sprintf("SELECT * FROM table WHERE id = '%s'", mysql_real_escape_string($id)); 

$db->query("SET NAMES 'utf8'"); 

$db->fetchAll($query); 

Я только что сделал еще одно испытание: когда я добавляю эту простую тестовую строку в свой код, это делает скрипт ~ 600 мс медленнее на виртуальной машине:

mysql_real_escape_string("TEST"); 
+0

Можете ли вы показать нам код для создания и выполнения запроса? Также работает ли БД на одном физическом/виртуальном? – prodigitalson

+1

Каков размер (в символах) строки, которую вы ускользаете? –

+0

Строка i amcapcap - это только идентификатор базы данных int длиной от 2 до 5 цифр – homtg

ответ

0

Долгосрочное решение должно быть переключение на подготовленных заявлений, что является правильным. Эквивалентно mysql_real_escape_string для соединения PDO, кажется PDO::quote:

http://php.net/manual/de/pdo.quote.php

Любые недостатки по сравнению с раствором mysql_real_escape_string на основе?

+0

Я считаю, что просто добавить кавычки (как это делает эта функция) недостаточно. mysql_real_escape_string() фактически избегает любых специальных символов с символом '\', поскольку это предотвращает выполнение mysql. (исправьте меня, если я ошибаюсь) – HTDutchy

+0

в руководстве говорится, что он также заменяет специальные символы в строке ввода – homtg

0

Я имел такую ​​же задержку на первом способе вызова mysql_real_escape_string, решение в моем случае была информация из руководства: http://php.net/manual/en/function.mysql-real-escape-string.php

«Соединение MySQL требуется перед использованием mysql_real_escape_string() в противном случае ошибка уровня E_WARNING и FALSE возвращается. Если link_identifier не определен, используется последнее соединение MySQL. "

Единственное, что было сообщено о задержке, если соединение не установлено.

В вашем случае я полагаю, что если вы используете PDO для подключения, вам следует использовать PDO :: quote.Если вы используете mysql_pconnect/mysql_connect, вы можете без проблем использовать mysql_real_escape_string.

Смежные вопросы