zilber 3 Опубликовано: 27 января 2015 Рассказать Опубликовано: 27 января 2015 (изменено) Сидел на тестовом RU-CENTER (тариф 301, memory limit 64mb, UTF-8) с демо-версией DLE 10.3 UTF8. Общими усилиями с любезным ODYS написали модуль для выборки из базы по трем параметрам (checkbox) и вывода результатов на статическую страницу в виде настраиваемых блоков. В базе всего 166 строк/объектов для поиска. Все работало распрекрасно. Сегодня перевез на тестовый поддомен уже на "рабочий" хостинг от masterhost'а (доцент 11, memory limit 128mb, CP1251). Все работает как часы. Кроме одного - модуль перестал срабатывать, если результатов выборки больше 100 (ну, к примеру, если человек хочет посмотреть все доступные варианты). До 100 (примерно, плюс-минус) - вывод осуществляется. Больше 100 (примерно, плюс-минус) - пустая страница. Сразу загрешил на хостинг, те ответили, что судя по логам сайт никаких перегрузов не создает в момент срабатывания скрипта. Провел эксперимент - убрал в выводе результатов вывод текстового описания каждой найденной единицы, оставил только название. Все отлично сработало в полном объеме. Итог: где-то есть "узкое бутылочное горлышко", в которое не пролезает такое количество информации. Причем на РуЦентре все работает, а на МастерХосте - нет. Не подскажите ли, может у кого какие мысли есть, что это может быть? PS - debug пишет только о сложностях в функциях коннекта к базе Warning: mysql_close(): supplied argument is not a valid MySQL-Link resource in .../engine/modules/customsearch.php on line 51 Изменено 27 января 2015 пользователем zilber Цитата Ссылка на сообщение Поделиться на других сайтах
altairr 1 Опубликовано: 28 января 2015 Рассказать Опубликовано: 28 января 2015 (изменено) Кодировки разные,а также может быть дело в ПО,что установлено на сервере. PS:Это предположение новичка. Изменено 28 января 2015 пользователем altairr Цитата Ссылка на сообщение Поделиться на других сайтах
celsoft 6 073 Опубликовано: 28 января 2015 Рассказать Опубликовано: 28 января 2015 zilber, Наиболее вероятная причина, нехватка памяти для выполнения выбранного действия. Цитата Ссылка на сообщение Поделиться на других сайтах
zilber 3 Опубликовано: 29 января 2015 Рассказать Опубликовано: 29 января 2015 Автор zilber, Наиболее вероятная причина, нехватка памяти для выполнения выбранного действия. Памяти выделено даже больше, чем на nic.ru, где все работает... Решилось так: перешел на PHP 5.3 и все стало нормально. Видимо какой-то параметр кроме лимита памяти влияет. Отловить бы какой, ибо какое-то время двум сайтам, старому и новому, придется жить на одном сервере, чуть ли не в одной папке. И старый сайт, самописная фекалия, на 5.3 не работает. Цитата Ссылка на сообщение Поделиться на других сайтах
zilber 3 Опубликовано: 29 января 2015 Рассказать Опубликовано: 29 января 2015 Автор Пришлось переехать на 5.2 пока что... И скрипт чудит, в соответствие с вышеописанным... :-( Может подскажете, где узкое место может быть, я могу настройки сервера скинуть phpinfo. Был бы очень благодарен. PS - проект готов, залил уже на финальный хостинг, так что смогу давать ссылку, когда оплачу очередную лицензию. Цитата Ссылка на сообщение Поделиться на других сайтах
celsoft 6 073 Опубликовано: 30 января 2015 Рассказать Опубликовано: 30 января 2015 zilber, Выделенная память и имеющаяся в наличии свободная память, это разные вещи, когда вы выделяете память, это вы ограничиваете максимально сколько может взять скрипт, а если ее нет в наличии, то он может взять не более чем есть. моя рекомендация в данном случае переписывать ваш скрипт, и делать, так чтобы результаты ваши выборки ограничивались и разбивались по страницам, тем самым будет лимитирование по расходу памяти и других серверных ресурсов. Потому как сегодня у вас 100 результатов выборки, завтра 1000, вы так ресурсов сервера никогда не напасетесь. Цитата Ссылка на сообщение Поделиться на других сайтах
zilber 3 Опубликовано: 5 февраля 2015 Рассказать Опубликовано: 5 февраля 2015 Автор zilber, моя рекомендация в данном случае переписывать ваш скрипт, и делать, так чтобы результаты ваши выборки ограничивались и разбивались по страницам, тем самым будет лимитирование по расходу памяти и других серверных ресурсов. Потому как сегодня у вас 100 результатов выборки, завтра 1000, вы так ресурсов сервера никогда не напасетесь. Спасибо за совет! Результаты опубликую. Цитата Ссылка на сообщение Поделиться на других сайтах
zilber 3 Опубликовано: 6 февраля 2015 Рассказать Опубликовано: 6 февраля 2015 Автор моя рекомендация в данном случае переписывать ваш скрипт, и делать, так чтобы результаты ваши выборки ограничивались и разбивались по страницам, тем самым будет лимитирование по расходу памяти и других серверных ресурсов. Потому как сегодня у вас 100 результатов выборки, завтра 1000, вы так ресурсов сервера никогда не напасетесь. Голова взрывается. Читаю второй учебник, для более глубокого погружения. Но пока очень туго... Я гуманитарий по складу ума и не освоить пока что умение видеть всю картину... Никто не поможет с постраничным выводом в таком модуле? Заодно и модуль кому-то может пригодится (обработка формы с чекбоксами в статической странице DLE) <div class="hotelsearchform"> <form name="form" id="form" method="post" action=""> <div class="search4hoteltype"> <input type="checkbox" name="type[]" value="25"> Отель<br> <input type="checkbox" name="type[]" value="26"> Мини-гостиница<br> <input type="checkbox" name="type[]" value="28"> Санаторий<br> <input type="checkbox" name="type[]" value="27"> Пансионат<br> </div> <div class="search4hotelrating"> <input type="checkbox" name="rating[]" value="15,17"> 2*<br> <input type="checkbox" name="rating[]" value="19"> 3*<br> <input type="checkbox" name="rating[]" value="21"> 4*<br> <input type="checkbox" name="rating[]" value="23"> 5*<br> </div> <div class="search4hotelplace"> <input type="checkbox" name="place[]" value="5"> Центр<br> <input type="checkbox" name="place[]" value="6"> Хоста<br> <input type="checkbox" name="place[]" value="7"> Адлер<br> <input type="checkbox" name="place[]" value="42"> Имеретинка<br> <input type="checkbox" name="place[]" value="8"> Красная Поляна<br> <input type="checkbox" name="place[]" value="10"> Дагомыс<br> <input type="checkbox" name="place[]" value="9"> Лазаревское<br> </div> <div class="search4hotelbuttons"> <input name="submit" value="ПОКАЗАТЬ ВЫБРАННОЕ" type="submit"> </div> </form> </div><!-- hotelsearchform --> <? function connectDB (){ // Определяем константы для соединения с базой данных define('DB_HOST', ''); define('DB_USER', ''); define('DB_PASS', ''); define('DB_NAME', ''); //Пытаемся соединится с базой данных $dbconn = mysql_connect(DB_HOST, DB_USER, DB_PASS) or die("Ошибка соединения с базой данных! " . mysql_error()); //и выбрать таблицу mysql_select_db(DB_NAME); // Устанавливаем кодировку mysql_query('SET NAMES utf8'); //Возвращаем дескриптор соединения return $dbconn; } /*Закрываем соединение с базой данных*/ function closeDB($dbconn){ mysql_close($dbconn); } if(isset($_REQUEST['submit'])) { $connect = connectDB(); if( count($_POST['type']) > 0 ) { $type = implode(',',$_POST['type']); $str.= ' AND type IN('.$type.')'; } if( count($_POST['place']) > 0 ) { $place = implode(',',$_POST['place']); $str.= ' AND place IN('.$place.')'; } if( count($_POST['rating']) > 0 ) { $rating = implode(',',$_POST['rating']); $str.= ' AND rating IN('.$rating.')'; } $rat[15] = '<img src="/templates/img/s1.png" border="0">'; $rat[17] = '<img src="/templates/img/s2.png" border="0">'; $rat[19] = '<img src="/templates/img/s3.png" border="0">'; $rat[21] = '<img src="/templates/img/s4.png" border="0">'; $rat[23] = '<img src="/templates/img/s5.png" border="0">'; $sql = "SELECT `name`, `rating`, `key`, `address`, `desc` FROM sled_hotels WHERE town=4 ".$str; $result = mysql_query($sql); $num = mysql_num_rows($result); /* И не делаем тут никаких условий, т.к. вам в любом случае нужно вывести количество, даже если это будет ноль. Поэтому сразу выводите результат. */ echo '<div class="hotelsearchresults">По вашему запросу найдено отелей: '.$num.' </div>'; //Далее Сначала откроем блок allresult echo '<div class="allresult">'; //И вот тут проверяйте, есть ли что то в $result, и если есть то фетчите его // цкл doWile в вашем случае не нужен if($num) { while($row = mysql_fetch_assoc($result)) { echo '<div class="eachresult"> <div class="hotelnamewhiteline"> <div class="hotelrating">'.$rat[$row['rating']].'</div> <div class="hotelname"><a href="/'.$row['key'].'.html" target="_parent"> "'.$row['name'].'" </a></div> </div> <div class="hoteladdress">'.$row['address'].'</div> <div class="hoteldescription"><a href="/'.$row['key'].'.html" target="_parent">'.$row['desc'].'</a></div> <!-- <div class="hotelphoto"><a href="/'.$row['key'].'.html" target="_parent"><img src="http://www.ya.ru'.$row['preview'].'" border="0" height="80"></a></div> --> </div>'; } }else{ echo ''; } // закрываем allresult echo '</div>'; } closeDB ($connect); ?> Цитата Ссылка на сообщение Поделиться на других сайтах
odys 384 Опубликовано: 6 февраля 2015 Рассказать Опубликовано: 6 февраля 2015 zilber, вот, http://www.cyberforum.ru/php-database/thread521257.html Цитата Ссылка на сообщение Поделиться на других сайтах
zilber 3 Опубликовано: 7 февраля 2015 Рассказать Опубликовано: 7 февраля 2015 Автор zilber, вот, http://www.cyberforu...read521257.html Все испробованные мною методы постраничного вывода упираются в ссылки на следующие страницы. Они просто никуда не ведут. Я назначаю им ?page= , но такое чувство, что скрипт не срабатывает, потому что ссылка имеет вид домен/hotelsearch.html, а не домен/hotelsearch.php В этом может быть дело? Если в этом, тогда попа, так как я статической странице не могу же присвоить расширение php Цитата Ссылка на сообщение Поделиться на других сайтах
zilber 3 Опубликовано: 7 февраля 2015 Рассказать Опубликовано: 7 февраля 2015 (изменено) Автор Вот этот код работает на выборку и разделение на положенное количество результатов на страницу, но генерирует "пустые ссылки" в пагинаторе, которые никуда не ведут. Открывается, к примеру, /hotelsearch.html&page=2, но там пусто. Подозреваю, что ссылка должна иметь вид /сам модуль.php&page=2 и там будут данные, но я же подключаю модуль через статическую страницу. Что же делать? <? ... if(isset($_REQUEST['submit'])) { $connect = connectDB(); if( count($_POST['type']) > 0 ) { $type = implode(',',$_POST['type']); $str.= ' AND type IN('.$type.')'; } if( count($_POST['place']) > 0 ) { $place = implode(',',$_POST['place']); $str.= ' AND place IN('.$place.')'; } if( count($_POST['rating']) > 0 ) { $rating = implode(',',$_POST['rating']); $str.= ' AND rating IN('.$rating.')'; } $rat[15] = '<img src="/templates/sgtours2/img/s1.png" border="0">'; $rat[17] = '<img src="/templates/sgtours2/img/s2.png" border="0">'; $rat[19] = '<img src="/templates/sgtours2/img/s3.png" border="0">'; $rat[21] = '<img src="/templates/sgtours2/img/s4.png" border="0">'; $rat[23] = '<img src="/templates/sgtours2/img/s5.png" border="0">'; $per_page=3; //if (isset($_GET['page'])) $page=($_GET['page']-1); else $page=0; $start=abs($page*$per_page); echo $q="SELECT `name`, `rating`, `key`, `address`, `desc` FROM `sled_hotels` WHERE town=4 ".$str." LIMIT $start,$per_page"; $res=mysql_query($q); echo '<div class="allresult">'; while($row=mysql_fetch_array($res)) { echo '<div class="eachresult"> <div class="hotelnamewhiteline"> <div class="hotelrating">'.$rat[$row['rating']].'</div> <div class="hotelname"><a href="/'.$row['key'].'.html" target="_parent"> "'.$row['name'].'" </a></div> </div> <div class="hoteladdress">'.$row['address'].'</div> <div class="hoteldescription"><a href="/'.$row['key'].'.html" target="_parent">'.$row['desc'].'</a></div> <!-- <div class="hotelphoto"><a href="/'.$row['key'].'.html" target="_parent"><img src="http://www.sgtours.ru'.$row['preview'].'" border="0" height="80"></a></div> --> </div>'; } echo '</div>'; $q="SELECT count(*) FROM `sled_hotels` WHERE town=4".$str; $res=mysql_query($q); $row=mysql_fetch_row($res); $total_rows=$row[0]; $num_pages=ceil($total_rows/$per_page); for($i=1;$i<=$num_pages;$i++) { if ($i-1 == $page) { echo $i." "; } else { echo '<a href="'.$_SERVER['/engine/modules/customsearch.php/'].'?page='.$i.'">'.$i."</a> "; } } ... ?> UPDATE: провел эксперимент. Положил модуль в корень сайта. Все отлично работает в плане выборки и деления на страницы, но ссылки на страницы, которые теперь имеют верный вид (/модуль.php?page=2) все равно ведут на пустую страницу с формой. UPDATE: а не htaccess даталайфа ли тому виной? UPDATE: на локальном сервере тоже самое. Изменено 7 февраля 2015 пользователем zilber Цитата Ссылка на сообщение Поделиться на других сайтах
zilber 3 Опубликовано: 8 февраля 2015 Рассказать Опубликовано: 8 февраля 2015 (изменено) Автор Перевел на GET, добавил в ссылки на страницы GETы, полученные из формы - и заработало (код внизу). Но как отдельный файл в корне. В качестве модуля DLE работать отказывается, так как ссылка получается с расширением html, а не php. Вопрос по DLE - как вывести статическую страницу (конкретную) - с PHP расширением? И еще - кто-то может глянуть, безопасен ли код в плане проникновения и всяческого зловредства со стороны? <div class="hotelsearchform"> <form name="form" id="form" method="GET" action=""> <div class="search4hoteltype"> <input type="checkbox" name="type[]" value="25"> Отель<br> <input type="checkbox" name="type[]" value="26"> Мини-гостиница<br> <input type="checkbox" name="type[]" value="28"> Санаторий<br> <input type="checkbox" name="type[]" value="27"> Пансионат<br> </div> <div class="search4hotelrating"> <input type="checkbox" name="rating[]" value="15,17"> 2*<br> <input type="checkbox" name="rating[]" value="19"> 3*<br> <input type="checkbox" name="rating[]" value="21"> 4*<br> <input type="checkbox" name="rating[]" value="23"> 5*<br> </div> <div class="search4hotelplace"> <input type="checkbox" name="place[]" value="5"> Центр<br> <input type="checkbox" name="place[]" value="6"> Хоста<br> <input type="checkbox" name="place[]" value="7"> Адлер<br> <input type="checkbox" name="place[]" value="42"> Имеретинка<br> <input type="checkbox" name="place[]" value="8"> Красная Поляна<br> <input type="checkbox" name="place[]" value="10"> Дагомыс<br> <input type="checkbox" name="place[]" value="9"> Лазаревское<br> </div> <div class="search4hotelbuttons"> <input name="submit" value="ПОКАЗАТЬ ВЫБРАННОЕ" type="submit"> </div> </form> </div><!-- hotelsearchform --> <? function connectDB (){ define('DB_HOST', '---'); define('DB_USER', '---'); define('DB_PASS', '---'); define('DB_NAME', '---'); $dbconn = mysql_connect(DB_HOST, DB_USER, DB_PASS) or die("Ошибка соединения с базой данных! " . mysql_error()); mysql_select_db(DB_NAME); mysql_query('SET NAMES utf8'); return $dbconn; } if(isset($_REQUEST['submit'])) { $connect = connectDB(); if( count($_GET['type']) > 0 ) { $type = implode(',',$_GET['type']); $str.= ' AND type IN('.$type.')'; } if( count($_GET['place']) > 0 ) { $place = implode(',',$_GET['place']); $str.= ' AND place IN('.$place.')'; } if( count($_GET['rating']) > 0 ) { $rating = implode(',',$_GET['rating']); $str.= ' AND rating IN('.$rating.')'; } $rat[15] = '<img src="/templates/img/s1.png" border="0">'; $rat[17] = '<img src="/templates/img/s2.png" border="0">'; $rat[19] = '<img src="/templates/img/s3.png" border="0">'; $rat[21] = '<img src="/templates/img/s4.png" border="0">'; $rat[23] = '<img src="/templates/img/s5.png" border="0">'; function resSQL($s){ $r=mysql_query($s); if ($row=mysql_fetch_row($r)) return $row[0]; else return false; } $mpp=6; if (empty($_GET['page']) || ($_GET['page'] <= 0)) { $page = 1; } else { $page = (int) $_GET['page']; } $q=mysql_query('select SQL_CALC_FOUND_ROWS `name`, `rating`, `key`, `address`, `desc` FROM `sled_hotels` WHERE town=4 '.$str.' limit '.(($page-1)*$mpp).','.$mpp); $fr=resSQL('SELECT FOUND_ROWS()'); echo '<div class="allresult">'; while($r=mysql_fetch_assoc($q)) { echo '<div class="eachresult"> <div class="hotelnamewhiteline"> <div class="hotelrating">'.$rat[$r['rating']].'</div> <div class="hotelname"><a href="/'.$r['key'].'.html" target="_parent"> "'.$r['name'].'" </a></div> </div> <div class="hoteladdress">'.$r['address'].'</div> <div class="hoteldescription"><a href="/'.$r['key'].'.html" target="_parent">'.$r['desc'].'</a></div> </div>'; } echo '</div>'; if( $type > 0 ) { $typelink = '&type[]='.$type; } else { $typelink = null;} if( $rating > 0 ) { $ratinglink = '&rating[]='.$rating; }else { $ratinglink = null;} if( $place > 0 ) { $placelink = '&place[]='.$place; }else { $placelink = null;} $pc=ceil($fr/$mpp); if ($pc>1) { $raz=''; for($n=1;$n<=$pc;$n++) { echo $raz; if ($page==$n) echo $n; else { echo '<A HREF="'.$_SERVER['PHP_SELF'].''; if ($n>0) echo '?page=',$n,$typelink,$placelink,$ratinglink.'&submit=ПОКАЗАТЬ+ВЫБРАННОЕ'; echo '">',$n,'</A>'; } $raz=' | '; } } } ?> в htaccess сменил расширение статической на php - скрипт не срабатывает. RewriteRule ^(hotelsearch)\.php$ $1.html [L][/code]Заработало, когда вернул метод передачи POST вместо GET. Но мне нужен GET, блин. Я им формирую ссылки на следующие страницы в пагинаторе... Либо не подскажете ли, как передать POST'ом данные из формы на следующие страницы? Изменено 8 февраля 2015 пользователем zilber Цитата Ссылка на сообщение Поделиться на других сайтах
celsoft 6 073 Опубликовано: 8 февраля 2015 Рассказать Опубликовано: 8 февраля 2015 И еще - кто-то может глянуть, безопасен ли код в плане проникновения и всяческого зловредства со стороны? Абсоютно не безопасен и легко взламывается. Все входящие переменные нужно фильтровать, прежде чем использовать их в запросах к базе данных, или при выводе на сайте. Цитата Ссылка на сообщение Поделиться на других сайтах
zilber 3 Опубликовано: 8 февраля 2015 Рассказать Опубликовано: 8 февраля 2015 Автор И еще - кто-то может глянуть, безопасен ли код в плане проникновения и всяческого зловредства со стороны? Абсоютно не безопасен и легко взламывается. Все входящие переменные нужно фильтровать, прежде чем использовать их в запросах к базе данных, или при выводе на сайте. Понял вас, буду работать. А по поводу get/post не подскажите? Так как это не профильная тема для этого, я создал отдельную тему с вопросом: http://forum.dle-news.ru/index.php?showtopic=67621 Цитата Ссылка на сообщение Поделиться на других сайтах
Рекомендованные сообщения
Присоединяйтесь к обсуждению
Вы можете опубликовать сообщение сейчас, а зарегистрироваться позже. Если у вас есть аккаунт, войдите в него для написания от своего имени.