| Autor | Zpráva | ||
|---|---|---|---|
| Gildiss Profil * |
#1 · Zasláno: 17. 3. 2007, 12:06:36
Udělal (nebo spíše opsal jsem z PHP učebnice) skript a propojil ho s databází. Klasika - jméno, heslo, atd. Bohužel mi to stále píše: Data too long for column 'heslo'. Na zahraničních webech jsem se dočetl, že to snad má co dělat s kódováním. Databáze vypadá takto:
CREATE TABLE `uzivatele` ( `id_uzivatele` mediumint(8) unsigned NOT NULL auto_increment, `uziv_jmeno` varchar(20) collate cp1250_czech_cs NOT NULL, `jmeno` varchar(15) collate cp1250_czech_cs NOT NULL, `prijmeni` varchar(30) collate cp1250_czech_cs NOT NULL, `email` varchar(40) collate cp1250_czech_cs default NULL, `heslo` varchar(20) collate cp1250_czech_cs NOT NULL, `datum_registrace` datetime NOT NULL, PRIMARY KEY (`id_uzivatele`), UNIQUE KEY `uziv_jmeno` (`uziv_jmeno`), KEY `jmeno` (`jmeno`), KEY `prijmeni` (`prijmeni`), KEY `heslo` (`heslo`) ) ENGINE=MyISAM DEFAULT CHARSET=cp1250 COLLATE=cp1250_czech_cs; V my.ini v MySQL adresáři mám mimo jiné toto: [mysql] default-character-set=cp1250 # SERVER SECTION # ---------------------------------------------------------------------- # # The following options will be read by the MySQL Server. Make sure that # you have installed the server correctly (see above) so it reads this # file. # [mysqld] Počítač jsem zrestartoval, stále to hlásí to samé. Ať už zadávám do hesla krátké číslovky, dlouhé číslovky, jediné písmenko nebo písmen deset.. Už opravdu nevím, co mám dělat. Nemá s tím někdo nějaké zkušenosti nebo neví někdo kde je chyba? Budu vděčný za jakékoliv rady.. OS: Win XP Prof SP2 PHP 5 MySQL 5 Apache 2.2.3 |
||
| ronnie Profil |
#2 · Zasláno: 17. 3. 2007, 12:20:21
Napiš zde dotaz, který zadáváš do databáze. Btw posíláš určitě data v kódování windows-1250?
|
||
| Gildiss Profil * |
#3 · Zasláno: 17. 3. 2007, 12:31:21
Tady je komplet kód..
<?php # Výpis kódu 6.6 - registruj.php // Nastavte titul stránky a zahrňte záhlaví HTML. $titul_stranky = 'Registrace!'; include ('head.inc'); if (isset($_POST['odeslat'])) { // Zpracovat formulář. $zpráva = NULL; // Vytvořte novou prázdnou proměnnou. // Ověřit jméno. if (empty($_POST['jmeno'])) { $jm = FALSE; $zpráva .= '<p>Zapomněli jste zadat jméno!</p>'; } else { $jm = $_POST['jmeno']; } // Ověřit přijmení. if (empty($_POST['prijmeni'])) { $pr = FALSE; $zpráva .= '<p>Zapomněli jste zadat příjmení!</p>'; } else { $pr = $_POST['prijmeni']; } // Ověřit adresu elektronické pošty. if (empty($_POST['email'])) { $e = FALSE; $zpráva .= '<p>Zapomněli jste zadat adresu elektronické pošty!</p>'; } else { $e = $_POST['email']; } // Ověřit uživatelské jméno. if (empty($_POST['uziv_jmeno'])) { $u = FALSE; $zpráva .= '<p>Zapomněli jste zadat uživatelské jméno!</p>'; } else { $u = $_POST['uziv_jmeno']; } // Ověřit heslo a porovnat je s potvrzením hesla. if (empty($_POST['heslo1'])) { $h = FALSE; $zpráva .= '<p>Nebylo zadáno heslo!</p>'; } else { if ($_POST['heslo1'] == $_POST['heslo2']) { $h = $_POST['heslo1']; } else { $h = FALSE; $zpráva .= '<p>Vaše heslo nesouhlasí! Zadejte je znovu.</p>'; } } if ($jm && $pr && $e && $u && $h) { // Pokud je vše v pořádku. // Registrovat uživatele v databázi. require_once ('../mysql_spojit.php'); // Připojit se k databázi // Vytvořit dotaz $dotaz = "INSERT INTO uzivatele (uziv_jmeno, jmeno, prijmeni, email, heslo, datum_registrace) VALUES ('$u', '$jm', '$pr', '$e', PASSWORD('$h'), NOW())"; $výsledek = mysql_query ($dotaz); // Spustit dotaz if ($výsledek) { // Je-li vše OK. // Můžete uživateli odeslat e-mail. echo '<p><b>Registrace proběhla úspěšně!</b></p>'; include ('sablony/pata.inc'); // Zahrnout patu. exit(); // Ukončení skriptu } else { // Něco se nepovedlo. $zpráva .= '<p>Registrace byla přerušena kvůli systémové chybě. Omlouváme se.</p><p>'. mysql_error(). '</p>'; } mysql_close(); // Ukončit připojení k databázi. } else { $zpráva .= '<p>Zkuste to prosím znovu.</p>'; } } // Konec zpracování formuláře. // Zobrazit zprávu (pokud něco obsahuje). if (isset($zpráva)) { echo '<font color="red">', $zpráva, '</font>'; } ?> <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post"> <fieldset><legend>Zadejte příslušné údaje do následujícího formuláře:</legend> <p><b>Jméno:</b> <input type="text" name="jmeno" size="20" maxlength="40" value="<?php if (isset($_POST['jmeno'])) echo $_POST['jmeno']; ?>"/></p> <p><b>Příjmení:</b> <input type="text" name="prijmeni" size="30" maxlength="40" value="<?php if (isset($_POST['prijmeni'])) echo $_POST['prijmeni']; ?>"/></p> <p><b>El. adresa:</b> <input type="text" name="email" size="40" maxlength="60" value="<?php if (isset($_POST['email'])) echo $_POST['email']; ?>" /> </p> <p><b>Uživatelské jméno:</b> <input type="text" name="uziv_jmeno" size="20" maxlength="40" value="<?php if (isset($_POST['uziv_jmeno'])) echo $_POST['uziv_jmeno']; ?>" /></p> <p><b>Heslo:</b> <input type="password" name="heslo1" size="20" maxlength="20" /></p> <p><b>Potvrďte heslo:</b> <input type="password" name="heslo2" size="20" maxlength="20" /></p> </fieldset> <div align="center"><input type="submit" name="odeslat" value="Odeslat informace" /></div> </form><!-- Konec formuláře --> <?php include ('pata.inc'); // Zahrnout patu ?> |
||
| ronnie Profil |
#4 · Zasláno: 17. 3. 2007, 12:37:45
Funkce PASSWORD() vrací řetězec, který je delší než 20 znaků, které jsi specifikoval v definici tabulky, tzn. že buď musíš změnit řádek heslo na 41 znaků, nebo ošetřit heslo fukcí SUBSTRING při vkládání do databáze tak, že ho zkrátíš na 20 znaků.
|
||
| Kajman_ Profil * |
#5 · Zasláno: 17. 3. 2007, 12:38:34
Funkce password je v novějších verzích upravená a výsledek se asi už nevejde do varcharu20.
Zvěčte si sloupeček heslo a máte po starostech. http://dev.mysql.com/doc/refman/5.0/en/encryption-functions.html#funct ion_password |
||
| Joker Profil |
#6 · Zasláno: 17. 3. 2007, 12:40:01 · Upravil/a: Joker
Problém je ve funkci PASSWORD:
INSERT INTO uzivatele (uziv_jmeno, jmeno, prijmeni, email, heslo, datum_registrace) VALUES ('$u', '$jm', '$pr', '$e', PASSWORD('$h'), NOW()) Viz http://dev.mysql.com/doc/refman/5.0/en/encryption-functions.html#func t ion_password Za prvé: Note: The PASSWORD() function is used by the authentication system in MySQL Server; you should not use it in your own applications. For that purpose, consider MD5() or SHA1() instead. Tzn.: "Funkci PASSWORD() byste neměli používat ve svých aplikacích" Za druhé: Funkce PASSWORD vrací víc než 20 znaků, takže se data logicky do sloupce nevejdou. edit: Nebyl jsem dost rychlý, no :-) To mám z toho, že píšu tak dlouhé odpovědi :-) |
||
| Gildiss Profil * |
#7 · Zasláno: 17. 3. 2007, 14:42:19
Díky mov všem, upravil jsem nastavení sloupce heslo na varchar (42) a vše funguje jak má. To takhle platí vždy? Podle Kajmana bych neměl pouřít funkci password(), co tedy mám používat? MD5() a SHA1()?
|
||
| Kajman_ Profil * |
#8 · Zasláno: 18. 3. 2007, 10:49:23
Pokud by jste měl aplikaci, kde už budou mít lidé uložené hesla přes password a potom přejdete na novou verzi s jinou variantou této funkce, tak se už nikdo nepřihlásí. Proto doporučují md5 nebo sha1 nebo obě najednou.
|
||
|
Časová prodleva: 19 let
|
|||
Toto téma je uzamčeno. Odpověď nelze zaslat.
0