Skrypt PHP spisujący dane z tabel SQL trwa ponad 200 sekund (po czym błąd 500)

1

Witam,
Stworzyłem skrypt i podpiąłem do niego CRONA, aby po północy robił spis ze wszystkich tabel (dokładnie z 7 tabel) i dodawał wszystkie pola do jednej tabeli.

Poniżej zamieszczam kod (z góry uprzedzam, że jestem początkującym programistą php więc może być lekko nieczytelny):

<?php


$host="localhost";		// Nazwa hosta
$user="#######"; 				// Nazwa użytkownika - domyślnie: root
$password="#######"; 			// Haslo do bazy
$database="#######";	 	// Nazwa bazy
$table=date('Y.m.d');  		// Nazwa tabeli

ini_set( "display_errors", 0);
$polaczenie = mysql_connect($host,$user,$password);
mysql_query("SET CHARSET utf8");
mysql_query("SET NAMES 'utf8' COLLATE 'utf8_polish_ci'"); 
mysql_select_db($database);

//TWORZENIE TABELI JEŚLI NIE ISTNIEJE
	$tworzenietabeli = "CREATE TABLE IF NOT EXISTS `".$table."` (
	`id` int(11) NOT NULL AUTO_INCREMENT,
	`marka` text CHARACTER SET utf8 COLLATE utf8_polish_ci NOT NULL,
	`model` text CHARACTER SET utf8 COLLATE utf8_polish_ci NOT NULL,
	`kod` text CHARACTER SET utf8 COLLATE utf8_polish_ci NOT NULL,
	`kolor` text CHARACTER SET utf8 COLLATE utf8_polish_ci NOT NULL,
	`typ` text CHARACTER SET utf8 COLLATE utf8_polish_ci NOT NULL,
	`cenanormalna` double NOT NULL,
	`cenapromocyjna` double NOT NULL,
	`r10` int(11) NOT NULL,
	`r11` int(11) NOT NULL,
	`r12` int(11) NOT NULL,
	`r13` int(11) NOT NULL,
	`r14` int(11) NOT NULL,
	`r15` int(11) NOT NULL,
	`r16` int(11) NOT NULL,
	`r17` int(11) NOT NULL,
	`r18` int(11) NOT NULL,
	`r19` int(11) NOT NULL,
	`r20` int(11) NOT NULL,
	`r21` int(11) NOT NULL,
	`r22` int(11) NOT NULL,
	`r23` int(11) NOT NULL,
	`r24` int(11) NOT NULL,
	`r25` int(11) NOT NULL,
	`r26` int(11) NOT NULL,
	`r27` int(11) NOT NULL,
	`r28` int(11) NOT NULL,
	`r29` int(11) NOT NULL,
	`r30` int(11) NOT NULL,
	`r31` int(11) NOT NULL,
	`r32` int(11) NOT NULL,
	`r33` int(11) NOT NULL,
	`r34` int(11) NOT NULL,
	`r35` int(11) NOT NULL,
	`r36` int(11) NOT NULL,
	`r37` int(11) NOT NULL,
	`r38` int(11) NOT NULL,
	`r39` int(11) NOT NULL,
	`r40` int(11) NOT NULL,
	`r41` int(11) NOT NULL,
	`r42` int(11) NOT NULL,
	`r43` int(11) NOT NULL,
	`r44` int(11) NOT NULL,
	`r45` int(11) NOT NULL,
	`r46` int(11) NOT NULL,
	`r47` int(11) NOT NULL,
	`r48` int(11) NOT NULL,
	`r49` int(11) NOT NULL,
	`r50` int(11) NOT NULL,
	`r51` int(11) NOT NULL,
	`r52` int(11) NOT NULL,
	`r53` int(11) NOT NULL,
	`r54` int(11) NOT NULL,
	`r55` int(11) NOT NULL,
	`r56` int(11) NOT NULL,
	`r57` int(11) NOT NULL,
	`r58` int(11) NOT NULL,
	`r59` int(11) NOT NULL,
    `r60` int(11) NOT NULL,
	PRIMARY KEY (`id`)
	) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;";
	
	mysql_query("$tworzenietabeli");
	
	
	$zapytanie = 'SELECT * FROM buty';

	$rezultat = mysql_query("$zapytanie");
	$ile = mysql_num_rows($rezultat);


	
	for ($i = 1; $i <= $ile; $i++) 
	{
		
	$roz[10]=0;
	$roz[11]=0;
	$roz[12]=0;
	$roz[13]=0;
	$roz[14]=0;
	$roz[15]=0;
	$roz[16]=0;
	$roz[17]=0;
	$roz[18]=0;
	$roz[19]=0;
	$roz[20]=0;
	$roz[21]=0;
	$roz[22]=0;
	$roz[23]=0;
	$roz[24]=0;
	$roz[25]=0;
	$roz[26]=0;
	$roz[27]=0;
	$roz[28]=0;
	$roz[29]=0;
	$roz[30]=0;
	$roz[31]=0;
	$roz[32]=0;
	$roz[33]=0;
	$roz[34]=0;
	$roz[35]=0;
	$roz[36]=0;
	$roz[37]=0;
	$roz[38]=0;
	$roz[39]=0;
	$roz[40]=0;
	$roz[41]=0;
	$roz[42]=0;
	$roz[43]=0;
	$roz[44]=0;
	$roz[45]=0;
	$roz[46]=0;
	$roz[47]=0;
	$roz[48]=0;
	$roz[49]=0;
	$roz[50]=0;
	$roz[51]=0;
	$roz[52]=0;
	$roz[53]=0;
	$roz[54]=0;
	$roz[55]=0;
	$roz[56]=0;
	$roz[57]=0;
	$roz[58]=0;
	$roz[59]=0;
	$roz[60]=0;
	
	
	$row = mysql_fetch_assoc($rezultat);
	$id = $row['idtowaru'];
	$kod = $row['kod'];
	$marka = $row['marka'];
	$model = $row['model'];
	$typ = $row['typ'];
	$kolor = $row['kolor'];
	$cenapromocyjna = $row['cenapromocyjna'];
	$cenanormalna = $row['cenanormalna'];
	
	
	
	$zapytanie="INSERT INTO `".$table."` (`id`, `marka`, `model`, `kod`, `kolor`, `typ`, `cenanormalna`, `cenapromocyjna`) VALUES (NULL, '".$marka."', '".$model."', '".$kod."', '".$kolor."', '".$typ."', '".$cenanormalna."', '".$cenapromocyjna."');";

	mysql_query("$zapytanie");
	
	$ostatnieid = mysql_insert_id(); 
	
	//POBIERANIE ROZMIARÓW Z MAGAZYN
	for ($rr=10;$rr<=60;$rr++)
	{
		$zap = "SELECT r".$rr." FROM magazyn WHERE idtowaru=".$id;
		$res = mysql_query("$zap");
		$x = mysql_result($res, 0, 0);
		$pom="r".$rr;
		$roz[$rr]=$roz[$rr]+$x;
		$up = "UPDATE  `".$table."` SET  `r".$rr."` =  '".$roz[$rr]."' WHERE `id` =".$ostatnieid.";";
		mysql_query("$up");
	}
	
	//POBIERANIE ROZMIARÓW Z PORAJ
	for ($rr=10;$rr<=60;$rr++)
	{
		$zap = "SELECT r".$rr." FROM poraj WHERE idtowaru=".$id;
		$res = mysql_query("$zap");
		$x = mysql_result($res, 0, 0);
		$pom="r".$rr;
		$roz[$rr]=$roz[$rr]+$x;
		$up = "UPDATE  `".$table."` SET  `r".$rr."` =  '".$roz[$rr]."' WHERE `id` =".$ostatnieid.";";
		mysql_query("$up");
	}
	
	//POBIERANIE ROZMIARÓW Z KRUPOWKI
	for ($rr=10;$rr<=60;$rr++)
	{
		$zap = "SELECT r".$rr." FROM krupowki WHERE idtowaru=".$id;
		$res = mysql_query("$zap");
		$x = mysql_result($res, 0, 0);
		$pom="r".$rr;
		$roz[$rr]=$roz[$rr]+$x;
		$up = "UPDATE  `".$table."` SET  `r".$rr."` =  '".$roz[$rr]."' WHERE `id` =".$ostatnieid.";";
		mysql_query("$up");
	}
	
	//POBIERANIE ROZMIARÓW Z SUKIENNICE
	for ($rr=10;$rr<=60;$rr++)
	{
		$zap = "SELECT r".$rr." FROM sukiennice WHERE idtowaru=".$id;
		$res = mysql_query("$zap");
		$x = mysql_result($res, 0, 0);
		$pom="r".$rr;
		$roz[$rr]=$roz[$rr]+$x;
		$up = "UPDATE  `".$table."` SET  `r".$rr."` =  '".$roz[$rr]."' WHERE `id` =".$ostatnieid.";";
		mysql_query("$up");
	}
	
	//POBIERANIE ROZMIARÓW Z PRZEJSCIE
	for ($rr=10;$rr<=60;$rr++)
	{
		$zap = "SELECT r".$rr." FROM przejscie WHERE idtowaru=".$id;
		$res = mysql_query("$zap");
		$x = mysql_result($res, 0, 0);
		$pom="r".$rr;
		$roz[$rr]=$roz[$rr]+$x;
		$up = "UPDATE  `".$table."` SET  `r".$rr."` =  '".$roz[$rr]."' WHERE `id` =".$ostatnieid.";";
		mysql_query("$up");
	}
	
	//POBIERANIE ROZMIARÓW Z RYNEK
	for ($rr=10;$rr<=60;$rr++)
	{
		$zap = "SELECT r".$rr." FROM rynek WHERE idtowaru=".$id;
		$res = mysql_query("$zap");
		$x = mysql_result($res, 0, 0);
		$pom="r".$rr;
		$roz[$rr]=$roz[$rr]+$x;
		$up = "UPDATE  `".$table."` SET  `r".$rr."` =  '".$roz[$rr]."' WHERE `id` =".$ostatnieid.";";
		mysql_query("$up");
	}
	
	
}
?>

Chodzi mi o to że skrypt wykonuje się prawidłowo, ale tylko do czasu dokładnie 200 sekund (sprawdziłem stoperem), później wywala błąd 500.
Jak mogę edytować ten kod lub co mogę zrobić by nie wywalało tego błędu.

Dodam jeszcze, że wszystko znajduje się na serwerze hekko.

Pozdrawiam,
Krzysiek

1

Pewnie mnie zwyzywasz od debili i żebym się nie odzywał nie na temat, trudno, swoje zdanie wyrażę:

Nie bierz się za takie rzeczy, bez posiadania wiedzy elementarnej nt. tego, co robisz.
Innymi słowy - wszystko tu jest źle.
Źle zaprojektowana jest baza danych (każda tabel z takimi samymi polami, każdy rozmiar ma osobną kolumnę), ten listing zerujący tablicę, te SQL Injection wszędzie, używanie przestarzałych mysql_*, cuda typu "$up" (string zawierający tylko zmienną), cały kod w jednym pliku...

Jeżeli potrzebujesz określonego kodu - póki co zleć komuś wykonanie, a sam weź się za podstawy i trochę wolniej z ambicjami.

Co do problemu jakiegoś ratowania tego, co masz - nie wiem czy przy tak nieoptymalnym sposobie zapisu danych jesteś w stanie coś zrobić. Nie wiem jak dużo danych zawierają poszczególne tabele i po co to wszystko jest - ale patrząc na listing kodu na 5 ekranów - nawet nie chcę zrozumieć.

0

Nikogo nie mam od debili wyzywać. Nie nazwałem siebie profesjonalnym programistą dlatego też nie twierdzę, że jestem ekspertem. ;)

Wiem, że powinno to być napisane obiektowo, ponieważ i tak np. mysql_query ma wiele wad i nikt tego dotknąć nie chce (Ale jak coś jest głupie, ale działa to znaczy, że nie jest głupie).

Tabele wyglądają tak:
-Poraj, Krupowki, Sukiennice, Przejscie i Rynek:
-- id | idtowaru | r10 | r11 | r12 | itd. --||-- itd. | r58 | r59 | r60 (r10..r60 - oznaczają rozmiar)

--Buty
-- idtowaru | squ | marka | model | kolor | typ | cenanormalna | cenapromocyjna

I te wszystkie tabele chcę zsumować do jednej głównej z dzisiejszą datą.

Wszystkich wierszy powinno być 499, ale będzie ich może nawet do 1000.

[Skrypt działa dobrze, ale tylko do wiersza nr 420]

Pozdrawiam!

0
TheKrzychuuuuu napisał(a):

Witam,Stworzyłem skrypt i podpiąłem do niego CRONA, aby po północy robił spis ze wszystkich tabel (dokładnie z 7 tabel) i dodawał wszystkie pola do jednej tabeli.

Krzysiek, opisz co docelowo chcesz osiągnąć tym skryptem? Do czego ma służyć - potem pomyślimy jak to poprawić.

0

Tabele magazyn, poraj, krupowki, sukiennice, przejscie i rynek są sklepami, które posiadają własne stany magazynowe (każdy sklep to magazyn), a ja chce by np o 1 w nocy spisało mi ile jest wszystkich par butów razem (np. Model: XXX YYY za 69zł - r10 (ilość 5 razem) r11 (ilość 10 razem) itd.) [będzie to oczywiście w postaci tabeli]. Chce by ten skrypt był tak jakby codziennie robionym renamentem.

Pozdrawiam!

1

Jeżeli dobrze zrozumiałem założenia to będziesz potrzebował 3 tabel (w nawiasie docelowe pola)

shop (id, name, ...)
shop_sizes (id, name)
shop_sizes_availability (id, shop_id, size_id, count)

Do 1 tabeli wprowadzasz dane sklepu
Do 2 dane rozmiarów butów
Do 3 wiążesz id sklepu (shop_id) z id rozmiaru (size_id). Inaczej mówiąc przypisujesz sklepowi dany rozmiar wraz z ilością (count).

Jak będziesz chciał policzyć ile docelowo jest wszystkich sztuk wszystkich rozmiarów ze wszystkich sklepów - sumujesz wartość count w tabeli nr 3 (SUM(count))(shop_sizes_availability)

PS: Jeżeli chcesz policzyć ilość par w rozmiarze X, sprawdzasz jakie ma id w bazie. Potem wystarczy zrobić tylko SUM('count') z WHERE size_id = np. 4. To samo można odnieść do sklepu (WHERE shop_id = x).

0

Wielkie dzięki. Otworzyłeś mi oczy na wiele spraw. Spróbuje stworzyć od nowa cały program, tym razem obiektowo i z innymi tabelami.

Pozdrawiam!

0

W twoim przypadku rozmiary będą takie same niezależnie od sklepu. Będziesz miał w tabeli rozmiarów elementy np. od R1 do R50 (czyli 50 rekordów).
Natomiast w tabeli shop_sizes_availability powiążesz tylko id rozmiaru z id sklepu.

Czyli:

rozmiar X ma id 1
rozmiar Y ma id 2
rozmiar Z ma id 3

Sklep Rynek ma id 1
Sklep Krupówki ma id 2

Sklep Rynek będzie miał u siebie rozmiary X i Y więc w ostatniej tabeli będą 2 wpisy.
Sklep Krupówki będzie miał u siebie rozmiary Y i Z więc w ostatniej tabeli będą kolejne 2 wpisy.

Razem
|id sklepu|id rozmiaru|
1/1
1/2
2/2
2/3

Dzięki temu rozmiary masz w 1 tabeli (nie powtarzasz ich dla wszystkich sklepów) i możesz je dowolnie przypisywać bądź usuwać ze sklepów. Od tego jest właśnie ostatnia tabela.
Zliczanie całe możesz zrobić w MySQL - wykonanie zapytania zajmie ułamek sekundy. Nie trzeba pisać mega dużych skryptów do tego ;)

0

Czyli dobrze rozumiem, że tabela shop_sizes_availability powinna mieć tak naprawdę tylko 3 kolumny i powinna wyglądać tak?

idsklepu | idrozmiaru | ilosc
1 | 1 | 10
1 | 2 | 7
1 | 3 | 10
1 | 4 | 15
2 | 1 | 5

itd.

0

Ten fragment możesz zapisać inaczej

     $zapytanie = 'SELECT * FROM buty';
 
    $rezultat = mysql_query("$zapytanie");
    $ile = mysql_num_rows($rezultat);

np. tak

 
    $rezultat = mysql_query('SELECT * FROM buty');
    $ile = mysql_num_rows($rezultat); 

A ten kod możesz zapisać tak

 for ($rr=10;$rr<=60;$rr++)
    {
        $zap = "SELECT r".$rr." FROM magazyn WHERE idtowaru=".$id;
        $res = mysql_query("$zap");
        $x = mysql_result($res, 0, 0);
        $pom="r".$rr;
        $roz[$rr]=$roz[$rr]+$x;
        $up = "UPDATE  `".$table."` SET  `r".$rr."` =  '".$roz[$rr]."' WHERE `id` =".$ostatnieid.";";
        mysql_query("$up");
    }
 
    //POBIERANIE ROZMIARÓW Z PORAJ
    for ($rr=10;$rr<=60;$rr++)
    {
        $zap = "SELECT r".$rr." FROM poraj WHERE idtowaru=".$id;
        $res = mysql_query("$zap");
        $x = mysql_result($res, 0, 0);
        $pom="r".$rr;
        $roz[$rr]=$roz[$rr]+$x;
        $up = "UPDATE  `".$table."` SET  `r".$rr."` =  '".$roz[$rr]."' WHERE `id` =".$ostatnieid.";";
        mysql_query("$up");
    }
 
    //POBIERANIE ROZMIARÓW Z KRUPOWKI
    for ($rr=10;$rr<=60;$rr++)
    {
        $zap = "SELECT r".$rr." FROM krupowki WHERE idtowaru=".$id;
        $res = mysql_query("$zap");
        $x = mysql_result($res, 0, 0);
        $pom="r".$rr;
        $roz[$rr]=$roz[$rr]+$x;
        $up = "UPDATE  `".$table."` SET  `r".$rr."` =  '".$roz[$rr]."' WHERE `id` =".$ostatnieid.";";
        mysql_query("$up");
    }
 
    //POBIERANIE ROZMIARÓW Z SUKIENNICE
    for ($rr=10;$rr<=60;$rr++)
    {
        $zap = "SELECT r".$rr." FROM sukiennice WHERE idtowaru=".$id;
        $res = mysql_query("$zap");
        $x = mysql_result($res, 0, 0);
        $pom="r".$rr;
        $roz[$rr]=$roz[$rr]+$x;
        $up = "UPDATE  `".$table."` SET  `r".$rr."` =  '".$roz[$rr]."' WHERE `id` =".$ostatnieid.";";
        mysql_query("$up");
    }
 
    //POBIERANIE ROZMIARÓW Z PRZEJSCIE
    for ($rr=10;$rr<=60;$rr++)
    {
        $zap = "SELECT r".$rr." FROM przejscie WHERE idtowaru=".$id;
        $res = mysql_query("$zap");
        $x = mysql_result($res, 0, 0);
        $pom="r".$rr;
        $roz[$rr]=$roz[$rr]+$x;
        $up = "UPDATE  `".$table."` SET  `r".$rr."` =  '".$roz[$rr]."' WHERE `id` =".$ostatnieid.";";
        mysql_query("$up");
    }
 
    //POBIERANIE ROZMIARÓW Z RYNEK
    for ($rr=10;$rr<=60;$rr++)
    {
        $zap = "SELECT r".$rr." FROM rynek WHERE idtowaru=".$id;
        $res = mysql_query("$zap");
        $x = mysql_result($res, 0, 0);
        $pom="r".$rr;
        $roz[$rr]=$roz[$rr]+$x;
        $up = "UPDATE  `".$table."` SET  `r".$rr."` =  '".$roz[$rr]."' WHERE `id` =".$ostatnieid.";";
        mysql_query("$up");
    }
 
function jakas_funkcja($tabela) {
    for ($rr=10;$rr<=60;$rr++)
    {
        $zap = "SELECT r".$rr." FROM $tabela WHERE idtowaru=".$id;
        $res = mysql_query("$zap");
        $x = mysql_result($res, 0, 0);
        $pom="r".$rr;
        $roz[$rr]=$roz[$rr]+$x;
        $up = "UPDATE  `".$table."` SET  `r".$rr."` =  '".$roz[$rr]."' WHERE `id` =".$ostatnieid.";";
        mysql_query("$up");
    }


}

0

@pol90 - spoko, tylko żadna z tych opcji nie przyśpieszy wykonania kodu ;)

A zapytanie SQL warto mieć w osobnej zmiennej (chociaż by po to, żeby je sobie DUMPnąć w razie potrzeby, albo zapisać w logach w razie awarii).

1 użytkowników online, w tym zalogowanych: 0, gości: 1