Autor Zpráva
libormasek
Profil
Ahoj mám problém s regostarcí php a msql databáze
tady je můj registrační formulář vše je dobře ale když to vložím na endoru,tak se my neukládají registrovaní uživatele co stím?A co mám špatně?
Děkuji za pomoc

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="cs" lang="cs">
    <head>
      <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
      <title>Registrace</title>
    </head> 
    <body>
    <?php
      $kontrola_odeslani =  $_POST["tlacitko"];
      if($kontrola_odeslani){
        $nick = $_POST["nick"];
        $heslo = $_POST["heslo"];
        $potvrd_heslo = $_POST["potvrd_heslo"];
        $email = $_POST["email"];
        if($heslo == $potvrd_heslo){
          if($nick AND $email){
            $heslo = md5(md5($heslo));
            mysql_connect("localhost", "root", "");
            mysql_select_db("databaze");
            $ip = $_SERVER["REMOTE_ADDR"];
            $zapis = mysql_query("INSERT INTO uzivatele SET nick='$nick', heslo='$heslo', email='$email', ip='$ip', opravneni='1' ;");
            echo "Registrace proběhla v pořádku.";  
          } else {
            echo "Nezadal jsi nick nebo email.";
          }
        } else {
          echo "Hesla nejsou shodná!";
        }
      }
    ?>

      <p>
      <form action="<?php $PHP_SELF; ?>" method="POST">
        <table>
          <tr><td>Nick: </td><td><input type="text" name="nick" /></td></tr>
          <tr><td>Heslo: </td><td><input type="password" name="heslo" /></td></tr>
          <tr><td>Potvrď Heslo: </td><td><input type="password" name="potvrd_heslo" /></td></tr>
          <tr><td>E-mail: </td><td><input type="text" name="email" /></td></tr>
          <tr><td><input type="submit" name="tlacitko" value="Registrovat" /></td></tr>
          </table>
      </form>  
      </p>
    </body>
    </html>
Meris
Profil *
Ahoj,
co ti to vypisuje za chybu?
libormasek
Profil
No jde o to že když to testuju tak my to napíše registrace proběhla v pořádku...Ale broblém je v tom že se my to neukládá do databáze tabulky krerou jsem vytvořil
maks
Profil
libormasek:
- vyhoď na 21. ř. přebytečný středník
- vypiš si, co do té DB posíláš, jestli je v proměnných to, co má být
- vypiš si mysql_error()
libormasek
Profil
středníkem to není..Když ho vymažu tak my zmizne celá tabulka registrace
Tori
Profil
libormasek:
1. maks myslel ten středník uvnitř SQL dotazu. Je tam spíš zbytečný, chybu AFAIK nezpůsobí.
Mezi řádky 21 a 22 musíte ověřit, jestli dotaz proběhl v pořádku (tj. jestli proměnná $zapis není FALSE). V případě chyby zjistíte její popis zmíněnou funkcí mysql_error (viz též FAQ)
2. Data, která vkládáte do databáze musíte escapovat. Jinak stačí napsat do formuláře apostrof a SQL dotaz vám selže se syntaktickou chybou.
$sql = "INSERT INTO uzivatele SET nick='" . mysql_real_escape_string($nick) ."', heslo='" . mysql_real_escape_string($heslo) . "', email='" . mysql_real_escape_string($email) . "', ip='" . mysql_real_escape_string($ip) . "', opravneni=1";
$zapis = mysql_query($sql);
libormasek
Profil
Tady je můj email.


Klikacka.eu@seznam.cz

tak my napište a já vám pošlu odkaz mě to prostě nejde nevím co dělám špatně
Tori
Profil
libormasek:
A máte správně nastavené připojení k databázi? Předpokládám, že na Endoře by neměl být uživatel "root".
edit: Taky by možná pomohlo zapnout si zobrazování všech chyb: Nejčastější potíže s PHP (FAQ) » Zapnutí výpisu všech chyb a varování
libormasek
Profil
Ne chybu to neháže..Chyba je jen s připojením a uložením do databáze


 mysql_connect("localhost", "root", "");
            mysql_select_db("databaze");
            $ip = $_SERVER["REMOTE_ADDR"];
            $zapis = mysql_query("INSERT INTO uzivatele

tady má být v těch řádcích ale nevím co a kam dám ..
Enko
Profil
Uprav si kód na ukládání do DB třeba takto:
            if(mysql_query($sql_dotaz)){
              //update probehl v poradku
            }
            else{
              echo "MySQL chyba " . mysql_errno() . " - " . mysql_error() . "<br>";
            }
Dále doplním, že hashovat heslo v MD5 a bez saltu je dnes skoro stejné, jako ukládat ho v plain textu. A několikanásobným hashováním nezvýšíš bezpečnost hesla. Na hashování hesel jsou speciálně navržené funkce, třeba bcrypt. Více viz zde http://www.michalspacek.cz/prednasky/zahashovat-heslo-ulozit-profit-develcz
Dej vědět, jestli to to po mé úpravě, vrátí nějakou chybu.
libormasek
Profil
Enko:


Pěkné video děkuji moc co právě začínám,a chci si vytvořit takoví malí cheat.. s registrací .

A začínám tvořit takže nejsem profík...Za každou radu jsem rád
Enko
Profil
Ještě doplním k mému kusu kódu, že toto je jen pro vývojové prostředí a testování. Na ostré aplikaci samozřejmě nikdy nevypisuj chyby z běhového prostředí jako jsou i ty dvě z MySQL, ale místo toho tyto chyby někde zachytávej (například včetně celého SQL dotazu, který selhal)a pravidelně kontroluj, zda vše funguje jak má a uživateli při selhání uložení oznam nějakou hlášku, že se uložení nezdařilo. Radši se 8x zeptej než něco blbě udělej :-) Potřebuješ ještě s něčím helfnout?
libormasek
Profil
Enko:

Ahoj
Zatím ne.Musím přít na tu chybu,proč se my to pořád neukládá do databáze.

Začnu z nova..Jinak děkuji
Enko
Profil
Super přístup! :-)
Trošku jsem ti to opravil a zakomentoval, abys vedel co a proc. Zabralo mi to pár minut a neoveroval jsem to, ale snad jsem nic neprehlidnul. Tak na to mrkni a dej vědět.
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="cs" lang="cs">
    <head>
      <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
      <title>Registrace</title>
    </head> 
    <body>
    <?php

/** Vygenerování náhodného řetězce
* @param int délka vráceného řetězce
* @param int použité znaky: <=10 číslice, <=36 +malá písmena, <=62 +velká písmena
* @return string náhodný řetězec
* @copyright Jakub Vrána, http://php.vrana.cz/
*/
function rand_chars($count = 8, $chars = 36) {
    $return = "";
    for ($i=0; $i < $count; $i++) {
        $rand = rand(0, $chars - 1);
        $return .= chr($rand + ($rand < 10 ? ord('0') : ($rand < 36 ? ord('a') - 10 : ord('A') - 36)));
    }
    return $return;
}

//byla odeslana POST data, lepsi nez to tvoje, protoze kontrolovat existenci $_POST pole nemusi vzdy fungovat      
if($_SERVER["REQUEST_METHOD"] == "POST"){
  //kontrola vstupu, nasbirame chyby, pokud jsou
  if(empty($_POST["nick"])){$chyba[] = "<p class=\"error\"> Vyplň nick.</p>";}
  if(empty($_POST["heslo"])){$chyba[] = "<p class=\"error\"> Vyplň heslo.</p>";}
  if(empty($_POST["potvrd_heslo"])){$chyba[] = "<p class=\"error\"> Vyplň \"Potvrd heslo\".</p>";}
  if($_POST["heslo"] != $_POST["potvrd_heslo"]) {$chyba[] = "<p class=\"error\"> Zadana hesla se neshoduji.</p>";}
  if(!filter_var($_POST["email"], FILTER_VALIDATE_EMAIL)){$chyba[] = "<p class=\"error\">Pole \"Email\" není platný email.</p>";}

  //overime, jestli mame chyby ze vstupu, pokud ano, vypiseme je
  if(is_array($chyba)){
    foreach($chyba as $value){
      echo $value;
    }
  }
  //vse OK, jdeme zpracovat
  else{ 
    //pripojeni k databazi
    $spojeni = mysql_connect("localhost","user","password");

    if(!$spojeni){
      echo "Nepodařilo se připojit k databázi.<br>";
    }
    else{
      mysql_select_db("databaze"); //vybereme databazi
      mysql_query("set names 'cp1250'");  //nastaveni kodovani databaze
    }

    //osetreni vstupu do databaze proti SQL Injection
    $nick = mysql_real_escape_string($_POST["nick"]);
    $heslo = mysql_real_escape_string($_POST["heslo"]);
    $potvrd_heslo = mysql_real_escape_string($_POST["potvrd_heslo"]);
    $email = mysql_real_escape_string($_POST["email"]);
    $ip = mysql_real_escape_string($_SERVER["REMOTE_ADDR"]);
    $salt = rand_chars(); //vygenerovani nahodneho retezce jako soli
    $hash_heslo = hash_hmac('sha512',$heslo , $salt); //zahashujeme heslo, muzes si zvolit i jiny pomaly hashovaci algoritmus
    
    //zde by bylo vhodne zjistovat, zda uzivatel s touto emailovou adresou jiz neexistuje
    
    //vytvoris si SQL dotaz na databazi
    $sql = 'INSERT INTO uzivatele
            (`nick`, `heslo`, `salt`, `email`, `ip`)
            VALUES
            (\''.$nick.'\', \''.$hash_heslo.'\', \''.$salt.'\', \''.$email.'\', \''.$ip.'\')';

    if(mysql_query($sql)){
      //Vse ulozeno, presmerujeme na stranku, ze je registrace OK
      header("Location: http://www.web.cz/registrace.php?registrovano=ok", true, 303);
      exit;    
    }
    else{
      //nepodarilo ze ulozit data
      echo "Nepodarilo se ulozit do DB. MySQL chyba " . mysql_errno() . " - " . mysql_error() . "<br>";//jen pro vyvojove prostredi, na ostry web jen hlasku, ze se to nezdarilo
    }
  }    
}
?>

      <p>
      <form action="" method="POST"> <!-- pokud posilas formular sam na sebe, hodnota v action muze byt prazdna, pokud chces neco psat, musis osetrovat v htmlspecialchars() jako obrana proti XSS -->
        <table>
          <tr><td>Nick: </td><td><input type="text" name="nick" maxlength="50" size="30" value="<?php echo htmlspecialchars($_POST["nick"]);?>" /></td></tr> <!-- veskere vstupy uzivatele na stranku osetruj pres htmlspecialchars, jako obranu pred XSS -->
          <tr><td>Heslo: </td><td><input type="password" name="heslo" maxlength="50" size="30" /></td></tr>  <!-- z bezpecnostich duvodu nevypisujeme znovu heslo-->
          <tr><td>Potvrď Heslo: </td><td><input type="password" name="potvrd_heslo" maxlength="50" size="30" /></td></tr> <!-- z bezpecnostich duvodu nevypisujeme znovu heslo-->
          <tr><td>E-mail: </td><td><input type="text" name="email" maxlength="50" size="30" value="<?php if(isset($_POST["email"])){echo htmlspecialchars($_POST["email"]);} else{echo "@";}?>" /></td></tr>
          <tr><td><input type="submit" name="tlacitko" value="Registrovat" /></td></tr>
          </table>
      </form>  
      </p>
    </body>
    </html>
libormasek
Profil
Enko:


Na endoře to píše chybu po odeslání registrace

Nepodařilo se připojit k databázi.
Nepodarilo se ulozit do DB. MySQL chyba 1045 - Access denied for user 'root'@'srv93.endora.cz' (using password: NO)
Enko
Profil
Takže chyba je jasná. V tomto řádku je něco špatně:
mysql_connect("localhost","user","password");
Doplň si tam adresu serveru, pokud to není localhost, správný login a heslo do MySQL. A dej vědět.
libormasek
Profil
Nejde my to ať dělám co dělám prostě my to nejde..


Už vážně nevím
libormasek
Profil
Enko:


už to funguje ...Hurá :)
Měl jsem chybu ve mysql_select_db("domazlice"); místo domazlice tam bylo uzivatele


trochu skoumání a člověk na to příde když to nezdá
libormasek
Profil
Prosím o radu

Mám účet na endoře a nefunguje my ukládání registrace do databáze..Někde mám chybu a nevím kde

mysql_connect("localhost", "sql9.endora.cz","nick", "heslo");
mysql_select_db("test");
$zapis = mysql_query("INSERT INTO phpmyadmin SET nick='$nick
Petr_
Profil *
Asi proto, že máte špatně parametry v připojení k DB. Správně to má být asi:
mysql_connect("sql9.endora.cz","nick", "heslo"); (Tipuji, neznám reálné hodnoty, ale je nutné dodržet jejich pořadí a význam.)
Ale to už zmiňoval [#16] Enko dříve.

Opravdu máte v databázi nazvané test tabulku s názvem phpmyadmin?
Tori
Profil
libormasek:
Někde mám chybu a nevím kde
Posílala jsem vám odkaz do FAQ, následujte ho.
libormasek
Profil
Petr:


Ne zatím to vše testu aby to spránvně fungovalo...Důležeté je aby to šlo napřed ukládat

Pak to všechno změním...

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: