Napisałem sobie skrypt. Łączy się z bazą danych, odczytuje i wypisuje dane z 4 tabel (dosłownie 10 rekordów), wypisuje 4 formularze - po jednym do modyfikacji danych w każdej tabeli. Na lokalu <wamp 2.1 PHP 5.3.3 MySQL 5.5.8 i Apache 2.2.17> wszystko pięknie śmiga.
Po krótkich testach chciałem zobaczyć jak będzie to wyglądało w internecie i wrzuciłem na swój serwer. Wypełniłem trochę danymi i się bawiłem i przez około 20 minut wszystko działało ładnie, po czym po którymś przesłaniu danych w formularzu pusta strona (biała). I tyle mi się wyświetla. Jak już łaskawie ukaże mi się formularz logowania to po zalogowaniu się dalej pusto.
Treść dziennika logów:
[Tue Jan 10 16:05:22 2012] [warn] [client 31.175.91.238] mod_fcgid: stderr: PHP Fatal error: Allowed memory size of 67108864 bytes exhausted (tried to allocate 66846721 bytes) in /ścieżka_do_folderu/plik_z_funkcjami_dołączonymi_do_skryptu on line 69
Fatal error: Allowed memory size of 67108864 bytes exhausted (tried to allocate 66846721 bytes) in /ścieżka_do_folderu/plik_z_funkcjami_dołączonymi_do_skryptu on line 69Skrypt wygląda tak:
index.php
<?php
if(isset($_POST['check'])) {
if(($_POST['username']==$form_user) && ($_POST['pass']==$form_pass))
{
$_SESSION['logged'] = true;
$_SESSION['login'] = $_POST['username'];
}
else
{
}
}
if(isset($_SESSION['logged']) && (!empty($_SESSION['login']))) {
include('db_select.inc'); // połączenie się z bazą
include('funckje.php');
dodaj('typ1');
dodaj('typ2');
}
else
{
echo(' <form method="POST" action="" class="login"> <fieldset>
<input class="dane" type="text" name="username" value="Login" onfocus="if (this.value == \'Login\') {this.value = \'\';}" onblur="if (this.value == \'\') {this.value = \'Login\';}" />
<input class="dane" type="password" name="pass" value="Hasło" onfocus="if (this.value == \'Hasło\') {this.value = \'\';}" onblur="if (this.value == \'\') {this.value =\'Hasło\';}" />
<input class="login-button" type="submit" value="Zaloguj">
</fieldset>
<input class="hidden" type="hidden" value="1" name="check">
</form>
');
}
?>
funkcje.php
<?php
function cennik($rodzaj)
{
if($rodzaj == 'tpy1'){
$query_typ = 'SELECT * FROM typ;';
$query_kategoria = 'SELECT * FROM kategoria;';
}
if($rodzaj == 'typ2')
{
$query_typ = 'SELECT * FROM typind;';
$query_kategoria = 'SELECT * FROM kategoria2;';
}
if(!$result_typ or
!$result_kategoria){die("Nie można wykonać zapytania! <br />". mysql_error());} $i = 0;
$result_array[$i] = $result_row[1];
$result_array[$i+1] = $result_row[2];
$result_array[$i+2] = $result_row[3];
$i=$i+3;
}
$j = 0;
{
$result_array_tytul[$j+1] = $result_row[0];
$result_array_tytul[$j] = $result_row[1];
$j=$j+2;
}
<div id="tabela_html">
<div id="tytul_gora">Tabela<p>'.date("d.m.Y").'r.</p></div>');
for($i; $i>=0;)
{
if($j>=2){
echo('<div class="kategoria"><h6 class="tytul_kat">'.$result_array_tytul[$j-2].'</h6>'); }
while($result_array[$i] == $result_array_tytul[$j-1]){
echo('<div class="pozycja"><span class="tytul">'.$result_array[$i-2].'</span><span class="cena">'.$result_array[$i-1].'</span></div>'); $i=$i-3;
if($i <=0) {break;}
}
echo('</div>'); // wg. logów tutaj jest błąd $j=$j-2;
}
}
function lista_kategorii($rodzaj)
{
if($rodzaj == 'typ1'){
$query_kategoria = 'SELECT * FROM kategoria;';
}
if($rodzaj == 'typ2')
{
$query_kategoria = 'SELECT * FROM kategoria2;';
}
if(!$result_kategoria){die("Nie można wykonać zapytania! <br />". mysql_error());} $j = 0;
{
$result_array_tytul[$j+1] = $result_row[0];
$result_array_tytul[$j] = $result_row[1];
$j=$j+2;
}
$select = '<select name="kategoria">
<option></option>';
for($j; $j>=2; $j=$j-2)
{
$select.= '<option value="'.$result_array_tytul[$j-1].'">'.$result_array_tytul[$j-2].'</option>';
}
$select.= '</select>';
return $select;
}
function dodaj($rodzaj)
{
$potwierdzenie = '';
if($rodzaj == 'typ1'){
$query_typ = 'SELECT * FROM typ;';
$query_kategoria = 'SELECT * FROM kategoria;';
$rodzaj2 = 'kategoria';
$option = lista_kategorii('typ1');
}
if($rodzaj == 'typ2')
{
$query_typ = 'SELECT * FROM typind;';
$query_kategoria = 'SELECT * FROM kategoria2;';
$rodzaj2 = 'kategoria2';
$option = lista_kategorii('typ2');
}
if (isset($_POST['nazwa'])) {
if($_POST['ktoredodaj'] == 'kategoria'){
if($_POST['nazwa'] != '')
{
$insert = 'INSERT INTO '.$_POST['rodzaj'].' VALUES (';
$id = 'NULL, ';
$nazwa = $_POST['nazwa'];
$query = $insert.$id.'"'.$nazwa.'");';
$potwierdzenie ='Nowa kategoria została zapisana!';
}
else
{
echo('<p style="color:red; font-weight: bold; padding: 5px;">Wpisz nazwę kategorii!</p>'); }
}
else
{
if($_POST['ktoredodaj'] == 'pozycja')
{
if($_POST['nazwa'] != '')
{
if($_POST['rodzaj'] == 'kategoria') $tabela = 'typ';
if($_POST['rodzaj'] == 'kategoria2') $tabela = 'typ2';
$insert = 'INSERT INTO '.$tabela.' VALUES (';
$id = 'NULL, ';
$nazwa = $_POST['nazwa'];
$cena = $_POST['cena'];
$id_kat = $_POST['kategoria'];
$query = $insert.$id.'"'.$nazwa.'", '.$cena.', '.$id_kat.');';
$potwierdzenie ='Nowa pozycja została zapisana!';
}
else
{
echo('<p style="color:red; font-weight: bold; padding: 5px;">Wszystkie pola musza być uzupełnione!</p>'); }
}
}
}
else
{
$_POST['rodzaj'] = '';
$_POST['nazwa'] = '';
}
<h4>Nowa kategoria</h4>
<p style="color:green; font-weight: bold; padding: 5px;">'.$potwierdzenie.'</p>
<form action="#nowe" method="POST" class="dodaj_kategorie">
Nazwa kategorii:</td><td><input size="30" type="text" name="nazwa" value="" />
<input type="hidden" name="rodzaj" value="'.$rodzaj2.'" />
<input type="hidden" name="ktoredodaj" value="kategoria" />
<input type="submit" value="Dodaj nową kategorię" />
</form>
<h4>Nowa pozycja</h4>
form action="#nowe" method="POST" class="dodaj_kategorie">
Nazwa pozycji:<input type="text" name="nazwa" value="" />
Cena: <input type="text" name="cena" value="" />
<input type="hidden" name="rodzaj" value="'.$rodzaj2.'" />
<input type="hidden" name="ktoredodaj" value="pozycja" />
Wybierz kategorię: '.$option.'
<input type="submit" value="Dodaj nową pozycję" />
</form>
');
}
?>
Macie jakieś pomysły/sugestie jak rozwiązać ten problem?za każdym razem gdy prześlę formularz to strona się przeładowuje i łączy się ponownie z bazą danych tzn tak jak na schemacie:
-łączy z bazą
-wyświetla formularz
-zamyka polaczenie
i tak w kółko za każdym przesłaniem formularza.
Czy to może szkodzić mojemu skryptowi? Tzn czy jest on przez to duży, zajmuje dużo zasobów i czy można by to zrobić lepiej? (raz łączyć z bazą danych i przeładowywać stronę bez tracenia tego połączenia)? Czy może to w niczym nie przeszkadza jak sobie dwa razy dziennie połączę się z bazą danych po 5 razy w ramach tego skryptu?
//EDIT: poprawione, wcześniej nie miałem dostępu do źródeł skryptu dlatego tak to napisałem.
Ten post edytował Kulfon 10.01.2012, 18:40:07