Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MSSQL][PHP][SMARTY]Wyświetlenie danych z BD
Forum PHP.pl > Forum > Przedszkole
DerekDX
Witam, zaczełem przerabiać swoją stronę na szablony Smart. I pojawił się pierwszy problem. Otóż przy wykonaniu kodu pojawia się błąd o treści:
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 36 bytes) in E:\Dropbox\xampp-portable\htdocs\xampp\PJWSTK\users.php on line 16

Jako, że dopiero zaczynam naukę ze Smarty PHP kożystam z manulala zamieszczonego tu

Poniżej zamieszczam funkcję z której korzystam w skrypcie, szablon .tpl oraz skrypt PHP.
  1. function db_czytaj($zapytanie){
  2. require('mysql_config.php');
  3. $mysql=mysqli_connect($mysql_server,$mysql_user,$mysql_password) or die('nie polaczylo z baza danych');
  4. $wybrana=mysqli_select_db($mysql,$db_name) or die('nie wybrano bazy danych');
  5. $wynik=mysqli_query($mysql,$zapytanie) or die('Nie poprawne zapytanie');
  6. $wynik2=mysqli_fetch_assoc($wynik);
  7. return $wynik2;
  8. }



  1. <?php
  2. require('include/include.php');
  3. require('header.php');
  4. require('menu.php');
  5.  
  6. $tpl = new Smarty;
  7. $tpl -> template_dir = 'smarty/templates/';
  8. $tpl -> compile_dir = 'smarty/templates_c/';
  9.  
  10. $zapytanie="select `user_id`,`login`,`name`,`surname`,`email`,`telephone` FROM `users`;";
  11. $wynik2 = array();
  12. $wynik=db_czytaj($zapytanie);
  13.  
  14.  
  15. while($wynik){
  16. $wynik2[]=array(
  17. 'user_id'=>$wynik['user_id'],
  18. 'login'=>$wynik['login'],
  19. 'name'=>$wynik['name'],
  20. 'surname'=>$wynik['surname'],
  21. 'email'=>$wynik['telephone'],
  22. );
  23. }
  24.  
  25.  
  26. $tpl -> assign('wynik', $wynik2);
  27. $tpl -> display('users.tpl');
  28.  
  29. ?>
  30.  


  1. <fieldset>
  2. <legend><p>Użytkownicy</p></legend>
  3. <a href="add_user.php"><button type="button"><p>Dodaj użytkownika</p></button></a>
  4. <table>
  5. {section name=i loop=$wynik}
  6. <tr>
  7. <td>
  8. {$wynik[i].login}
  9. </td>
  10. <td>
  11. {$wynik[i].name}
  12. </td>
  13. <td>
  14. {$wynik[i].surname}
  15. </td>
  16. <td>
  17. {$wynik[i.email]}
  18. </td>
  19. <td>
  20. {$wynik[i].telephone}
  21. </td>
  22. </tr>
  23. {/section}
  24. </table>
  25. </fieldset>
nospor
while($wynik){
Przecież ty się tutaj zapętlasz i nigdy nie kończysz..... Problem ze smarty nie ma żadnego związku. To są podstawy php wink.gif
Warunek w WHILE musi się zmieniać, a u ciebie ciągle jest taki sam i prawdziwy smile.gif

Proszę, tu masz napisane jak pobierać dane z bazy przy pomocy WHILE
http://pl1.php.net/manual/pl/mysqli-result.fetch-assoc.php
Skorzytaj z tego bo jeszcze nie jesteś na etapie by kombinować.
DerekDX
wyrażeniem w pętli while jest jest wynikiem funkcji db_czytaj() która zwraca wynik funkcji mysqli_fetch_assoc() tak jak w manualu podanym przez Ciebie

  1. $query = "SELECT Name, CountryCode FROM City ORDER by ID DESC LIMIT 50,5";
  2.  
  3. if ($result = mysqli_query($link, $query)) {
  4.  
  5. /* fetch associative array */
  6. while ($row = mysqli_fetch_assoc($result)) {
  7. printf ("%s (%s)\n", $row["Name"], $row["CountryCode"]);
  8. }
  9.  
  10. /* free result set */
  11. mysqli_free_result($result);
  12. }
nospor
A ty nadal nie rozumiesz o czym mówie....

U ciebie $wynik w pętli się nie zmienia. Przec co generujesz niekończącą się pętle.
Zaś w manuala warunek w WHILE się zmienia, gdyż masz tam na bięząco wynik mysql_fetch_assoc() który jest zmienny a na końcu jest FALSE i konczy WHILE.
DerekDX
Dobrze myśle ze oczyszciłem kod php z błedów:

Funkcja realizujaca połączenie z baza danych:
  1. function db_czytaj($zapytanie){
  2. require('mysql_config.php');
  3. $mysql=mysqli_connect($mysql_server,$mysql_user,$mysql_password) or die('nie polaczylo z baza danych');
  4. $wybrana=mysqli_select_db($mysql,$db_name) or die('nie wybrano bazy danych');
  5. $wynik=mysqli_query($mysql,$zapytanie) or die('Nie poprawne zapytanie');
  6. return $wynik;


Skrypt php
  1. <?php
  2. require('include/include.php');
  3. require('header.php');
  4. require('menu.php');
  5.  
  6. $tpl = new Smarty;
  7. $tpl -> template_dir = 'smarty/templates/';
  8. $tpl -> compile_dir = 'smarty/templates_c/';
  9.  
  10. $zapytanie="select `user_id`,`login`,`name`,`surname`,`email`,`telephone` FROM `users`;";
  11. $wynik2 = array();
  12. $wynik=db_czytaj($zapytanie);
  13.  
  14. while($wynik2=mysqli_fetch_assoc($wynik)){
  15. $wynik2=array(
  16. 'user_id'=>$wynik2['user_id'],
  17. 'login'=>$wynik2['login'],
  18. 'name'=>$wynik2['name'],
  19. 'surname'=>$wynik2['surname'],
  20. 'email'=>$wynik2['telephone'],
  21. );
  22. }
  23.  
  24.  
  25. $tpl -> assign('wynik', $wynik2);
  26. $tpl -> display('users.tpl');
  27.  
  28. ?>
  29.  


i plik z szablonem

  1. <fieldset>
  2. <legend><p>Użytkownicy</p></legend>
  3. <a href="add_user.php"><button type="button"><p>Dodaj użytkownika</p></button></a>
  4. <table>
  5. {section name=i loop=$wynik}
  6. <tr>
  7. <td>
  8. {$wynik[i].login}
  9. </td>
  10. <td>
  11. {$wynik[i].name}
  12. </td>
  13. <td>
  14. {$wynik[i].surname}
  15. </td>
  16. <td>
  17. {$wynik[i.email]}
  18. </td>
  19. <td>
  20. {$wynik[i].telephone}
  21. </td>
  22. </tr>
  23. {/section}
  24. </table>
  25. </fieldset>


Teraz niestety nic mi nie wyświetla tzn nie wyświetla mi tych rekordów z BD w szablonie
abort
  1. while($wynik2=mysqli_fetch_assoc($wynik)){
  2. $wynik2=array(
  3. 'user_id'=>$wynik2['user_id'],
  4. 'login'=>$wynik2['login'],

Najpierw wczytujemy z bazy wiersz do zmiennej $wynik2.
Potem tworzymy (znowu!) zmienną $wynik2, przypisując jej fragment TEJ SAMEJ zmiennej $wynik2...
EDIT: I wszystko to robimy TYLKO PO TO, by podczas odczytywania następnego wiersza utracić te wartości przez nadpisanie je wartościami z właśnie odczytanego nowego wiersza... smile.gif

Ech...

Tak czy inaczej, pisanie kluczowej pętli programu z użyciem jednej zmiennej to dość ciekawe podejście programistyczne.
Swoją drogą, nazewnictwo zmiennych ($wynik, $wynik2) znudzi Ci się w okolicy $wynik10, o ile wcześniej nie dostaniesz szału z debugowaniem ("Kruca bomba, który numerek po $wynik dodać, aby znaleźć to, czego szukam?!").
DerekDX
tak faktycznie bardzo poważny błąd logiczny
poprawiony skrypt
  1. <?php
  2. require('include/include.php');
  3. require('header.php');
  4. require('menu.php');
  5.  
  6. $tpl = new Smarty;
  7. $tpl -> template_dir = 'smarty/templates/';
  8. $tpl -> compile_dir = 'smarty/templates_c/';
  9.  
  10. $zapytanie="select `user_id`,`login`,`name`,`surname`,`email`,`telephone` FROM `users`;";
  11. $users = array();
  12. $wynik=db_czytaj($zapytanie);
  13.  
  14. while($wynik2=mysqli_fetch_assoc($wynik)){
  15. $users=array(
  16. 'user_id'=>$wynik2['user_id'],
  17. 'login'=>$wynik2['login'],
  18. 'name'=>$wynik2['name'],
  19. 'surname'=>$wynik2['surname'],
  20. 'email'=>$wynik2['telephone'],
  21. );
  22. }
  23.  
  24.  
  25. $tpl -> assign('users', $users);
  26. $tpl -> display('users.tpl');
  27.  
  28. ?>
  29.  


teraz dla odmiany sypie błędami z Smartów

Notice: Undefined offset: 0 in E:\Dropbox\xampp-portable\htdocs\xampp\PJWSTK\smarty\templates_c\5f14d12ab6ac7e7a6ed3fab9fca28161a609a98c.file.users.tpl.php on line 56


  1. <fieldset>
  2. <legend><p>Użytkownicy</p></legend>
  3. <button type="button" onClick="window.open('add_user.php','Dodaj użytkownika','resizable=0,height=300,width=550')"><p>Dodaj użytkownika</p></button></a>
  4. <table>
  5. {section name=i loop=$users}
  6. <tr>
  7. <td>
  8. {$users[i].user_id}
  9. </td>
  10. <td>
  11. <a href="#" onClick="window.open('view_user.php?id={$users[i].user_id}')">{$users[i].login}</a>
  12. </td>
  13. <td>
  14. {$users[i].name}
  15. </td>
  16. <td>
  17. {$users[i].surname}
  18. </td>
  19. <td>
  20. {$users[i].email}
  21. </td>
  22. <td>
  23. {$users[i].telephone}
  24. </td>
  25. </tr>
  26. {/section}
  27. </table>
  28. </fieldset>
abort
Dawno nie używałem smarty, ale: http://www.smarty.net/docsv2/en/language.f....html.table.tpl - krócej i efektywniej.
Co prawda oznaczona w rozdziale "Custom Functions", ale po wpisaniu w googlach po "smarty display array as table" dostaniesz więcej wyników (to był pierwszy link).
nospor
while($wynik2=mysqli_fetch_assoc($wynik)){

$users=array(

'user_id'=>$wynik2['user_id'],

'login'=>$wynik2['login'],

'name'=>$wynik2['name'],

'surname'=>$wynik2['surname'],

'email'=>$wynik2['telephone'],

);

}

Przecież ty tutaj w petli ciągle nadpisujesz $users.... w wyniku czego po pętli w $users masz tylko ostani rekord....

Tak ma być
$users = array();
while($wynik2=mysqli_fetch_assoc($wynik)){
$users[]=array(
'user_id'=>$wynik2['user_id'],
'login'=>$wynik2['login'],
'name'=>$wynik2['name'],
'surname'=>$wynik2['surname'],
'email'=>$wynik2['telephone'],
);
}

I zamiast section używaj FOREACH - jest o niebo czytelniejsze i oniebo trudniej się pomylić.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.