Могу ли я иметь постоянный объект PDO, который просто принимает новые переменные для привязки из вызовов AJAX?

#php #mysql #ajax #pdo

#php #mysql #ajax #pdo

Вопрос:

Если я хотел бы создать ajax-поиск (пользователь заполняет элементы формы, при любом обновлении элементов формы результаты поиска обновляются в режиме реального времени.)

Возможно ли создать постоянное (подготовленное) PDO-соединение, для которого требуется привязка / выполнение только новых переменных, отправляемых через ajax?

Есть ли другой разумный способ сделать это?

Редактировать: Просто для ясности и, возможно, более конкретно: то, что я ищу, — это постоянный подготовленный оператор для всех подключений.

Комментарии:

1. Вы уверены, что хранимая процедура не подошла бы для этого лучше?

Ответ №1:

Вы можете установить постоянное соединение, используя:

http://php.net/manual/en/pdo.connections.php

 $dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass, array(
    PDO::ATTR_PERSISTENT => true
));
  

Таким образом, если вам нужно повторно подключиться по новому запросу, PDO будет использовать соединение из пула, а не создавать новое. Если вы используете подготовленные инструкции с prepare() и bindParam() , запрос будет скомпилирован на стороне базы данных и выполняться быстрее, чем обычный запрос.

Некоторые ссылки на кэширование:

http://www.snipe.net/2009/03/quick-and-dirty-php-caching/

http://docstore.mik.ua/orelly/webprog/pcook/ch10_15.htm

http://mysqlhacker.com/kabir/performance/understanding-mysql-query-cache-for-php-developers-part-i.html

Комментарии:

1. Я понимаю, что они корректны по отдельности. Подготовленные инструкции будут скомпилированы на стороне базы данных и выполняться быстрее — И постоянные соединения будут пытаться использовать то же соединение, что и в прошлый раз… однако я не уверен в том, как они будут работать вместе. У меня такое чувство, что только этих основных двух частей недостаточно для достижения того, что я ищу, то есть постоянного подготовленного оператора между соединениями.

2. Database engine скомпилирует и кэширует переданный запрос между соединениями. Но не слишком ли вы пытаетесь оптимизировать?

3. Это для системы тегов, которая может начать интенсивно работать с реляционной базой данных по мере увеличения наборов данных (по крайней мере, так я понимаю).) С поиском в стиле AJAX это добавит дополнительную нагрузку, поэтому я пытаюсь сократить вычисления, где это возможно.

4. Для меня это неправильный путь. Оптимизация времени подключения не даст вам никаких преимуществ. Результаты запроса кеша в PHP, это правильный путь.

5. О » Если вы используете подготовленные инструкции с помощью prepare() и bindParam (), запрос будет скомпилирован на стороне базы данных и выполняться быстрее, чем обычный запрос. » — взгляните на bugs.php.net/bug.php?id=54638 , в нем говорится, что » Драйвер PDO_MySQL по умолчанию использует emulate_prepare равным 1, что заставляет драйвер эмулировать все подготовленные запросы. «, поэтому компиляция или кэширование подготовленных запросов на стороне сервера просто не будут выполняться по умолчанию.

Ответ №2:

Я полагаю, вы говорите здесь о подготовленных сообщениях, а не о «соединениях».

Нет способа сохранить один и тот же подготовленный statment между вызовами (ajax или нет)

Альтернативой было бы сохранить переменные во временной таблице и отправить реальный запрос в конце процесса…