Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [smarty] jeżeli rekord nie istnieje zwraca false
Forum PHP.pl > Forum > Gotowe rozwiązania > Systemy szablonów
soon
Witam,

mam plik select_page.php który odpowiada za to na której podstronie jakie pliki mają się wczytać.
  1. <?php
  2. function user_profile() 
  3. {
  4. global $smarty;
  5. global $page;
  6.  
  7. require_once('files/user_profile.php');
  8.  
  9. $smarty->assign('siteTitle', $user_name.' - profil użytkownika');
  10. $smarty->assign('section_title', ' - profil użytkownika');
  11. $smarty->assign('section_subtitle', 'profil użytkownika');
  12.  
  13. $page = 'user_profile.tpl';
  14. }
  15. ?>


teraz chodzi mi dokładnie o zmienną $user_name. Na podstawie user_id przekazanego w adresie ma wyświetlić jego nazwę i przypisać do siteTitle, co potem jest wyświetlane między <title></title>.

W pliku user_profile.php mam to napisane tak:
  1. <?php
  2. global $smarty;
  3. global $db;
  4. $user_id = $_GET['user_id'];
  5.  
  6. $result = $db->set_query('SELECT * from tpl_users WHERE id = ' . $user_id . '');
  7. $smarty->assign_by_ref('db_result_user', $result);
  8.  
  9. $user_name = $result[0]['nick'];
  10. ?>


Chciałbym jednak zabezpieczyć to przed ręczną zmianą $user_id która jest pobierana przez $_GET. Czyli jeżeli skrypt będzie chciał wczytać nieistniejący id ma zwrócić false.

Nie mam pojęcia jak się za to zabrać. Proszę o pomoc.

Jednak zrobiłem do dodatkowym zapytaniem z czego nie do końca jestem zadowolony.

user_profile.php
  1. <?php
  2. global $smarty;
  3. global $db;
  4. global $page;
  5. $user_id = $_GET['user_id'];
  6.  
  7. $result = $db->set_query('SELECT * from tpl_users WHERE id = ' . $user_id . '');
  8. $smarty->assign_by_ref('db_result_user', $result);
  9.  
  10. $sql = mysql_query('SELECT * from tpl_users WHERE id = ' . $user_id . '');
  11. $num_rows = mysql_num_rows($sql);
  12.  
  13. $smarty->assign_by_ref('num_rows', $num_rows);
  14.  
  15. if ($num_rows == 0) {
  16. $user_name = 'Błędny numer użytkownika';
  17. } else {
  18. $user_name = $result[0]['nick'];
  19. }
  20. ?>


user_profile.tpl
  1. <?php
  2. <div id="left">
  3. {section name=id}
  4. {if $num_rows == 0} 
  5. <div id="section">Nie znaleziono użytkownika o podanym ID.</div>
  6. {else}
  7. <div id="section">{$db_result_user[id].nick}{$section_title}</div>
  8.  
  9. <div>
  10. <p>Nazwa użytkownika: <b>{$db_result_user[id].nick}</b></p>
  11. <p>Imię: <b>{$db_result_user[id].user_name}</b></p>
  12. </div>
  13. {/if}
  14. {/section}
  15. </div>
  16. ?>


Jednak bardziej by mnie zadowalało coś na styl:
  1. <?php
  2. $result = $db->set_query('SELECT * from tpl_users WHERE id = ' . $user_id . '');
  3. $num_rows = mysql_num_rows($result);
  4. ?>


Ale wywala mi wtedy błędy.

Ma ktoś pomysł jak to rozwiązać? A może to moje rozwiązanie jest dobre i nie ma potrzeby nic z tym robić?
Sabistik
Przecież masz do dyspozycji {sectionelse}
soon
Dziękuję, zmieniłem user_profile.tpl na:
  1. <?php
  2. <div id="left">
  3. {section name=id loop=$num_rows}
  4. <div id="section">{$db_result_user[id].nick}{$section_title}</div>
  5.  
  6. <div>
  7. <p>Nazwa użytkownika: <b>{$db_result_user[id].nick}</b></p>
  8. <p>Imię: <b>{$db_result_user[id].user_name}</b></p>
  9. </div>
  10. {sectionelse}
  11. <div id="section">Nie znaleziono użytkownika o podanym ID.</div>
  12. {/section}
  13. </div>
  14. ?>


Ale bardziej mi chodzi jak pozbyć się dodatkowego zapytania w user_profile.php, czy da się wykorzystać ten kawałek
  1. <?php
  2. $result = $db->set_query('SELECT * from tpl_users WHERE id = ' . $user_id . '');
  3. ?>
zamiast tworzyć nowe zapytanie mysql_num_rows?

I pojawił się jeszcze jeden problem, jak w adresie przekaże zmienną ?user_id=x to wywala mi "Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in D:\VertrigoServ\www\smarty\files\user_profile.php on line 11". A też chciałbym, żeby wywalało to samo co po wpisaniu cyfr
Sabistik
Cytat
I pojawił się jeszcze jeden problem, jak w adresie przekaże zmienną ?user_id=x to wywala mi "Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in D:\VertrigoServ\www\smarty\files\user_profile.php on line 11". A też chciałbym, żeby wywalało to samo co po wpisaniu cyfr

To rzutuj $user_id na int.
soon
Dziękuję pięknie. Przepraszam za głupie pytania ale się uczę dopiero.

A co powiesz o tym dodatkowym zapytaniu? Da radę przekształcić w jedno?
Sabistik
Przecież nie musisz zliczać tego ilości userów. wystarczy Ci tylko pierwsze zapytanie:
  1. <?php
  2. $result = $db->set_query('SELECT * from tpl_users WHERE id = ' . $user_id . '');
  3. $smarty->assign_by_ref('db_result_user', $result);
  4. ?>


Potem w szablonie coś na wzór:
  1. <div id="left">
  2. {section name=user loop=$db_result_user}
  3. <div id="section">{$user.nick}{$section_title}</div>
  4.  
  5. <div>
  6. <p>Nazwa użytkownika: <b>{$user.nick}</b></p>
  7. <p>Imię: <b>{$user.user_name}</b></p>
  8. </div>
  9. {sectionelse}
  10. <div id="section">Nie znaleziono użytkownika o podanym ID.</div>
  11. {/section}
  12. </div>
soon
No ale przy tym wszystkim pojawia się jeden problem. W pliku user_profile.php muszę zdeklarować zmienną $user_name, która przekazywana jest do <title>. Wczytywana jest w pliku select_page.php odpowiadającym za zamianę podstron.

  1. <?php
  2. function user_profile() 
  3. {
  4. global $smarty;
  5. global $page;
  6.  
  7. require_once('files/user_profile.php');
  8.  
  9. $smarty->assign('siteTitle', $user_name.' - profil użytkownika');
  10. $smarty->assign('section_title', ' - profil użytkownika');
  11. $smarty->assign('section_subtitle', 'profil użytkownika');
  12.  
  13. $page = 'user_profile.tpl';
  14. }
  15. ?>


user_profile.php przekształciłem na
  1. <?php
  2. global $smarty;
  3. global $db;
  4. global $page;
  5. $user_id = (int)$_GET['user_id']; //pobiera z adresu ID usera i przekształca na INT
  6.  
  7. $sql = 'SELECT * from tpl_users WHERE id = ' . $user_id . ''; // zapytanie
  8.  
  9. $result = $db->set_query($sql);
  10. $smarty->assign_by_ref('db_result_user', $result);
  11.  
  12. $smarty->assign_by_ref('num_rows', mysql_num_rows(mysql_query($sql))); // liczy ilość rekordów o danym id
  13.  
  14. if ($num_rows == 0) { // gdy równa się 0 zmienia title na error
  15. $user_name = 'Błędny numer użytkownika';
  16. } else { // pobiera nazwę usera i przekazuje ją do siteTitle
  17. $user_name = $result[0]['nick']; 
  18. }
  19. ?>
Sabistik
Nie wiem co Ci zwraca $db->set_query($sql); ale widzę że jakąś tablicę. To przy braku usera tablica będzie pusta i w zależności od tego ustalasz odpowiedni title.
soon
efekt końcowy

user_profile.php
  1. <?php
  2. global $smarty;
  3. global $db;
  4. global $page;
  5. $user_id = (int)$_GET['user_id']; //pobiera z adresu ID usera i przekształca na INT
  6.  
  7. $sql = 'SELECT * from tpl_users WHERE id = ' . $user_id . ''; // zapytanie
  8.  
  9. $result = $db->set_query($sql);
  10. $smarty->assign_by_ref('db_result_user', $result);
  11.  
  12. if ($result == 0) { // gdy równa się 0 zmienia title na error
  13. $user_name = 'Błędny numer użytkownika';
  14. } else { // pobiera nazwę usera i przekazuje ją do siteTitle
  15. $user_name = $result[0]['nick']; 
  16. }
  17. ?>


user_profile.tpl
  1. <?php
  2. <div id="left">
  3. {section name=id loop=$db_result_user}
  4. <div id="section">{$db_result_user[id].nick}{$section_title}</div>
  5.  
  6. <div>
  7. <p>Nazwa u&#380;ytkownika: <b>{$db_result_user[id].nick}</b></p>
  8. <p>Imi&#281;: <b>{$db_result_user[id].user_name}</b></p>
  9. </div>
  10. {sectionelse}
  11. <div id="section">Nie znaleziono u&#380;ytkownika o podanym ID.</div>
  12. {/section}
  13. </div>
  14. ?>


select_page.php
  1. <?php
  2. function user_profile() 
  3. {
  4. global $smarty;
  5. global $page;
  6.  
  7. require_once('files/user_profile.php');
  8.  
  9. $smarty->assign('siteTitle', $user_name.' - profil użytkownika');
  10. $smarty->assign('section_title', ' - profil użytkownika');
  11. $smarty->assign('section_subtitle', 'profil użytkownika');
  12.  
  13. $page = 'user_profile.tpl';
  14. }
  15. ?>


Może komuś się przyda. Jak dalej ktoś widzi jakieś błędy to proszę pisać.

Sabistik masz u mnie piwo. Dzięki.
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.