Diskuse

Téma: PHP - form

Zdravím,
navazuji na svůj poslední problém, se kterým mi Shira pomohl. Řeším teď jeden problém. Mám databázi informací zvlášť v tabulce sunlight-card (jedná se o databázi zákdoků na www.ocnivady.cz), které provazuji s účtem tím, že do řádku vkládám také _loginid, pro pozdější editaci. Teď k problému. Dejme tomu, že se rageistruje uživatel, přejde na svou kartu zákroků a je problém s tím, že nevím, jak v PHP vytvořit nový řádek, resp. mám tento kód:
<?php
//kontrola jadra
if(!defined('_core')) {
exit;
}

$loginid = _logininid;
if (_loginindicator==1){
$module.= "<h1>Uživatelská karta "._loginpublicname."</h1>";
if (isset($_POST['formular'])) {
$error_log = array();
if (empty($_POST['vada'])) $error_log[] = "Vyplňte typ vady";
if (sizeof($error_log) > 0) {
$module.=_formMessage(2, _eventList($error_log, 'errors'));
}

else {
$vada = _safeStr(_htmlStr($_POST['vada']));
if (mysql_query("UPDATE `"._mysql_prefix."-card` SET vada='".$vada."' WHERE loginid="._loginid)){
$module.=_formMessage(1, "Formulář byl odeslán. Děkujeme.");
}
else{
$module.=_formMessage(3, "Zprávu se nepodařilo odeslat, kontaktujte nás prosím.");
}
}
}
// Nášrt vytváření tabulky
else{
mysql_query("INSERT INTO `" . _mysql_prefix . "-card` VALUES (null,'".$loginid."','')");
}

$module.="
<form action='' method='post' name='formular'>
<input type='text' name='vada' class='inputsmall' maxlength='50' value='"._safeStr($_POST['vada'])."' />
<input type='submit' value='Uložit do databáze' name='formular' />";
}
?>
.

Kód funguje, ale chybně (po refreshi se vkládají nové a nové řádky, editace mi jde). Nevíte jak to upravit, popř. řešit jinak?

Napadlo mě dát sql pro vložení nového řádku při registraci uživatele, ale nechci zasahovat do systému, chtěl bych to mít po jednom.

Snad mi rozumíte, co tím myslím, prostě nevím jak vložit nový řádek s _loginid pouze jednou.

Mám ještě subdotaz. Dá se v SL vytvářet formuláře jednodušeji abych nemusel nevypisovat např.:
</tr><td>Vada</td><td><input type='text' name='vada' class='inputsmall' maxlength='50' value='"._safeStr($_POST['vada'])."' /></td></tr>
ale prohnat to nějakou funkcí?
postZaslat odpověď
Protože vkládáš nový řádek do db při každém načtení stránky a to by se mělo dít až po odeslání formuláře.
A ideálně po zapsání do db ještě přesměrovat aby se nemohlo stát, že dá někdo F5 a data se zapíšou znova.

Myslím, že už hodně formulářů jsem napsal ke kterým máš přístup odkud se to můžeš inspirovat. Pokud ne, tak ti nějaký pošlu.

Co se týká dotazu 2, tak mám prakticky stejnou odpověď. Už jsem tu psal hodně HCM s formulářema, kde jsem si jednoduše nadefinoval pole a z něj pak generoval form.
Protože vkládáš nový řádek do db při každém načtení stránky a to by se mělo dít až po odeslání formuláře.

Ono by se to mělo dít jen jednou, pak už si data uživatel jen edituje. Nějaké kódy od tebe mám, zkusím se v nich pohrabat.
No jenže tímhle řádkem mysql_query("INSERT INTO `" . _mysql_prefix . "-card` VALUES (null,'".$loginid."','')");se to právě děje dokola, leda že by ve sktruktuře tabulky byl sloupec pro _loginid nastaven na unique, to by se pak zapsalo jen jednou, ale zase by mohl 1 uživatel mít jen jeden záznam.
Nevím jestli je záměr mít jeden záznam k jednomu uživateli, ale podle mě jich může mít jeden uživatel víc.
Šel bych na to nějak takhle:<?php

//kontrola jadra
if (!defined('_core')) {
exit;
}

if (_loginindicator == 1) {
$module.= "<h1>Uživatelská karta " . _loginpublicname . "</h1>";

if(isset($_SESSION['msg'])){
$module.=$_SESSION['msg'];
unset($_SESSION['msg']);
}

//výpis záznamů přihlášeného uživatele
$query=mysql_query("SELECT * FROM `" . _mysql_prefix . "-card` WHERE loginid=" . _loginid);
while ($item=mysql_fetch_array($query)) {
$module.=$item['vada']."<br /><a href='index.php?m=card&editid=".$item['id']."'>Upravit záznam</a><hr />";
}

if (isset($_GET['editid'])){
$values=mysql_fetch_array(mysql_query("SELECT * FROM `" . _mysql_prefix . "-card` WHERE loginid=" . _loginid . " AND id=" . $_GET['editid']));
}

if (isset($_POST['formular'])) {
$error_log = array();
if (empty($_POST['vada']))
$error_log[] = "Vyplňte typ vady";
if (sizeof($error_log) > 0) {
$module.=_formMessage(2, _eventList($error_log, 'errors'));
} else {
$values['vada'] = _safeStr(_htmlStr($_POST['vada']));
if (isset($_GET['editid'])){
mysql_query("UPDATE `" . _mysql_prefix . "-card` SET vada='" . $values['vada'] . "' WHERE id=" . $_GET['editid'] . " AND loginid=" . _loginid);
}
else{
mysql_query("INSERT INTO `" . _mysql_prefix . "-card` VALUES (null,'" . $loginid . "','".$values['vada']."')");
}
if (!mysql_error()) {
$module.=define('_tmp_redirect','index.php?m=card');
$_SESSION['msg']=_formMessage(1, "Formulář byl odeslán. Děkujeme.");
} else {
$module.=_formMessage(3, "Zprávu se nepodařilo odeslat, kontaktujte nás prosím.");
}
}
}

$module.="
<form action='' method='post' name='formular'>
<input type='text' name='vada' class='inputsmall' maxlength='50' value='" . _safeStr($values['vada']) . "' />
<input type='submit' value='Uložit do databáze' name='formular' />";
}
?>
Netestováno, neznám přesnou strukturu tabulky card, takže psáno jen tak z hlavy.
Ale takhle by mohl jeden uživatel vložit více záznamů.
Díky, vyzkousím :-). Editaci pres metodu get jsem se chtel vyhnout, kvuli podrvrzeni, ale dal jsi tma seassion, tka to zkusim.

TO byl zamer, aby mel uzivatel pouze jeden zaznam, unique, se nastavuje primo v mysql, ze?
Pokud může mít jen jeden záznam, tak je to ještě jednodušší:<?php

//kontrola jadra
if (!defined('_core')) {
exit;
}

if (_loginindicator == 1) {
$module.= "<h1>Uživatelská karta " . _loginpublicname . "</h1>";

if(isset($_SESSION['msg'])){
$module.=$_SESSION['msg'];
unset($_SESSION['msg']);
}

//výpis záznamů přihlášeného uživatele
$values=mysql_fetch_array(mysql_query("SELECT * FROM `" . _mysql_prefix . "-card` WHERE loginid=" . _loginid));

if (isset($_POST['formular'])) {
$error_log = array();
if (empty($_POST['vada']))
$error_log[] = "Vyplňte typ vady";
if (sizeof($error_log) > 0) {
$module.=_formMessage(2, _eventList($error_log, 'errors'));
} else {
$values['vada'] = _safeStr(_htmlStr($_POST['vada']));
if (intval($_POST['editid'])==1){
mysql_query("UPDATE `" . _mysql_prefix . "-card` SET vada='" . $values['vada'] . "' WHERE loginid=" . _loginid);
}
else{
mysql_query("INSERT INTO `" . _mysql_prefix . "-card` VALUES (null,'" . _loginid . "','".$values['vada']."')");
}
if (!mysql_error()) {
$module.=define('_tmp_redirect','index.php?m=card');
$_SESSION['msg']=_formMessage(1, "Formulář byl odeslán. Děkujeme.");
} else {
$module.=_formMessage(3, "Zprávu se nepodařilo odeslat, kontaktujte nás prosím.");
}
}
}

$module.="
<form action='' method='post' name='formular'>
".($values['id']>0 ? "<input type='hidden' name='editid' value='1' />":"")."
<input type='text' name='vada' class='inputsmall' maxlength='50' value='" . _safeStr($values['vada']) . "' />
<input type='submit' value='Uložit do databáze' name='formular' />";
}
?>

Opět netestováno
Je to doslova a do písmene parádní :-) Díky.
Měl bych ještěš poddotaz, pokud poprvé uživatel vyplní formulář a zapomene na 1 pole, které je povinné, data se z inputů ztratí (protože se value hodnota tahá z DB, ale tam zatím není protože to neprojde podmínkamia nezapíše do DB).

Dalo by se ted yupravit toto:
<input type='text' name='vada' class='inputsmall' maxlength='50' value='" . _safeStr($values['vada']) . "' />pokud tam data nejsou, aby se vypsala hodnota poslaná přes post
<input type='text' name='vada' class='inputsmall' maxlength='50' value='" . _safeStr($_POST['vada']) . "' />?