Autor Zpráva
bicebs
Profil
Robím to podľa php série na linuxsofte a nevie kde som spravil chybu všetko okrem potvrdenia registrácie ide dobre ale keď kliknem na odkaz v maili na potvrdenie registrácie tak mi tam načíta registračný formulár. Registračný skript je novysubor1.php a skript na potvrdenie je registraciadokoncena.php. Obidva sú uložené iba tak v public_html. Je to chyba? Odkaz na registračný formulár http://velkybicebs.php5.sk/novysubor1.php
registračný skript
      <?php
  function JeEmail ($cislo)
  {
    return ereg("^.+@.+\..+$",$cislo);
  }

  function emailvdb ($email, $link)
  {
    $vysledek=mysql_query("select * from uzivatelia where email='".$email."'", $link);
    return (boolean) mysql_num_rows($vysledek);
  }  

  function prezivkavdb ($prezivka, $link)
  {
    $vysledek=mysql_query("select * from uzivatelia where prezivka='".$prezivka."'", $link);
    return (boolean) mysql_num_rows($vysledek);
  }  
  // tělo skriptu - nejprve si vytvoříme odkaz na databázi
  $link=mysql_connect("localhost:3306", "skvelkybicebs", "******")or die("Nelze se připojit k MySQL: " . mysql_error());
  mysql_select_db("skvelkybicebs",$link)or die("Nelze vybrat databázi: ". mysql_error());
  mysql_query("SET NAMES 'utf8'");
  
  $BudemeZobrazovat=true;
  if (!empty($_POST)) // už se odeslalo
  {
    /*
    budeme kontrolovat následující věci:
    1) e-mailovou adresu
    2) zda tam již e-mail není
    3) zda tam již přezdívka není
    4) zda je přezdívka mezi 3 a 50 znaky délky
    5) zda je heslo 3 až 50 znaků dlouhé
    */
    if (!JeEmail($_POST["email"])) echo "Není zadán platný e-mail";
    elseif (emailvdb($_POST["email"], $link)) echo "Uvedený e-mail je již registrován";
    elseif (prezivkavdb ($_POST["prezivka"], $link)) echo "Uvedená přezdívka je již registrována";
    elseif ((strlen ($_POST["prezivka"])>50) | strlen ($_POST["prezivka"])<3)echo "Přezdívka musí mít 3-50 znaků";
    elseif ((strlen ($_POST["heslo"])>50) | strlen ($_POST["heslo"])<3) echo "Heslo musí mít 3-50 znaků";
    else
    {
      // kontolou jsme prošli
      $BudemeZobrazovat=false;
      // poděkujeme uživateli
      echo "Děkujeme za registraci. Na vaši adresu ".$_POST["email"]." byly zaslány informace pro její dokončení.";
      // uložíme to do databáze
      mysql_query ("insert into uzivatelia (email, prezivka, heslo) values ('".$_POST["email"]."', '".$_POST["prezivka"]."', '".$_POST["heslo"]."');", $link);
      $lastid=mysql_insert_id();
      // a sestavíme e-mail s instrukcemi, jak registraci dokončí
     $path="http://" . $_SERVER["SERVER_NAME"] . ":" . $_SERVER["SERVER_PORT"] . $_SERVER["SCRIPT_NAME"] . "?clanok=registraciadokoncena&amp;id=" . $lastid . "&amp;email=" . $_POST["email"];
      $telo = "Dekujeme Vam za registraci na nasem portale [nazev hudebniho portalu]. Pro dokonceni ".
      "registrace klepnete na nasledujici odkaz\n".
      "<a href=\"$path\">$path</a>\n".
      "Pokud jste se na nasem portale nechteli zaregistrovat, povazujte tento e-mail za bezpredmetny.\n".
      "Vas [nazev hudebniho portalu] team.";
      $hlavicky="From: ".$_POST["email"]."\nReturn-Path:".$_POST["email"];
      @mail($_POST["email"], "Registrace na portalu", $telo, $hlavicky, "-f ".$_POST["email"]);
    }
  }
if ($BudemeZobrazovat):?>
  <form method="post" action="novysubor1.php">
  <table>
    <tr>
      <td>Přezdívka:</td>
      <td><input name="prezivka" value="<?echo $_POST["prezivka"]?>"></td>
    </tr>
    <tr>
      <td>E-mail:</td>
      <td><input name="email" value="<?echo $_POST["email"]?>"></td>
    </tr>
    <tr>
      <td>Heslo:</td>
      <td><input name="heslo" type = "password" value="<?echo $_POST["heslo"]?>"></td>
    </tr>
    <tr>
      <td colspan="2"><input type="Submit" name="odesli" value="Zaregistrovat"></td>
    </tr>
  </table>
  </form>
<?endif;?>
skript na potvrdenie registrácie

  <?php
  $link=mysql_connect("localhost:3306", "skvelkybicebs", "*****");
  mysql_select_db("skvelkybicebs");
  mysql_query("SET NAMES 'utf8'");
  mysql_query("update uzivatelia set registraciadokoncena=1 where id=".$_GET["id"]." and email='".$_GET["email"]."';");
  echo "Vaše registrace byla dokončena."
?>
.
Fisir
Profil
Reaguji na bicebse:
Vyhvězdičkuj hesla v kódu, bude to pro tebe lepší.
bicebs
Profil
Ďakujem.
Davex
Profil
bicebs:
Asi bys měl na řádku 49 sestavit nějaký použitelný odkaz na potvrzující skript a ne na skript s formulářem.

