Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Dziwaczny błąd w formularzu do wysyłania maili
Forum PHP.pl > Forum > Przedszkole
Gren-landia
Oto prosty formularz kontaktowy:

  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
  2. <html>
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=windows-1250">
  5. <title>CONTACT</title>
  6. <link rel="STYLESHEET" type="text/css" href="style.css">
  7. </head>
  8. <body style="background: white;">
  9. <br>
  10. <center>
  11. <b>CONTACT</b>
  12. </center>
  13. <p align="center">* <i>- Required!!!</i></p><br>
  14.  
  15. <?
  16.  
  17. if(isset($name))
  18. if($name==""){
  19. $errorcolor_1 = "red";
  20. $error = "error";
  21. }
  22. else{
  23. $errorcolor_1 = "black";
  24. }
  25.  
  26. if(isset($comment))
  27. if($comment==""){
  28. $errorcolor_2 = "red";
  29. $error = "error";
  30. }
  31. else{
  32. $errorcolor_2 = "black";
  33. }
  34.  
  35. if(isset($contact))
  36. if($contact==""){
  37. $errorcolor_3 = "red";
  38. $error = "error";
  39. }
  40. else{
  41. $errorcolor_3 = "black";
  42. }
  43.  
  44. if(!$action){
  45. $action = "note";
  46. }
  47.  
  48. if($error=="error"||$action=="note"){
  49. ?>
  50.  
  51. <div align="center">
  52. <form action="send.php" method="post">
  53. <font color="<? echo $errorcolor_1; ?>">Name*</font><br />
  54. <input type="text" name="name" style="width: 250px; height: 17px;" <? if(isset($name)) echo "value='$name'";?> class="note"><br />
  55. <table border="0" cellpadding="0" cellspacing="0" width="150">
  56. <tr>
  57. <td width="30"></td>
  58. <td width="120"><font color="<? echo $errorcolor_3; ?>">Contact Type*</font><br>
  59. <input class="note" type="radio" value="--none--" name="contact" style="border: 0"><font color="#ca0000">--none--</font>
  60. <br><input class="note" type="radio" value="@" name="contact" style="border: 0">e-Mail
  61. <br><input class="note" type="radio" value="http://" name="contact" style="border: 0">URL
  62. </td>
  63. </tr>
  64. </table>
  65. Contact Address<br />
  66. <input type="text" name="address" style="width: 250px; height: 17px;" class="note"><br />
  67. <font color="<? echo $errorcolor_2; ?>">Comment*</font><br />
  68. <textarea name="comment" cols="39" rows="6" class="note"><? if(isset($comment)) echo "value='$comment'";?></textarea><br /><br />
  69. <input type="submit" name="action" value="Send" class="note">
  70. <input type="Hidden" name="action" value="Send" class="note">
  71. <input type="reset" name="action" value="Reset" class="note">
  72. </form>
  73. </div>
  74. </body>
  75. </html>


a to (nie wiem, czy będzie potrzebne) plik wykonawczy send.php:

  1. <? 
  2. $name=$_POST['name']; 
  3. $contact=$_POST['contact'];
  4. $address=$_POST['address']; 
  5. $comment=$_POST['comment'];
  6.  
  7. mail("mail@mail.org", "Contact Form", 
  8. "Name: $name 
  9. Contact: $contact
  10. Address: $address 
  11. Comment: $comment ");
  12. echo "<p><br><center>Thanks.<br><a href='contact.php'>>Go back<</a></center><br></p>"; 
  13. ?>


po zgraniu plików na serwer i próbie wejście na stronę formularza pojawia się błąd:

Parse error: parse error, unexpected $ in gj/contact.php on line 75

A w linii 75 znajduje się jedynie:
Kod
</div>


Jednocześnie po wyrzuceniu z pliku formularza funkcji sprawdzającej wypełnienie danych pól

  1. <?
  2.  
  3. if(isset($name))
  4. if($name==""){
  5. $errorcolor_1 = "red";
  6. $error = "error";
  7. }
  8. else{
  9. $errorcolor_1 = "black";
  10. }
  11.  
  12. if(isset($comment))
  13. if($comment==""){
  14. $errorcolor_2 = "red";
  15. $error = "error";
  16. }
  17. else{
  18. $errorcolor_2 = "black";
  19. }
  20.  
  21. if(isset($contact))
  22. if($contact==""){
  23. $errorcolor_3 = "red";
  24. $error = "error";
  25. }
  26. else{
  27. $errorcolor_3 = "black";
  28. }
  29.  
  30. if(!$action){
  31. $action = "note";
  32. }
  33.  
  34. if($error=="error"||$action=="note"){
  35. ?>


i wywołujących ją poleceń:
  1. <font color="<? echo $errorcolor_1; ?>">
i
  1. <? if(isset($name)) echo "value='$name'";?>
wszystko działa bez zarzutu.

Jaki jest błąd w tej funkcji error? Dodam tylko, że kiedy wrzuci się ją do pliku send.php, formularz pojawia się, ale przy wysyłaniu (niezależnie od wypełnienia lub niewypełnienia pól) pojawia się strona send.php z tym samym błędem, tyle, że linijka błędu wypada na
Kod
?>
...

Może da się uzyskać podobny efekt (tzn. przy niewypełnieniu danych pól wyrazy "Name", "Comment" itp. zmieniają kolor na czerwony) w inny, mniej problematyczny sposób?

Z góry wielkie dzięki za pomoc.
nospor
  1. <?php
  2. if($error=="error"||$action=="note"){
  3. ?>
Nigdzie nie widze bys zamknal ten blok smile.gif
Gren-landia
Co dziwne, w kodzie księgi gości, którą przerobiłam na ten formularz kontaktowy, wygląda to właśnie w ten sposób, i wszystko działa bez zarzutu... Czyli to pojedyncze "{" jest niepotrzebne (skoro nie było po nim niczego w oryginalnym kodzie)? Po jego wyrzuceniu owszem, błąd się już nie pojawia, ale przy niewypełnieniu pól i tak dostaję komunikat "Thanks...". Czy może trzeba coś po tym "{" dopisać? Sorry, ale zupełnie się na tym nie znam, i zmuszona jestem do stosowania metody "prób i błędów"...
Neojawor
"thanks" zawsze Ci się wyświetli, bo tak to napisałaś, zrób to na warunku:
  1. <?php
  2.  
  3. $a = mail("mail@mail.org", "Contact Form", 
  4. "Name: $name 
  5. Contact: $contact
  6. Address: $address 
  7. Comment: $comment ");
  8. if($a)
  9. {echo 'thanks';}
  10. else
  11. echo 'coś nie poszło';
  12.  
  13. ?>

Poza tym proponuję kożystać z
Cytat
<?php ?>
, a nie z
Cytat
<? ?>
- żaden wysiłek, a może Ci kiedyś zaoszczędzić trochę czasu i nerwów
Gren-landia
No tak, ale mnie przede wszystkim zależy na efekcie zmiany koloru nazwy pominiętego pola (jeśli obowiązkowe) na czerwony... Po zastosowaniu proponowanego przez Ciebie kodu i tak wyświetliło się "thanks", teraz to ja już w ogóle niczego nie rozumiem.
Neojawor
1) skoro wyświetliło "thanks" to znaczy, że wysłało maila ( funkcja mail zwróciła TRUE). A co do zmiany koloru, to czy w skrypcie sprawdzającym nie powinnaś na początku skryptu pobrać danych ze zmiennych globalnych:
  1. <?php
  2. $name=$_POST['name']; 
  3. ?>

bo skąd tam by miała być jakakolwiek wartość np. w $name ?
najlepiej wyechuj sobie na początku te zmienne i będziesz widzieć co w nich siedzi.

2) Następna rzecz w tym skrypcie sprawdzaczu, to masz:
  1. <?php
  2. if(!$action){
  3. $action = "note";
  4. }
  5. ?>

a czy gdziekolwiek masz wpisywane coś do tej $action, bo ja nigdzie nie widzę?

3) W send.php zrób tak, żeby najpierw sprawdzało (na if-ie) czy pola obowiązkowe są wypełnione, a dopiero po spełnieniu warunków wywołuj funkcję mail()
nospor
Cytat
W send.php zrób tak, żeby najpierw sprawdzało (na if-ie) czy pola obowiązkowe są wypełnione, a dopiero po spełnieniu warunków wywołuj funkcję mail()
Co racja to racja smile.gif
I to mozna by powiedziec jest częściowo zrobione, bo w skrypcie z formularzem kontaktowym jest zmiana kolorow, gdy jest blad. teraz tylko pytanie, czy plik z formularzem, oraz plik z wyslaniem maila to ten sam plik? Bo jesli nie, to te kolorowanko co masz zrobione nigdy sie nie wykona, gdyz formularz po wyslaniu leci do innego skryptu smile.gif

Powinien leciec do tego samego skryptu, a w przypadku gdy nie bedzie bledów, to powinienes np. zincludowac skrypt z wyslaniem maila i powinno byc ok

bardzo skrocona wersja skryptu z formularzem:
  1. <?php
  2.  
  3. //wczesniejsze operacje co miales
  4.  
  5. if($error=="error" || $action=="note"){
  6. //tutaj wyswietlasz swoj formularz jak do tej pory, z tą roznicą, ze atrybut actio
    n ustawaiasz na niego samego
  7. } else{
  8. //tutaj includujesz se skrypt do maila i wysylasz
  9. }
  10.  
  11. ?>

No i tak jak wspomniano wczesniej. Odwoluj sie do danych z posta poprzez tablicę $_POST

  1. <input type="submit" name="action" value="Send" class="note">
  2. <input type="Hidden" name="action" value="Send" class="note">

A czemu tak? pole hidden jest tu zbedne. pomine fakt ze dla hiddenow nie nadaje sie atrybutu class smile.gif
Gren-landia
Serdeczne dzięki, wszystko działa, aż miło, i kto by w to uwierzył przy mojej zerowej znajomości php biggrin.gif.

Jednak dopiero teraz przyuważyłam jeszcze jeden drobny błąd, tzn. skrypt przy niezaznaczeniu jakiejkolwiek opcji radio "contact" i tak wysyła maila nie podświetlając na czerwono nazwy. Prawdopodobnie brakuje wywołania funkcji error, ale gdzie je wstawić i w jakiej formie w przypadku radio?
nospor
pole radio gdy nie jest zazanczone, to sie nie wysyla wogole. tak wiec ty warunek okreslasz dpiero po zrobieniu isset, to ci tam nigdy nie wejdzie gdy nic nie zaznaczysz.
jesli isset() zwroci ci true, znaczy, że pole radio zostalo zaznaczone i juz nic wiecej nie musisz sprawdzac.

pozatym troche bez sensu masz te warunki. bo najpierw sprawdzasz czy jest index ustawiony a dopiero potem sprawdzasz wypelnienie pola lub nie. powinienes raz sprawdzic czy formularz byl wyslany, a potem juz tylko sprawdzac pola:

  1. <?php
  2.  
  3. if (!empty($_POST)){
  4. //i tutaj juz sprawdzasz konkretne pola. nie musisz juz robic isset. tylko dla rad
    io musisz (ale juz ci to pisalem)
  5. }
  6.  
  7. ?>


ps:
Cytat
wszystko działa, aż miło, i kto by w to uwierzył przy mojej zerowej znajomości php
Przy nas wyjdziesz na ludzi 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.