Не могу разобраться с такой штукой.
Есть форма поиска, перенаправляет на страницу с результатами с возможностью постраничного просмотра и сортировки. Строку с where для запроса я храню в сессии.
Ситуация такая. К примеру, хочу сделать 2 разных поиска и сравнить результаты.
Открываю одну вкладку браузера с формой поиска, задаю параметры и получаю результат. Открываю вторую вкладку браузера с формой поиска, задаю новые параметры поиска, получаю другой результат. Потом возвращаюсь в первую, делаю сортировку результата или переход на новую страницу. Снова иду во вторую, тоже делаю переход или сортировку и - опа! - результат поиска заменяется на результат из 1й страницы. Все из-за того, что храню фактически одну строку с параметрами поиска в сессии.
Как в такой ситуации сделать правильно? Использовать массив строк в сессии что ли?
Может, где-то пример можно глянуть, чувствую, что все должно быть несложно - везде, где ни посмотрю, это работает правильно.
Подумал и нашел более простой вариант. С формы поиска перенаправляешь не прямо на скрипт с выводом результатов, а на какой-либо промежуточный скрипт, где сохраняешь в сессии параметры поиска. А оттуда уже делаешь header('location: результат_поиска.php').
Вроде работает.
Чувствую, что тема не новая, но по поиску ничего не нашел.
Есть страница с формой поиска, данные отправляются методом POST. Есть страница с многостраничными результатами поиска. Когда там переходишь по страницам поиска и хочешь вернуться по кнопке "Назад" - в IE получаешь "Веб-страница просрочена".
Как с этим бороться, помимо переделки метода на GET?
Как вариант можно использовать для админки отдельный CGI-скрипт в режиме NPH - он будет самостоятельно получать HTTP-запрос от пользователя и если к моменту окончания HTTP-заголовка становится очеидно что он не имеет прав доступа то обрывать соединение На PHP такое не выйдет по вышеуказанным причинам
В принципе если ваш PHP-скрипт не закрыт firewall-ом и HTTP-запросы до него доходят - то ничто не мешает посылать на него длинные POST-запросы с файлами возможно в целях взлома - ведь даже если сам PHP-скрипт выдаст ошибку о том что соотвествующих прав нет то он выдаст это после загрузки файлов
Есть одно очень важное правило PHP - загрузка всех GET/POST-запросов происходит ДО начала исполнения PHP-кода из вашего PHP-скрипта - и вы никак внутри него не можете контролировать размер передаваемого файла - разве что размерами лимитирующий переменных в php.ini Из-за этого правила полностью на PHP нельзя реализовать загрузчик файлов с прогресс-баром и вероятно это правило сказывается у вас
Да, у меня стоит ограничение на post_max_size 2M и upload_max_filesize 2M в php.ini. Заметил, что несколько увеличился входящий http-трафик на сервере, что в общем-то нежелательно...
Есть ли какие-то возможно общие рекомендации, помимо закрытия фаерволом доступа на админку?
Версия php 5.2.10.
Стабильно вижу в логах такую ошибку 5-6 раз в день. В принципе, нагуглил и прочитал про это вот что:
Цитата:
Закачка файлов в PHP: не забываем про post_max_size
PHP // 24 Января, 2008 // под утро
Обычное дело ограничить размер закачиваемых файлов при помощи upload_max_filesize, но в конфигах есть еще одна важная опция post_max_size, ограничивающая размер POST-данных (соотношение должно быть такое memory_limit > post_max_size > upload_max_filesize). Думаю php-разработчикам, читающим мой блог будет интересно узнать об одном side-effect’е, который до некоторого времени считался багом типа documentation issue (т.е. не был никак описан) и о котором я сам даже не подозревал.
Как следует из определения, post_max_size ограничивает размер передаваемых данных, поэтому php резервирует в памяти буффер именно этого размера. Что происходит, если объем данных больше этой величины (например закачиваемый файл имеет размер больше ожидаемого)? Все очень просто — php сбрасывает $_POST и $_FILES, как если бы upload вобще не происходил, при этом в логах следующее:
PHP Warning: POST Content-Length of X bytes exceeds the limit of Y bytes in Unknown on line 0Это и есть тот самый side-effect. Действительно, если в буфер влезает только часть POST-данных, то php-скрипт может повести себя непредсказуемо. Чтобы минимизировать ущерб — php не передаст в ваш скрипт вообще ничего.
Если срабатывает ограничение upload_max_filesize, мы можем об этом узнать из массива $_FILES, его соответствующий элемент ‘error’ будет содержать код ошибки UPLOAD_ERR_INI_SIZE. В случае же срабатывания ограничения post_max_size, как я уже описал, $_FILES пустой, а ошибку сдетектировать и пользователю написать надо. К счастью нам все еще доступен $_GET, поэтому решаем добавлением GET-параметра в action атрибут нашей формы:
<form enctype="multipart/form-data" method="post" action="?doing_upload=1">
...
</form>Теперь в скрипте, принимаюшем форму мы можем проверить существование параметра doing_upload и что $_FILES на самом деле пустой и красиво сказать пользователю, что он неправ. Примерно так:
if (isset($_GET['doing_upload']) &&
(! isset($_FILES) || (count($_FILES) == 0)))
print "Sorry, post_max_size is in effect";Если с закачкой файла в вашей форме есть еще какие-нибудь поля, то вы можете их потерять, если пользователь ошибётся с размером файла и при этом не знает о существовании кнопки Back (бывает и такое). Поэтому я рекомендую форму закачки файла вообще засунуть в отдельный iframe. Главный совет: если у вас в проекте есть форма закачки файлов, попробуйте превысить post_max_size и посмотрите как ваше приложение сможет с этим справиться.
Положите эту мелочь на свою полочку знаний и не повторяйте моих ошибок
Но проблема в том, что у меня форма для заливки файлов только в админке, куда доступ ограничен моим ip и запаролен через htaccess. Сообщения появляются, когда в админке я ничего не делаю.
В остальном на сайте есть формы, но без заливки файлов - обычные input и textarea с контролем количества вводимых символов и принудительной обрезкой.
Сделайте индекс в таблице для поля, по которому идёт поиск. В данном случае нагрузка сократится в разы
В данном случае я выбираю из view, а создание индексов на них вроде невозможно, только на базовую таблицу. А если в базовой таблице записей в десятки раз больше, имеет ли смысл создавать в ней индекс на искомое поле?
JustUserR пишет:
На самом деле это сильно неоптимизированное решение потому что именно соединение с базой занимает самое большое время - по крайней мере по сравнению с выполнением несложного запроса
А как лучше поступить? Можно ссылку или наводку хотя бы?
В принципе, проект не сказать чтобы сильно посещаемый, но хочется на будущее уметь.
SAD
Спасибо, так действительно работает.
Есть один момент - мне интересно, насколько верно с точки зрения нагрузки на сервер в autocomplete.php каждый раз открывать и закрывать соединение с базой? Смотрю top'ом нагрузку - несколько скачет, несущественно правда...
Проблема вроде достаточно распространенная, и читал уже много на эту тему, но никак не получается у меня. Суть в то, что надо организовать опережающий ввод текста, были выбраны jQuery (поскольку используется в проекте) и плагин к ней autocomplete.
Исходный проект достаточно старый и весь сделан в windows-1251. А jQuery, как я понял, понимает только utf.
Потому при вводе русских символов jQuery отдает кракозябры. Пробую в обработчике организовать конвертирование в windows-1251, тоже самое.
Но только на быстродействии это может не лучшим образом сказаться
Получилось опять-таки немного не то, чего я ожидал, и несколько медленнее. Чтож, лучшее - действительно враг хорошего. Видимо, придется оставить как есть.