Autor Zpráva
Gildiss
Profil *
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
Napiš zde dotaz, který zadáváš do databáze. Btw posíláš určitě data v kódování windows-1250?
Gildiss
Profil *
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
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 *
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
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 *
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 *
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.
Toto téma je uzamčeno. Odpověď nelze zaslat.