Autor Zpráva
fatality
Profil *
mam formulář
<form action="edit.php" method="post">
heslo: <input type="text" name="heslo" />
icq: <input type="text" name="icq" />
email: <input type="text" name="email" />
<input type="submit" />

který odkazuje na

<?php
include "db.php";
$sql=mysql_query("update autori set heslo = '".$_POST['heslo']."', icq = '".$_POST['icq']."', email = '".$_POST['email']."' where id_autora = '".$_GET['id']."'") or die (mysql_error());

echo "Záznam byl přidán";

?>

příkaz se vykoná v pohodě, ale neupraví to záznamy v tabulce, neví někdo co mam špatně?
fuckin
Profil *
jak se muze prikaz vykonat v pohode kdyz to udela kulovy? :D...co takhle vypsat tu db chybu?
Tomasds
Profil
where id_autora = '".$_GET['id']."'"


proč ty apostrofy?
Existuje v tabulce autorů ID, podle kterého chceš updatovat?
Tomasds
Profil
fuckin
"vykonat v pohodě" zahrnuje i "neudělat nic". Což je zřejmě tento případ, vzhledem k tomu, že fatality o žádné chybě nepíše.
fatality
Profil *
no právě, napíše se Záznam byl přidán, ale do tabulky se nepřidá :-( no jasný, mam tam id 1,2,3,...a já si chci vybrat vlastně podle vstupu na stránku (blabla.php?id=1)

když bych odstranil apostrofy, tak mam syntax error
Tomasds
Profil
fatality
Nepřidá?? update = změnit, insert = přidat.
fatality
Profil *
dobře, nezmění :-)
fatality
Profil *
tak co? neví někdo co s tim? :-( jediný co mi napadá je, že špatně vkládam to id
Joker
Profil
fatality
První věc, když nefunguje dotaz do databáze, nechat si vypsat ten dotaz.

$sql = (tady sestavím SQL dotaz)
echo ($sql); // jen pro ladění, abych viděl, co se sestavilo. Pak to zase smažu
mysql_query($sql);

Druhá věc, v tom skriptu je pár hrubých bezpečnostních chyb.
- Vstup od uživatele nesmí nikdy jít přímo do databáze nebo na výstup. Tzn. uvnitř mysql_query se nikdy nesmí objevit $_POST, $_GET a podobně.
Příklad: Udělám si formulář s polem "heslo" a hodnotou "heslo", který pak metodou POST odešlu na: *adresa toho skriptu výše*?id=1'+or+1=1--. Tím se všem autorům nastaví heslo "heslo" a pak už se přihlásím na koho budu chtít.

- Jaktože se ukládá přímo heslo, které zadá uživatel?! Do uživatelova hesla nikomu nic není, takže by nikde nemělo být uložené v podobě, ze které se to heslo dá vyčíst. Od toho máme hashovací funkce.
fatality
Profil *
j, já to ještě nemam doladěný, ve finále to bude i jinak než takle, teď to chci jenom zprovoznit, pak se kouknu jak hashovat :-D

takže jak to mam udělat? když sestavim dotaz, tak tam budu mít 2x zbytečně mysql_query, ne?
Joker
Profil
fatality
j, já to ještě nemam doladěný, ve finále to bude i jinak než takle, teď to chci jenom zprovoznit, pak se kouknu jak hashovat :-D
Jo, to známe :-) A pak "už to nemá cenu předělávat, když to funguje"... ;-)
Navíc se tím možná dalo vyhnout i těm chybám.

Příklad:
$id = intval($_GET["id"]);
if($id == 0) die("Neplatné ID!");
$heslo = md5($_POST["heslo"]); // alespoň MD5
$icq = intval($_POST["icq"]);
if($icq == 0) $icq = "";
$email = mysql_real_escape_string($_POST["email"]);
$sql = "update autori set heslo = '$heslo', icq = '$icq', email = '$email' where id_autora = $id";
mysql_query($sql) or die(mysql_error());

takže jak to mam udělat? když sestavim dotaz, tak tam budu mít 2x zbytečně mysql_query, ne?
Proč? Dotaz se sestaví do proměnné a ta se pak pošle do mysql_query (a při ladění předtím -nebo potom v případě chyby- třeba vypíše)
fatality
Profil *
nn, neboj předělávat to budu, já to mam jako projekt do školy, tak to musí bejt nějak zabezpečený ;-) a tim md5 to se musí zašifrovaný zadat a pak se přihlašuju normálně? takže když to zadam do db tak to bude vypadat třeba f1v254d1f5 a při přihlašování to bude ahoj?
Alphard
Profil
při přihlašovaní opět zahashujete a porovnáte to f1v25d1f5
fatality
Profil *
Joker - takle mi to vyhodí pokaždý neplatné id :-(
fatality
Profil *
tak co s tim?
fatality
Profil *
ok, už sem to vyřešil :-)

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: