Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] czy inicjowanie zmiennej na wartość false jest konieczne?
Forum PHP.pl > Forum > Przedszkole
boy76
Przykładowy kod z książki:
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  2. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  3. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  5. <title>Zrób ze mnie Elvisa - Wysyłanie wiadomości</title>
  6. <link rel="stylesheet" type="text/css" href="style.css" />
  7. </head>
  8. <img src="blankface.jpg" width="161" height="350" alt="" style="float:right" />
  9. <img name="elvislogo" src="elvislogo.gif" width="300" height="32" border="0" alt="Zrób ze mnie Elvisa" />
  10. <p><strong>Prywatne:</strong> Do WYŁĄCZNEGO użytku Edwarda<br />
  11. Napisz i wyślij wiadomość do osób z listy mailingowej.</p>

  1. <?php
  2. if (isset($_POST['submit'])) {
  3. $from = 'edward@zrobzemnieelvisa.com';
  4. $subject = $_POST['subject'];
  5. $text = $_POST['elvismail'];
  6.  
  7. $output_form = false; // CZY TO JEST KONIECZNE?
  8.  
  9. if (empty($subject) && empty($text)) {
  10. // Wiadomo, że pola $subject i $text są puste.
  11. echo 'Nie podałeś tematu i treści wiadomości.<br />';
  12. $output_form = true;
  13. }
  14.  
  15. if (empty($subject) && (!empty($text))) {
  16. echo 'Nie podałeś tematu wiadomości.<br />';
  17. $output_form = true;
  18. }
  19.  
  20. if ((!empty($subject)) && empty($text)) {
  21. echo 'Nie podałeś treści wiadomości.<br />';
  22. $output_form = true;
  23. }
  24. }
  25. else {
  26. $output_form = true;
  27. }
  28.  
  29. if ((!empty($subject)) && (!empty($text))) {
  30. $dbc = mysqli_connect('data.zrobzemnieelvisa.com', 'edward', 'theking', 'elvis_store')
  31. or die('Brak połączenia z serwerem MySQL.');
  32.  
  33. $query = "SELECT * FROM email_list";
  34. $result = mysqli_query($dbc, $query)
  35. or die('Błąd w zapytaniu do bazy danych.');
  36.  
  37. while ($row = mysqli_fetch_array($result)){
  38. $to = $row['email'];
  39. $first_name = $row['first_name'];
  40. $last_name = $row['last_name'];
  41. $msg = "Drogi $first_name $last_name,\n$text";
  42. mail($to, $subject, $msg, 'From:' . $from);
  43. echo 'Wysłano e-mail pod adres ' . $to . '<br />';
  44. }
  45.  
  46. mysqli_close($dbc);
  47. }
  48.  
  49. if ($output_form) {
  50. ?>

  1. <form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
  2. <label for="subject">Temat wiadomości:</label><br />
  3. <input id="subject" name="subject" type="text" value="<?php echo $subject; ?>" size="30" /><br />
  4. <label for="elvismail">Treść wiadomości:</label><br />
  5. <textarea id="elvismail" name="elvismail" rows="8" cols="40"><?php echo $text; ?></textarea><br />
  6. <input type="submit" name="submit" value="Wyślij" />
  7. </form>

  1. <?php
  2. }
  3. ?>

  1. </body>
  2. </html>


$output_form = false; - czy inicjowanie zmiennej na wartość na false jest konieczne?

bez tego działa tak samo. Bez $output_form = false; to prawidłowy kod? Jeśli nie, to czemu?
bleblok
Teoretycznie będzie działać. W praktyce zresztą pewnie też, ale przy bardziej skomplikowanych skryptach możesz się na tym mocno przejechać.

Bezpieczniej jest definiować zmienne, chociażby ze względu na to, że niektóre serwery przepisują od razu wartość z linka do zmiennych (decyduje o tym register_globals w konfiguracji). Wywołanie skryptu http://serwer/skrypt.php?output_form=1 spowodowałoby wtedy zarejestrowanie zmiennej $output_form z wartością odczytywaną jako true i mimo podania wszystkich pól skrypt i tak wykonałby
  1. if ($output_form) {
.

W tym przypadku może akurat to nie jest groźne, ale gdybyś np. pisał skrypt do logowania to miałoby to krytyczne znaczenie.

Pewnie się przekonasz, że w niektorych przypadkach opłaca się też definiować array() przed jego wypełnianiem (mimo tego, że można nie definiować), szczególnie przy wykorzystywaniu go później w jakichś funkcjach przyjmuących za parametr tylko tablice.
boy76
Nic nie zrozumiałem co użytkownik napisał powyżej sad.gif Byłbym wdzięczny za bardziej konretne wytłumaczenie
wolacinio
return false czyli kończy wykonywanie pracy w np. warunku lub blokuje ewentualne przechodzenie.
Jest to konieczne w niektórych wypadkach ;]
skarabe.pl
Cytat(boy76 @ 11.08.2010, 17:32:07 ) *
Nic nie zrozumiałem co użytkownik napisał powyżej sad.gif Byłbym wdzięczny za bardziej konretne wytłumaczenie

Po prostu zawsze inicjuj swoje zmienne. Czy naprawdę musisz wiedzieć dlaczego? Zwłaszcza, że nie zrozumiałeś i nie spróbowałeś zrozumieć wyjaśnienia?
nospor
W tym kodzie, jesli nie dasz $output_form = false; i nigdzie po drodze nie wystąpią warunku ze bedziesz miał $output_form = true;
to dostaniesz błąd NOTICE. Pewnie go nie widzisz bo masz wyłączone jego wyświetlanie.

Tak więc dobra rada:
WŁĄCZ wyświetlanie wszystkich błędów i pisz poprawnie tak, by te błędy się nie wyswietlały. Tu masz napisane jak to włączyc
Temat: Jak poprawnie zada pytanie
boy76
Po dodaniu
error_reporting(E_ALL);
ini_set('display_errors','1');

i usunięciu $output_form = false;

nie widzę żadnych komunikatów z błędami
nospor
A powinienes mieć, kod ewidentnie na to wskazuje smile.gif
Może coś źle dodałes

ps: blad powinien wystąpic gdy pojawi sie tekst
"Wysłano e-mail pod adres"
Wowczas zachodzą warunki na pojawienie się tego bledu winksmiley.jpg
boy76
Cały kod wygląda tak i nie ma komunikatu z błędami

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  2. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  3. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  5. <title>Zrób ze mnie Elvisa - Wysyłanie wiadomości</title>
  6. <link rel="stylesheet" type="text/css" href="style.css" />
  7. </head>
  8. <img src="blankface.jpg" width="161" height="350" alt="" style="float:right" />
  9. <img name="elvislogo" src="elvislogo.gif" width="300" height="32" border="0" alt="Zrób ze mnie Elvisa" />
  10. <p><strong>Prywatne:</strong> Do WYŁĄCZNEGO użytku Edwarda<br />
  11. Napisz i wyślij wiadomość do osób z listy mailingowej.</p>

  1. <?php
  2. ini_set('display_errors','1');
  3.  
  4. if (isset($_POST['submit'])) {
  5. $from = 'edward@zrobzemnieelvisa.com';
  6. $subject = $_POST['subject'];
  7. $text = $_POST['elvismail'];
  8.  
  9. if (empty($subject) && empty($text)) {
  10. // Wiadomo, że pola $subject i $text są puste.
  11. echo 'Nie podałeś tematu i treści wiadomości.<br />';
  12. $output_form = true;
  13. }
  14.  
  15. if (empty($subject) && (!empty($text))) {
  16. echo 'Nie podałeś tematu wiadomości.<br />';
  17. $output_form = true;
  18. }
  19.  
  20. if ((!empty($subject)) && empty($text)) {
  21. echo 'Nie podałeś treści wiadomości.<br />';
  22. $output_form = true;
  23. }
  24. }
  25. else {
  26. $output_form = true;
  27. }
  28.  
  29. if ((!empty($subject)) && (!empty($text))) {
  30. $dbc = mysqli_connect('data.zrobzemnieelvisa.com', 'edward', 'theking', 'elvis_store')
  31. or die('Brak połączenia z serwerem MySQL.');
  32.  
  33. $query = "SELECT * FROM email_list";
  34. $result = mysqli_query($dbc, $query)
  35. or die('Błąd w zapytaniu do bazy danych.');
  36.  
  37. while ($row = mysqli_fetch_array($result)){
  38. $to = $row['email'];
  39. $first_name = $row['first_name'];
  40. $last_name = $row['last_name'];
  41. $msg = "Drogi $first_name $last_name,\n$text";
  42. mail($to, $subject, $msg, 'From:' . $from);
  43. echo 'Wysłano e-mail pod adres ' . $to . '<br />';
  44. }
  45.  
  46. mysqli_close($dbc);
  47. }
  48.  
  49. if ($output_form) {
  50. ?>

  1. <form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
  2. <label for="subject">Temat wiadomości:</label><br />
  3. <input id="subject" name="subject" type="text" size="30" /><br />
  4. <label for="elvismail">Treść wiadomości:</label><br />
  5. <textarea id="elvismail" name="elvismail" rows="8" cols="40"></textarea><br />
  6. <input type="submit" name="submit" value="Wyślij" />
  7. </form>

  1. <?php
  2. }
  3. ?>

  1. </body>
  2. </html>



Tak, pojawia się komunikat z błędem po wyświetlaniu tekstu:
"Wysłano e-mail pod adres"

Ugh, ale początki z nauką php są ciężkie sad.gif
nospor
Cytat
Tak, pojawia się komunikat z błędem po wyświetlaniu tekstu:
"Wysłano e-mail pod adres"

smile.gif
I już wiesz czemu masz ją inicjalizować.
boy76
Chcę się upewnić, czy dobrze zrozumiałem działanie kodu...

Po naciśnięciu przycisku Wyślij (po wpisaniu tematu i treści wiadomości) - czyli został spełniony warunek if ((!empty($subject)) && (!empty($text))) i pojawia się tekst "Wysłano e-mail pod adres". Skrypt nie wie czy ma wyświetlić formularz, dlatego wtedy trzeba ustawić $output_form = false; tak?
nospor
Cytat
, dlatego wtedy trzeba ustawić $output_form = false; tak?
Nie. na FALSE masz ustawić dlatego, by domyslnie ta zmienna miała jakąś wartość. Jesli jej nie ustawisz to odwolanie do $output_form też da ci false, ale jednoczesnie dostaniesz też NOTICE. A pisanie skryptów, że generują one błedy NOTICE jest delikatnie rzecz mówiąc "nieładnie" winksmiley.jpg
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.