Перейти к публикации

Вопрос про PHP, DLE и ресурсы сервера.


Рекомендованные сообщения

Сидел на тестовом 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

Изменено пользователем zilber
Ссылка на сообщение
Поделиться на других сайтах

Кодировки разные,а также может быть дело в ПО,что установлено на сервере.

PS:Это предположение новичка.

Изменено пользователем altairr
Ссылка на сообщение
Поделиться на других сайтах

zilber,

Наиболее вероятная причина, нехватка памяти для выполнения выбранного действия.

Ссылка на сообщение
Поделиться на других сайтах

zilber,

Наиболее вероятная причина, нехватка памяти для выполнения выбранного действия.

Памяти выделено даже больше, чем на nic.ru, где все работает...

Решилось так: перешел на PHP 5.3 и все стало нормально. Видимо какой-то параметр кроме лимита памяти влияет. Отловить бы какой, ибо какое-то время двум сайтам, старому и новому, придется жить на одном сервере, чуть ли не в одной папке. И старый сайт, самописная фекалия, на 5.3 не работает.

Ссылка на сообщение
Поделиться на других сайтах

Пришлось переехать на 5.2 пока что... И скрипт чудит, в соответствие с вышеописанным... :-(

Может подскажете, где узкое место может быть, я могу настройки сервера скинуть phpinfo.

Был бы очень благодарен.

PS - проект готов, залил уже на финальный хостинг, так что смогу давать ссылку, когда оплачу очередную лицензию.

Ссылка на сообщение
Поделиться на других сайтах

zilber,

Выделенная память и имеющаяся в наличии свободная память, это разные вещи, когда вы выделяете память, это вы ограничиваете максимально сколько может взять скрипт, а если ее нет в наличии, то он может взять не более чем есть.

моя рекомендация в данном случае переписывать ваш скрипт, и делать, так чтобы результаты ваши выборки ограничивались и разбивались по страницам, тем самым будет лимитирование по расходу памяти и других серверных ресурсов. Потому как сегодня у вас 100 результатов выборки, завтра 1000, вы так ресурсов сервера никогда не напасетесь.

Ссылка на сообщение
Поделиться на других сайтах

zilber,

моя рекомендация в данном случае переписывать ваш скрипт, и делать, так чтобы результаты ваши выборки ограничивались и разбивались по страницам, тем самым будет лимитирование по расходу памяти и других серверных ресурсов. Потому как сегодня у вас 100 результатов выборки, завтра 1000, вы так ресурсов сервера никогда не напасетесь.

Спасибо за совет!

Результаты опубликую.

Ссылка на сообщение
Поделиться на других сайтах

моя рекомендация в данном случае переписывать ваш скрипт, и делать, так чтобы результаты ваши выборки ограничивались и разбивались по страницам, тем самым будет лимитирование по расходу памяти и других серверных ресурсов. Потому как сегодня у вас 100 результатов выборки, завтра 1000, вы так ресурсов сервера никогда не напасетесь.

Голова взрывается. Читаю второй учебник, для более глубокого погружения.

Но пока очень туго... Я гуманитарий по складу ума и не освоить пока что умение видеть всю картину...

Никто не поможет с постраничным выводом в таком модуле?

Заодно и модуль кому-то может пригодится (обработка формы с чекбоксами в статической странице DLE)

<div class="hotelsearchform">

    <form name="form" id="form" method="post" action="">

    <div class="search4hoteltype">

	    <input type="checkbox" name="type[]" value="25">&nbsp;&nbsp;Отель<br>

	    <input type="checkbox" name="type[]" value="26">&nbsp;&nbsp;Мини-гостиница<br>

	    <input type="checkbox" name="type[]" value="28">&nbsp;&nbsp;Санаторий<br>

	    <input type="checkbox" name="type[]" value="27">&nbsp;&nbsp;Пансионат<br>

    </div>

        <div class="search4hotelrating">

	    <input type="checkbox" name="rating[]" value="15,17">&nbsp;&nbsp;2*<br>

	    <input type="checkbox" name="rating[]" value="19">&nbsp;&nbsp;3*<br>

	    <input type="checkbox" name="rating[]" value="21">&nbsp;&nbsp;4*<br>

	    <input type="checkbox" name="rating[]" value="23">&nbsp;&nbsp;5*<br>

    </div>

       <div class="search4hotelplace">

	    <input type="checkbox" name="place[]" value="5">&nbsp;&nbsp;Центр<br>

	    <input type="checkbox" name="place[]" value="6">&nbsp;&nbsp;Хоста<br>

	    <input type="checkbox" name="place[]" value="7">&nbsp;&nbsp;Адлер<br>

	    <input type="checkbox" name="place[]" value="42">&nbsp;&nbsp;Имеретинка<br>

	    <input type="checkbox" name="place[]" value="8">&nbsp;&nbsp;Красная Поляна<br>

	    <input type="checkbox" name="place[]" value="10">&nbsp;&nbsp;Дагомыс<br>

	    <input type="checkbox" name="place[]" value="9">&nbsp;&nbsp;Лазаревское<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">По вашему запросу найдено отелей:&nbsp;'.$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">&nbsp;&nbsp;"'.$row['name'].'"&nbsp;&nbsp;</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);

?>

Ссылка на сообщение
Поделиться на других сайтах

Все испробованные мною методы постраничного вывода упираются в ссылки на следующие страницы. Они просто никуда не ведут.

Я назначаю им ?page= , но такое чувство, что скрипт не срабатывает, потому что ссылка имеет вид домен/hotelsearch.html, а не домен/hotelsearch.php

В этом может быть дело? Если в этом, тогда попа, так как я статической странице не могу же присвоить расширение php

Ссылка на сообщение
Поделиться на других сайтах

Вот этот код работает на выборку и разделение на положенное количество результатов на страницу, но генерирует "пустые ссылки" в пагинаторе, которые никуда не ведут.

Открывается, к примеру, /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">&nbsp;&nbsp;"'.$row['name'].'"&nbsp;&nbsp;</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: на локальном сервере тоже самое.

Изменено пользователем zilber
Ссылка на сообщение
Поделиться на других сайтах

Перевел на 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">&nbsp;&nbsp;Отель<br>

		<input type="checkbox" name="type[]" value="26">&nbsp;&nbsp;Мини-гостиница<br>

		<input type="checkbox" name="type[]" value="28">&nbsp;&nbsp;Санаторий<br>

		<input type="checkbox" name="type[]" value="27">&nbsp;&nbsp;Пансионат<br>

	</div>

		<div class="search4hotelrating">

		<input type="checkbox" name="rating[]" value="15,17">&nbsp;&nbsp;2*<br>

		<input type="checkbox" name="rating[]" value="19">&nbsp;&nbsp;3*<br>

		<input type="checkbox" name="rating[]" value="21">&nbsp;&nbsp;4*<br>

		<input type="checkbox" name="rating[]" value="23">&nbsp;&nbsp;5*<br>

	</div>

	   <div class="search4hotelplace">

		<input type="checkbox" name="place[]" value="5">&nbsp;&nbsp;Центр<br>

		<input type="checkbox" name="place[]" value="6">&nbsp;&nbsp;Хоста<br>

		<input type="checkbox" name="place[]" value="7">&nbsp;&nbsp;Адлер<br>

		<input type="checkbox" name="place[]" value="42">&nbsp;&nbsp;Имеретинка<br>

		<input type="checkbox" name="place[]" value="8">&nbsp;&nbsp;Красная Поляна<br>

		<input type="checkbox" name="place[]" value="10">&nbsp;&nbsp;Дагомыс<br>

		<input type="checkbox" name="place[]" value="9">&nbsp;&nbsp;Лазаревское<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">&nbsp;&nbsp;"'.$r['name'].'"&nbsp;&nbsp;</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'ом данные из формы на следующие страницы?

Изменено пользователем zilber
Ссылка на сообщение
Поделиться на других сайтах

И еще - кто-то может глянуть, безопасен ли код в плане проникновения и всяческого зловредства со стороны?

Абсоютно не безопасен и легко взламывается. Все входящие переменные нужно фильтровать, прежде чем использовать их в запросах к базе данных, или при выводе на сайте.

Ссылка на сообщение
Поделиться на других сайтах

И еще - кто-то может глянуть, безопасен ли код в плане проникновения и всяческого зловредства со стороны?

Абсоютно не безопасен и легко взламывается. Все входящие переменные нужно фильтровать, прежде чем использовать их в запросах к базе данных, или при выводе на сайте.

Понял вас, буду работать. А по поводу get/post не подскажите?

Так как это не профильная тема для этого, я создал отдельную тему с вопросом: http://forum.dle-news.ru/index.php?showtopic=67621

Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

Вы можете опубликовать сообщение сейчас, а зарегистрироваться позже. Если у вас есть аккаунт, войдите в него для написания от своего имени.

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

×
×
  • Создать...