Autor | Zpráva | ||
---|---|---|---|
Petr_pam2 Profil * |
#1 · Zasláno: 14. 2. 2012, 23:03:08
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.";} 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 ..."); Případně ještě doplnit: if($sql) { echo "Upraveno"; }else { echo "Chyba"; } |
||
Sir Tom Profil |
#3 · Zasláno: 14. 2. 2012, 23:13:17
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 * |
#4 · Zasláno: 14. 2. 2012, 23:13:39 · Upravil/a: Petr_pam2
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 |
#5 · Zasláno: 14. 2. 2012, 23:34:58
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 |
#6 · Zasláno: 15. 2. 2012, 07:34:37
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 * |
#7 · Zasláno: 15. 2. 2012, 09:29:20
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>"; } }} |
||
LosFilipos Profil |
#8 · Zasláno: 15. 2. 2012, 09:42:19
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>"; } 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 * |
#9 · Zasláno: 15. 2. 2012, 09:46:29
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 |
#10 · Zasláno: 15. 2. 2012, 09:50:54
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 * |
#11 · Zasláno: 15. 2. 2012, 09:55:37
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 * |
#13 · Zasláno: 15. 2. 2012, 10:13:13
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 |
#14 · Zasláno: 15. 2. 2012, 10:19:04
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 * |
#15 · Zasláno: 15. 2. 2012, 10:47:31
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"; <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 |
#16 · Zasláno: 15. 2. 2012, 10:52:32
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 * |
#17 · Zasláno: 15. 2. 2012, 12:17:35
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 |
#18 · Zasláno: 15. 2. 2012, 14:21:00
Petr_pam2:
„se mi zobrazí pouze jedno slovo“ Pravděpodobně chybí uvozovky/apostrofy okolo hodnoty ve value. |
||
Petr_pam2 Profil * |
#19 · Zasláno: 15. 2. 2012, 14:57:55
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>..."; |
||
Časová prodleva: 12 let
|
0