Autor Zpráva
Tomáš_
Profil *
Zdravím,

mám dva hostingy (wedos a banán) a php skript, který má sloužit k uložení e-mailové adresy zadané uživatelem do formuláře a jejího uložení do textového souboru, a tyto adresy jsou užívány k hromadnému zasílání novinek na webu. Script není můj, je stažený od někud z webu.
Problém je v tom že, na banánu ten skript normálně funguje, ale když se ho snažím rozjet na wedosu tak to při zadávání mailové adresy vypisuje, že je zadaná v neplatném formátu - neprojde podmínka o správnosti mailu.

Odesílací formulář
<form method="post" action="pridej.php">
<input type="text" name="email"><br>
<input type="submit" value="Odeslat"><br>
<a href="zrusit.htm">zrušit zasílání</a>
</form>


Script, který má sloužit pro přidání adresy (pridej.php)
<?
if (ereg("^.+@.+\\..+$", $mail))
 {
?> 
Váš email byl přidán do databáze.<br>Budete pravidelně informováni o změnách na těchto stránkách.
<br><a href="javascript:history.go(-1)">Zpět</a>
<?

@mail($email,"Přidání emailu do databáze","Váš email byl na Vaše přání přidán do naší databáze.","From: odesilatel@server.cz");

     @$filename="data/emaily.txt";
     @$fp = fopen($filename,"r");
     @$obsah = fread( $fp, filesize( $filename ) );
     @fclose( $fp );

$obsah=$email."\n".$obsah;

     @unlink($filename);
     @$fp = fopen($filename,"w");
     @fwrite( $fp , $obsah);
     @fclose($fp);

 } 
else 
{
?>

Je tedy chyba ve scriptu nebo někde na hostingu?
Mároš
Profil
Neštudoval jsem script, ale vím, že od PHP 5.3 je ereg() DEPRACTED. Zkus to nahradit za preg_match.
Alphard
Profil
Nejčastější potíže s PHP (FAQ) » Nefungují proměnné z formuláře nebo z URL (vypnuté register globals)
Jinak teda dát všude @ je zajímavá technika.

Teď se ještě dívám, že ve formuláři je "email" a v podmínce jen "mail", ale to by nefungovalo nikde, takže to bude asi překlep.
Tomáš_
Profil *
Aha na wedosu je PHP 5.3, to znamená, že tam ereg nefunguje. Zkusil jsem tedy preg_match, ale bez výsledku.

Jinak ten "mail" je překlep :)
panther
Profil
Tomáš:
Zkusil jsem tedy preg_match, ale bez výsledku.
pouze přepsat „ereg“ na „preg“ nestačí. Podívej se do manuálu, jaký je rozdíl mezi těmito dvěma funkcemi.
Majkl578
Profil
Jen bych dodal, že ereg na PHP 5.3 funguje stejně jako v předchozích verzích (ač vyhazuje E_DEPRECATED) a tudíž tady problém nebude. Problém zcela jistě způsobuje spoléhání se na povolené register_globals (řešení odkázal Alphard v [#3]).
Davex
Profil
Tomáš:
Mám jen technickou připomínku. Zkus si představit co se stane, když se po provedení funkce unlink() na 18. řádku bude současně druhý proces skriptu snažit o čtení souboru na 12. a 13. řádku. Když se to takto sejde, tak přijdeš o všechny uložené adresy.

Raději používej přidávání adresy na konec souboru pomocí funkce

file_put_contents($filename, $_POST['email'] . "\n", FILE_APPEND);
Tomáš_
Profil *
místo if (ereg("^.+@.+\\..+$", $mail)) jsem dal if (preg_match("/^[\w-\.]+@([\w-]+\\.)+[a-zA-Z]{2,4}$/", $email))

na wedosu to napíše, že adresa byla přidaná, ale nezapíše se do souboru a ani se neodešle mail. Složka i se souborem mají nastavená práva, takže tam by problém být neměl.
panther
Profil
Tomáš:
na kontrolu e-mailu můžeš místo reguláru použít přímo i funkci filter_var.
Davex
Profil
Tomáš:
nezapíše se do souboru a ani se neodešle mail.
A chybu se nedozvíš, protože máš pomocí zavináče před příkazy vypnuté jejich vypisování.
Tomáš_
Profil *
Nevim, zkusil sem spoustu kombinací všeho a stále to nefunguje, přitom to vždy stačí nahrát na webhosting banán a normálně to běží. Ach jo
Majkl578
Profil
Tomáš:
Odstraň ze scriptu všechny zavináče před funkcemi/proměnnými a zkus to znovu, třeba se dozvíš důvod.
Tomáš_
Profil *
Majkl578:
Díky, oni tomu vadili pouze ty zavináče... :-D, na banánu to přelouskalo, ale na wedosu ne. Dík

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: