mysql_real_escape_string метод очень медленно (почти 1 секунда) - PullRequest
0 голосов
/ 19 марта 2012

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

Так что у меня есть локальная установка 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 на обеих машинах, я думаю, что это может быть только параметризацией?

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

РЕДАКТИРОВАТЬ:

Итак, вот что я делаю, сначала подключив БД (в 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");

Ответы [ 3 ]

0 голосов
/ 20 марта 2012

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

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

Есть ли недостатки по сравнению с решением mysql_real_escape_string?

0 голосов
/ 18 сентября 2016

У меня была такая же задержка при первом вызове метода 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 без задержки.

0 голосов
/ 20 марта 2012

используйте подготовленные заявления, чтобы сделать это:

http://framework.zend.com/manual/en/zend.db.statement.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...