Javascript-форум (https://javascript.ru/forum/)
-   Серверные языки и технологии (https://javascript.ru/forum/server/)
-   -   PHP. Цикл for от 0 до 10 с подключением к БД тупит (https://javascript.ru/forum/server/8481-php-cikl-ot-0-do-10-s-podklyucheniem-k-bd-tupit.html)

Jekel 29.03.2010 00:32

PHP. Цикл for от 0 до 10 с подключением к БД тупит
 
Цикл for от 0 до 10 с подключением к БД выполняется 650ms это же не нормально( как это сделать по людски?

Есть БД в ней map таблица и там слолбци id, x, y, img... в ней 100 записей 10*10 клеточек кароч....
1 | 1 | 10 | title.gif
2 | 2 | 0 | title2.gif итд

Есть код:
<?php
session_start();
header('Content-Type: text/xml; charset=windows-1251');
require_once "config.php";
mysql_connect($host, $userdb, $passdb); 
mysql_select_db($database);

for ($y=0; $y<=10; $y++){
for ($x=0; $x<=10; $x++){
  
$mybase = mysql_fetch_assoc(mysql_query("SELECT * FROM map WHERE x='".$x."' AND y='".$y."'"));

if($mybase["img"]!=NULL && ($_SESSION["x".$x."y".$y]!=$mybase["img"])){
	$all.="<x".$x."y".$y.">".$mybase["img"]."</x".$x."y".$y.">";
	$_SESSION["x".$x."y".$y]=$mybase["img"];
}	
}
}

//Вывод на экран

echo '<?xml version="1.0" ?>';
echo '<map>';
echo $all;
echo '</map>';
?>

Gvozd 29.03.2010 00:39

Цитата:

Сообщение от Jekel
выполняется 650ms это же не нормально(

вполне нормально для 100 запросов к базе.
почему бы вам не использовать один запрос(на все нужные вам ячейки) с сортировкой, и потом его результаты уже получать в цикле

Jekel 29.03.2010 00:44

Лучше на много вариант, PeaceCoder подсказал, лучше есть что-то? тк сказать производительнее...
да и сортировать мне надо не так...мне нужно в зависимости от usery и userx сортировать ну как в первом листинге
$q = mysql_query("SELECT * FROM map ORDER BY y ASC, x ASC");
while($mybase = mysql_fetch_assoc($q)){

if($mybase["img"]!=NULL && ($_SESSION["x".$mybase["x"]."y".$mybase["y"]]!=$mybase["img"])){
     $all.="<x".$mybase["x"]."y".$mybase["y"].">".$mybase["img"]."</x".$mybase["x"]."y".$mybase["y"].">";
     $_SESSION["x".$mybase["x"]."y".$mybase["y"]]=$mybase["img"];
}
}

Gvozd 29.03.2010 00:48

именно это я вам только что и сказал
основная оптимизация проведена
дальнейшие оптимизации лежат из области экономии на спичках

Jekel 29.03.2010 01:27

Капец, оно както плужит тупо! сейчас $user['x'] и $user['y'] = 5! Работу скрипта можно увидить здесь -> http://doobiz.co.cc/test/
$q = mysql_query("SELECT * FROM map WHERE x>='".($user['x']-5)."' AND x<='".($user['x']+5)."' AND y>='".($user['y']-5)."' AND y<='".($user['y']+5)."' ORDER BY y ASC, x ASC");
while($mybase = mysql_fetch_assoc($q)){

if($mybase["img"]!=NULL && ($_SESSION["x".$mybase["x"]."y".$mybase["y"]]!=$mybase["img"])){
     $all.="<x".$mybase["x"]."y".$mybase["y"].">".$mybase["img"]."</x".$mybase["x"]."y".$mybase["y"].">";
     $_SESSION["x".$mybase["x"]."y".$mybase["y"]]=$mybase["img"];
}
}

Gvozd 29.03.2010 01:35

$q = mysql_query("SELECT * FROM map WHERE x>=".($user['x']-5)." AND x<=".($user['x']+5)." AND y>=".($user['y']-5)." AND y<=".($user['y']+5)." ORDER BY y ASC, x ASC");

может быть стоит так?

Jekel 29.03.2010 01:38

:blink: е-мое) работает))) капец...скобочки...спасибо огромное!)

Gvozd 29.03.2010 01:41

Цитата:

Сообщение от Jekel
скобочки

какие нафиг скобочки?
я ни одной скобки не тронул
я удалил кавычки одинарные в SQL-запросе, которые делали из вашего числа строку

Jekel 29.03.2010 01:43

ну да))) кавычки)

Jekel 29.03.2010 01:44

еще вопросик, правда по js, хотя это везде присуще
try{ 
map = xmlResp.getElementsByTagName('x'+x+'y'+y).item(0).firstChild.data; 
document.getElementById('x'+x+'y'+y).style.backgroundImage  = "url(img/" + map + ")"; 
}catch{ 
document.getElementById('x'+x+'y'+y).style.backgroundImage  = "url(img/no.gif)"; 
}


не работает это( и так пробывал:

try{ 
map = xmlResp.getElementsByTagName('x'+x+'y'+y).item(0).firstChild.data; 
if(!map){document.getElementById('x'+x+'y'+y).style.backgroundImage  = "url(img/" + map + ")"; 
}else{ 
document.getElementById('x'+x+'y'+y).style.backgroundImage  = "url(img/no.gif)"; 
} 
}catch(e){}


Часовой пояс GMT +3, время: 03:02.