Teď je ten řádek rozbitý vinou této diskuse, takže příště piš do kódu za řetězec "http://" mezery okolo teček.

$path = "http://" . $_SERVER["SERVER_NAME"] . ":" . $_SERVER["SERVER_PORT"]
      . "/potvrzujici-skript.php" 
      . "?clanok=registraciadokoncena&amp;id=" . $lastid
      . "&amp;email=" . $_POST["email"];
bicebs
Profil
Už som to prepísal tak ako to mám v svojom skripte to predtým bola nejaká chyba.
Amunak
Profil
A nepoužívej mysql_* funkce, jsou zastaralé. Zkus mysqli_query (a k tomu příbuzné funkce), využij nějaký databázový framework/knihovnu nebo můžeš použít PDO.
bicebs
Profil
Ja to robím podľa linuxsoftu http://www.linuxsoft.cz/article.php?id_article=538.
aDAm
Profil
Je to sice pěkné že to děláš podle linuxsoftu, ve své podstatě je to ok, ale všimni si data vydání článku 24.11.2004 15:00 takže se učíš u pomalu 10 let starého tutorialu, takže za tu dobu se toho poměrně dost změnilo.
juriad
Profil
bicebs:
Přestože je ten seriál kvalitní, své nejlepší dny má již za sebou; za nedlouho oslaví desáté narozeniny.
Ten skript trpí mnoha chybami:
1) funkce ereg a mysql_ jsou deprecated
2) nijak se neřeší problém SQL Injection, ať už útok nebo obyčejná přezdívka obsahující apostrofy
3) zjišťovat počet záznamů v databázi pomocí mysql_num_rows je blbost; zbytečně se přenáší záznamy všech uživatelů, jen aby se spočítal jejich počet
4) konstrukce or die() je na produkci nesmyslná, je vhodná (a i tehdy je to na pováženou) při vývoji
5) funkce email a prezdivka v db neřeší atomicitu; co kdyby se v jednu milisekundu zaregistrovali dva shodně pojmenovaní uživatelé (PHP negarantuje, že skript doběhne dříve než se začne provádět druhý)
6) nejsou pořádně definované databázové constraints (souvisí s 5)
7) operátor | není or, takový jaký bys chtěl; chceš použít ||
8) pojmenování souborů je mizerné
9) nepůjde ti poslat mail s diakritikou
10) nijak neřešíš přesměrování po registraci (stačí aby uživatel stisknul F5 a dostane se na registrační stránku s chybou, že je již registrován)

Původní problém spočívá v chybě na řádku 49. Tam se totiž skládá ten odkaz; konkrétně se tam používá $_SERVER["SCRIPT_NAME"], což vede na aktuální skript s registrací, nikoli s potvrzením. Řešení ti již řekl [#4] Davex.
bicebs
Profil
Ak to už nie je aktuálne tak je tento tutorial dobrý? http://www.koding.cz/index.php?type=PHP
Poznáte nejaký aktuálny v češtine alebo slovenčine?
bicebs
Profil
Spravil som to tak ako to tam písali ale stále mi to nepotvrdí registráciu aj keď mi vypíše text "Vaše registrace byla dokončena.".
juriad
Profil
Tak si zkus vypast jaký dotaz se ve skuečnosti provádí:
echo "update uzivatelia set registraciadokoncena=1 where id=".$_GET["id"]." and email='".$_GET["email"]."';";
Nejspíš uvidíš, že některá proměnná neobsahuje data, jaká očekáváš.
bicebs
Profil
juriad:
Keď som tam pridal tvoj príkaz tak mi napíše toto:update uzivatelia set registraciadokoncena=1 where id= and email='';Vaše registrace byla dokončena.
juriad
Profil
Takže evidentně v skript nedistane parametry id a email. Zkontroluj, že odkaz v mailu tyto parametry obsahuje.
bicebs
Profil
Sú tam.
Taps
Profil
bicebs:
V odkaze, který zasíláš na email nahraď entitu &amp; za &. Po této upravě se mi již zobrazit sql dotaz korektně
$path = "http://" . $_SERVER["SERVER_NAME"] . ":" . $_SERVER["SERVER_PORT"]
      . "/potvrzujici-skript.php" 
      . "?clanok=registraciadokoncena&id=" . $lastid
      . "&email=" . $_POST["email"];
bicebs
Profil
Taps:
Ešte som nič nezmenil a niekto sa mi tu zaregistroval ale má potvrdenú registráciu. Teraz keď som to zmenil ako si mi poradil tak to ide aj mne. Ďakujem.
Taps
Profil
bicebs:
Ta registrace je moje :-) Ručně jsem entity změnil v URL adrese
bicebs
Profil
Ja som sa zľakol či to nie je nejaký program, hacker alebo chyba skriptu. :)
Taps
Profil
bicebs:
skript doporučuji ošetřit proti SQL injection
Jan Tvrdík
Profil
Taps:
Chybí ti tam urlencode.
bicebs
Profil
Ja viem zatiaľ robím iba základy.


Posledná otázka : Mám pokračovať alebo začať s týmto tutorialom http://www.koding.cz/index.php?type=PHP
ak nie tak aký iný?

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: