Autor Zpráva
Petr_pam2
Profil *
Dobrý večer,
mám problém s php kódem a to konkrétně s UPDATE table SET .... Jedná se o následující kód, který mi neaktualizuje obsah tabulky:(
// ULOŽENÍ NOVÝCH ÚDAJŮ DO DATABÁZE    

if(isset($_POST['sent'])){
    $jmeno = $_POST['jmeno'];
    $email = $_POST['email'];
    $heslo = md5($_POST[('heslo')]);
    $id =1;
    
  $sql="UPDATE uzivatele SET jmeno=".$jmeno.", email=".$email.", heslo=".$heslo." WHERE id=".$id."";
echo "Váš účet byl aktualizován.";
    }
    else {echo "Ouha! Něco se posralo.";}
K tomuto kódu patří i formulář:

echo "<form name='' method='post' action='stranka.php'>
            <table border='0' cellspacing='0'>
                  <tr><td>Uživatel:</td><td>".$row['uzivatel']."</td></tr>
                  <tr><td>Jméno:</td><td><input name='jmeno' type='text' value=".$row['jmeno']."></td></tr>
                  <tr><td>email:</td><td><input name='email' type='text' value=".$row['email']."></td></tr>
                  <tr><td>heslo:</td><td><input name='heslo' type='password' value=".md5($row[('heslo')])."></td></tr>
                  <input type='hidden' name='sent' value='' />
                  <input type='submit' value='Odeslat'></table></form>";

Ten si informace bere z totožné tabulky, kterou chci posléze aktualizovat. Bohužel, se neprovede žádná akce ( kromě výpisu že byla aktualizovaná ale hodnoty se nezmění. ) Děkuji za jakékoliv rady.
LosFilipos
Profil
Petr_pam2:
Chybí tam funkce, která UPDATE provede. Proměnná sql je string, který nic nedělá. Musí to být takto:
  $sql = mysql_query("UPDATE ... zbytek ...");
Funkce mysql_query provádí tyto operace s databází (SELECT, INSERT, UPDATE,...) Doporučuji prostudovat manuál.

Případně ještě doplnit:
if($sql) {
echo "Upraveno";
}else {
echo "Chyba";
}
Sir Tom
Profil
Petr_pam2:
Hodnoty ukládané do tabulky s datovým typem řetězec (text, varchar,...) musí být v příkazu uvedeny v uvozovkách nebo v apostrofech.
Petr_pam2
Profil *
LosFilipos:
Bože ja jsem blbec. Omlouvám se, vůbec jsem si nevšiml že jsem to tam nenapsal. To je ostuda :-/


Ještě bych se chtěl zeptat, dá se udělat nějakým způsobem, že chybové hlášení se zobrazí aniž by se zobrazil formulář a potom přidat možnost vrátit se zpět k formuláři? ( Nemám teď namysli rozdělit formulářovou část a část která formulář zpracovává do dvou souborů.) Předem díky
LosFilipos
Profil
Petr_pam2:
Nastav si, kdy se má formulář zobrazit pomocí nějaké proměnné...
třeba:
if($sql) {
echo "Upraveno";
}else {
echo "Chyba <a href='ta samá stránka.php'>Zpět</a>";
$skryt_form = true;
}

if(!isset($skryt_form)) {
echo "Formulář";
}
Tori
Profil
Petr_pam2:
Můžete opravný formulář schovat pomocí JavaScriptu (a stejným způsobem ho i zobrazit) - nebude fungovat malé skupině lidí s vypnutým JS, ale nemusíte řešit nic na straně PHP.
Nebo můžete přidat odkaz/tlačítko "vrátit se na formulář a opravit chyby" - bude fungovat vždy, ale musíte vyřešit přenos dat z této stránky do opravného formuláře, aby uživatel nemusel psát všechno znova (session, nebo skrytý formulář).
Petr_pam2
Profil *
Zkoušel jsem radu od [#5] LosFilipos, ale bohužel nedaří se mi formulář skrýt, Kód jsem upravil do následující podoby:
// ULOŽENÍ NOVÝCH ÚDAJŮ DO DATABÁZE    

if(isset($_POST['sent'])){
    $jmeno = $_POST['jmeno'];
    $email = $_POST['email'];
    $heslo = md5($_POST[('heslo')]);
    $id =1;
    
  $dotaz= mysql_query("UPDATE uzivatele SET jmeno='$jmeno', email='$email', heslo='$heslo' WHERE id='$id'");

if($dotaz) {
    $skyt_form = true;
echo "Upraveno <a href='user_conf.php'>Pokračujte zde</a>";
}else {$skyt_form = true;
echo "Chyba <a href='user_conf.php'>Pokračujte zde</a>";

}}
...

//     VÝPIS STARŠÍCH ÚDAJŮ
$id=1;
$sql = "SELECT uzivatel,jmeno,email,heslo FROM uzivatele WHERE id=".$id."";
$result=mysql_query($sql);
 
if (mysql_num_rows($result) > 0) {
    while ($row = mysql_fetch_array($result)) {
        
            if(!isset($skryt_form)) {
echo "<form name='' method='post' action='user_conf.php'>
            <table border='0' cellspacing='0'>
                  <tr><td>Uživatel:</td><td>".$row['uzivatel']."</td></tr>
                  <tr><td>Jméno:</td><td><input name='jmeno' type='text' value=".$row['jmeno']."></td></tr>
                  <tr><td>email:</td><td><input name='email' type='text' value=".$row['email']."></td></tr>
                  <tr><td>heslo:</td><td><input name='heslo' type='password' value=".md5($row[('heslo')])."></td></tr>
                  <input type='hidden' name='sent' value='' />
                  <input type='submit' value='Odeslat'></table></form>";
}
            }}
Také ještě bojuju s rozkódováním MD5 hesla v poli <input type="password".. value=".md5($row[('heslo')])."> - heslo se mi pořád vypisuje v MD5 a nepřepíše se. Děkuji za rady.
LosFilipos
Profil
Petr_pam2:
Za A. - máš tam překlep:
if($dotaz) {
    $skryt_form = true;
echo "Upraveno <a href='user_conf.php'>Pokračujte zde</a>";
}else {$skryt_form = true;
echo "Chyba <a href='user_conf.php'>Pokračujte zde</a>";
 
}
Pokud se má formulář skrýt pokaždé, když se odešle, nemusí se tam vytvářet podmínka se $sktryt_form, ale stačí něco ve smyslu:
if($_POST) {
    // zápis do db
    // výpis hlášek
} else {
    // výpis formuláře
}

za B. - pokud je heslo jednou zašifrováno, neexistuje možnost ho rozšifrovat. Funkce md5() pouze šifruje.
Petr_pam2
Profil *
LosFilipos:

Jej nevšiml jsem si překlepu, omlouvám se. B: Takže v případě, že heslo šifruji přes MD5, není možnost toto heslo zpětně vypsat a tudíž neexistuje možnost pro uživatele toto heslo změnit? a nějaké jiné řešení není k dispozici? Napadlo mě vytvořit nějaký vlastní hash, ale efektivnost asi nebude nic moc.
LosFilipos
Profil
Petr_pam2:
není možnost toto heslo zpětně vypsat a tudíž neexistuje možnost pro uživatele toto heslo změnit?
Heslo jde přece změnit i bez toho, aby se někam vypisovalo... Není důvod, heslo někam vypisovat. Podle mě je to dokonce nežádoucí.
Petr_pam2
Profil *
LosFilipos:
Takže bych to měl asi udělat jako?:
<input type="password" name="heslo" value="Neco pod hvezdickama">
// a potom při odesílání nastavit  hash:
$heslo = md5($_POST[('heslo')]);
LosFilipos
Profil
Petr_pam2:
Až na to Neco pod hvezdickama ano. Proč chceš mít vyplněné pole heslo? Když uživatel heslo nevyplní, přepíše se mu v db na Neco pod hvezdickama. Value toho inputu nech prázdnou.

Aby se neukládalo prázdné heslo do db, stačí doplnit podmínka, že pokud se heslo neodešle, db se nebude přepisovat; popřípadě určit povinná pole formuláře, bez kterých se do db nezapíše nic...



(Pokud ti jde o to, co dělá např. Firefox, tedy že si pamatuje přihlašovací údaje, je nutné si uvědomit, že heslo není zašifrované a každý, kdo přijde k tomu počítači, si ho může přečíst.)
Petr_pam2
Profil *
Ne ne pamatování údajů nechci. Chtěl sem si udělat pro uživatele možnost změnit si heslo. Value tedy ponechám prázdné ale teď je otázka, jestli chtít po uživateli aby heslo při změně údajů musel napsat a nebo napsat podmínku když heslo bude prázdné pole heslo se neodešle...
LosFilipos
Profil
Petr_pam2:
Jednoznačně podmínku. Z pohledu uživatele, který si chce změnit jen jeden z údajů, je značně nepohodlné muset vypisovat všechny. Ještě dodám, že pro optimální zabezpečení by měla ve formuláři přibýt položka staré heslo - zabrání změně hesla někomu jinému (když se zapomenu odhlásit) a nové heslo podruhé - ochrana proti překlepům...
Petr_pam2
Profil *
LosFilipos:
Ano kontrolu hesla udělám. a tedy zkusím i staré. Bude tedy kód vypadat nejak takhle?:
if(isset($_POST['sent'])){
    $jmeno = $_POST['jmeno'];
    $email = $_POST['email'];
    $heslo = md5($_POST[('heslo')]);
        $stare_heslo = md5($_POST['heslo']);
    $id =1;
If ( $stare_heslo == $heslo ) {
    
  $dotaz= mysql_query("UPDATE uzivatele SET jmeno='$jmeno', email='$email', heslo='$heslo' WHERE id='$id'");
}
else echo "spatne vyplněné staré heslo";
a kontrola správnosti obou polí bude vlastne
<input type="password" name="heslo" value="" />
<input type="password" name="heslo_opak" value="" />
// POST....//
if ($heslo == $heslo_opak)
{echo "splněno jedeme dál";}
else echo "zadaná hesla se neschodují.";
LosFilipos
Profil
Petr_pam2:
Takže asi takto:
md5(stare_heslo_z_formuláře) musíš porovnat se záznamem v db - jako při přihlašování. Podmínka If ($stare_heslo == $heslo) je tedy nesmyslná. Najdi si radši nějaké hotové řešení na webu...
Petr_pam2
Profil *
aha jasný. A ještě jeden dotaz. Při výpisu dat z databáze do již zmiňovaného inputu se mi zobrazí pouze jedno slovo ( další slova která jsou za mezerou již ne. např. auto jelo nekam -> zobrazi se jen auto ). Nevím čím tato chyba může být, ale v databázi je uložená vždy celá hodnota ale vypíše se jen první slovo.
Tori
Profil
Petr_pam2:
se mi zobrazí pouze jedno slovo
Pravděpodobně chybí uvozovky/apostrofy okolo hodnoty ve value.
Petr_pam2
Profil *
ty tam právě jsou :-/

echo "<form name='' method='post' action='user_conf.php'>
            <table border='0' cellspacing='0'>
                  <tr><td>Uživatel:</td><td>".$row['uzivatel']."</td></tr>
                  <tr><td>Jméno:</td><td><input name='jmeno' type='text' value=".$row['jmeno']."></td></tr>
                  <tr><td>email:</td><td><input name='email' type='text' value=".$row['email']."></td></tr>
                  <tr><td>heslo:</td><td><input name='heslo' type='password' value='password'></td></tr>
                  <input type='hidden' name='sent' value='' />
                  <input type='submit' value='Odeslat'></table></form>";
Tori
Profil
Nejsou.
echo "... <tr><td>Jméno:</td><td><input name='jmeno' type='text' value='".$row['jmeno']."'></td></tr>...";
// anebo
echo "... <tr><td>Jméno:</td><td><input name='jmeno' type='text' value='$row[jmeno]'></td></tr>...";

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: