Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP] czy inicjowanie zmiennej na wartość false jest konieczne?
boy76
post
Post #1





Grupa: Zarejestrowani
Postów: 15
Pomógł: 0
Dołączył: 27.01.2010

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
bleblok
post
Post #2





Grupa: Zarejestrowani
Postów: 18
Pomógł: 6
Dołączył: 15.09.2009

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
boy76
post
Post #3





Grupa: Zarejestrowani
Postów: 15
Pomógł: 0
Dołączył: 27.01.2010

Ostrzeżenie: (0%)
-----


Nic nie zrozumiałem co użytkownik napisał powyżej sad.gif Byłbym wdzięczny za bardziej konretne wytłumaczenie
Go to the top of the page
+Quote Post
wolacinio
post
Post #4





Grupa: Zarejestrowani
Postów: 85
Pomógł: 1
Dołączył: 2.06.2009

Ostrzeżenie: (0%)
-----


return false czyli kończy wykonywanie pracy w np. warunku lub blokuje ewentualne przechodzenie.
Jest to konieczne w niektórych wypadkach ;]

Ten post edytował wolacinio 12.08.2010, 08:43:51
Go to the top of the page
+Quote Post
skarabe.pl
post
Post #5





Grupa: Zarejestrowani
Postów: 142
Pomógł: 49
Dołączył: 29.07.2010

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
nospor
post
Post #6





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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
Powód edycji: [nospor]:


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
boy76
post
Post #7





Grupa: Zarejestrowani
Postów: 15
Pomógł: 0
Dołączył: 27.01.2010

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
nospor
post
Post #8





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
boy76
post
Post #9





Grupa: Zarejestrowani
Postów: 15
Pomógł: 0
Dołączył: 27.01.2010

Ostrzeżenie: (0%)
-----


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

Ten post edytował boy76 13.08.2010, 11:52:39
Go to the top of the page
+Quote Post
nospor
post
Post #10





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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ć.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
boy76
post
Post #11





Grupa: Zarejestrowani
Postów: 15
Pomógł: 0
Dołączył: 27.01.2010

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
nospor
post
Post #12





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.08.2025 - 03:20