Dość długo zastanawiałem się, gdzie umieścić ten post, bo problem dotyczy jednej z kilku spraw: PHP, MySQL, HTML, przeglądarki FireFox.

Mój problem jest dość nietypowy i pierwszy raz odkąd bawię się php/mysql spotkałem się z czymś takim. Wiem, że tworząc stronę, trzeba zwracać uwagę na przeglądarkę w jakiej będzie ona otwierana, dlatego testuje strony pod 4 najpopularniejszymi - Opera (podstawowa), Firefox (dodatkowo), Chrome (dodatkowo), Internet Explorer (dodatkowo), ale tym razem spotkałem się z problemem, który pojawia się tylko i wyłącznie na przeglądarkach Firefox, w różnych wersjach.

Tworzę prosty skrypt dopisujący osoby do bazy danych subskrypcji. Jako, że jest to promocyjna akcja, co któryś użytkownik, który się dopisała wygrywa kupon rabatowy.
W skrócie skrypt wygląda tak:
1. Sprawdzenie czy został podany adres email
- TAK - przeniesienie na stronę 'error_msg'
- NIE - przeniesienie na stronę właściwą dopisywania
2. Sprawdzenie czy podany adres e-mail już istnieje
- TAK - wyświetlenie informacji o tym, że istnieje
- NIE - dalsza część skryptu
3. Dopisanie adresu do bazy i pobranie unikanego ID
4. Sprawdzenie czy ID jest podzielne przez X (określa czy jest np co dwudziestą osobą)
- TAK - wyświetlenie kodu promocyjnego, wysłanie maila z informacjami i kodem
- NIE - wyświetlenie informacji o dopisaniu do subskrypcji, wysłanie maila z informacjami

Proste, prawda?
Jednak nie. Tworząc i sprawdzając, wszystko u mnie działało. Przesłałem więc link do strony do osoby, której to robię i okazało się, że coś nawala. Trudno jest sprawdzać, gdy w przeglądarce widzi się, że wszystko działa, ale zacząłem przeklejać linijkę po linijce i doprowadziłem do tego stanu, że na localhoscie u mnie w FF też pojawił się ten błąd.
Błąd polegał na tym, że za każdym razem pojawiała się informacja o tym, że adres email już istnieje w bazie danych, chociaż dane dodawały się do bazy.
Na innym z for (forum Firefoxa) jeden z użytkowników stwierdził, że najprawdopodobniej jest to wina dwukrotnego otwarcia strony/przeładowania się jej. Dlaczego tak się dzieje, nie mam pojęcia.
Gdy u mnie pojawił się błąd, zacząłem kombinować z kodem okazało się, że u mnie rozwiązaniem było zmiana znaczników <?php ?> na <script language="php"></script>, ale nie u właściciela.

Poniżej umieszczam kod strony, może wasze świeże spojrzenie na problem rozwiąże go, bo ja już naprawdę nie mam pomysłów:
index.php
  1. <?php
  2. if(!isset($_REQUEST['email']))
  3. {
  4. header ('LOCATION: error_msg.html');
  5. }
  6. else
  7. {
  8. $mail = $_REQUEST['email'];
  9. ?>
  10. <html>
  11. <head>
  12. <meta http-equiv="refresh" content="0;url=index2.php?email=<?php echo $_REQUEST['email']; ?>" >
  13. </head>
  14. <body></body>
  15. </html>
  16. <?php
  17. }
  18. ?>


index2.php
  1. <?php
  2. $q = 5;
  3. $date_now = date("Y-m-d");
  4. $ip = getenv('REMOTE_ADDR');
  5.  
  6. $host = 'host';
  7. $db_user = 'user';
  8. $db_password = 'password';
  9. $database = 'db';
  10.  
  11. $email_get_clear = $_REQUEST['email'];
  12. $email_get = str_replace("@","(at)",$email_get_clear);
  13.  
  14. // łączenie z bazą
  15. $link = @mysql_connect($host, $db_user, $db_password) or die('Brak połaczenia z serwerem MySQL');
  16. $db = @mysql_select_db($database, $link) or die('Nie mogę połaczyć się z baza; danych');
  17. mysql_query("SET NAMES 'latin2'");
  18.  
  19.  
  20.  
  21. // sprawdzanie adresu email
  22. $uchwyt = mysql_query("SELECT * FROM tabela WHERE email = '$email_get'") or die('błąd');
  23. $row = mysql_num_rows($uchwyt);
  24.  
  25. if($row == 0)
  26. {
  27. $last_id = mysql_result(mysql_query("SELECT MAX(id) FROM tabela"),0);
  28. $next_id = $last_id + 1;
  29.  
  30. if($next_id%$q == 0)
  31. {
  32. include("gen.php");
  33. $msg = "Gratulacje<br>Jesteś $next_id osobą, która dopisała się do newslettera.<br />
  34. Kupon o numerze <span style=\"color: #ce181f\"><strong>$promo</strong></span> jest Twój.";
  35. $user_status = 1;
  36. //include("func_msw.php");
  37.  
  38.  
  39. }
  40. else
  41. {
  42. $numer=0;
  43. $msg = "Adres $email_get został pomyślnie dodany.<br>
  44. Dziękujemy.";
  45. $user_status = 0;
  46. //include("func_msn.php");
  47.  
  48. }
  49. $email_add = mysql_query("INSERT INTO tabela VALUES ('', '$email_get', '$date_now', '$numer', '$ip', $user_status)") or die('Nie można dodać rekordu');
  50. }
  51. else
  52. {
  53. $msg = "Adres już istnieje";
  54. }
  55.  
  56. ?>
  57. <html>
  58. <head>
  59. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  60. <title>Subskrybuj newsletter</title>
  61. </head>
  62. <body>
  63. <div class="tekst">
  64. <?php echo $msg; ?>
  65. </div>
  66. <br /><br />
  67. <div class="bottom">Jesteś <strong><?php echo $next_id; ?></strong> osobą odwiedzającą tę stronę.</div>
  68. </body>
  69. </html>


gen.php
  1. <?php
  2. $numer = md5 (uniqid (rand()));
  3. $promo = strtoupper(substr($numer,1,12));


Strona wywalała błąd na 2 przeglądarkach w wersji 3.0.X i 3.6.1. 3.0.X ma zainstalowane Adblock oraz Forcastfox
Skrypt działał na wersjach 3.1.X oraz 3.6.1