Autor Zpráva
toca
Profil *
Dobrý den, v objednávkovém formuláři bych rád přidával výrobky a po odeslání uložil v databázi. Už na první pohled se mi nezdálo, aby data byla viditelná v url, proto jsem se pokoušel nastudovat něco o sessions. Bohužel mi to nedalo se podívat i na nějaké příklady z praxe a nakonec jsem použil už hotový košík od Vrány a napsal podle něho kód, který by měl ukládat a zobrazovat výrobky a jakmile stisknu odeslat, uložit všechny objednané výrobky do databáze. Bohužel mě to nefunguje a nic se nestane. Pokud byste znali nějaké jiné řešení bez session pouze s databází, budu moc rád také za takové rady.

<?
session_start();
If(isset($_POST["pridat"]))
{
$_SESSION["kosik"][intval($_GET["p_typ_id"])] = intval($_GET["produkt_ks"]);
}
?>

   
<?
if ($_SESSION["kosik"]) 
{
$result = mysql_query("SELECT p_typ_id, p_typ_nazevvystup FROM produkt_typ WHERE p_typ_id IN ('" . implode("', '", array_keys($_SESSION["kosik"])) . "')");
while ($row = mysql_fetch_assoc($result)) 
{
echo '<tr><td>'.htmlspecialchars($row["p_typ_nazevvystup"]) . ' (' . $_SESSION["kosik"][$row["p_typ_id"]] . ')</td></tr>';
}
mysql_free_result($result);
}
?> 
<form method="post" action="objednavka-prijata-new.php">
<?
echo '<select name="produkt_typ">';
$vysledek_p_typ= mysql_query("
SELECT 
p_typ_id, p_typ_nazevvystup, p_typ_druh,
p_druh_id,  p_druh_nazev
FROM produkt_typ 
LEFT JOIN produkt_druh ON p_typ_druh = p_druh_id
ORDER BY p_druh_nazev, p_typ_nazevvystup");
while ($radek_p_typ = mysql_fetch_array($vysledek_p_typ, MYSQL_ASSOC))
{
$p_typ_id = $radek_p_typ['p_typ_id'];
$p_typ_nazevvystup = $radek_p_typ['p_typ_nazevvystup'];
$p_druh_nazev = $radek_p_typ['p_druh_nazev'];
echo '<option value="'.$p_typ_id.'">'.$p_druh_nazev.' '.$p_typ_nazevvystup.'</option>';
}
echo '</select>';
?>

<input type="text" name="produkt_ks" size="5" value="<?echo $_POST["produkt_ks"]?>">

<input type="Submit" name="pridat" value="Přidat výrobek">
</form>
Crusher
Profil
To co ty tady mas je pouze cast skriptu, ktera resi ukladani zmen do session. Na prvni letmy pohled nevidim nic proc by to nefungovalo.
Neni tu ale nikde SQL, ktery by to ulozil do DB. Takze pokud ti "nefunguje" ukladani do DB, tak protoze tam zadne takove neni.
toca
Profil *
Ten kód by měl přidávat produkty a zobrazovat jejich seznam, to ale nedělá.
Radas
Profil *
mě tady zaraži tady toto že se zde michaji GET a POST dohromady z jednoho formulaře?

If(isset($_POST["pridat"]))
{
$_SESSION["kosik"][intval($_GET["p_typ_id"])] = intval($_GET["produkt_ks"]);
}

proč počet kusu produktu je z GET?
Crusher
Profil
No jo, Radas ma pravdu (pro oci nevidim).
Formular se odesila pres metodu post a tudiz v $_GET nejsou vubec zadne hodnoty.
Nakopl me Radas a tady je to, co bys mel opravit, aby to fungovalo:
if (isset($_POST["pridat"])) { 
  $_SESSION["kosik"][intval($_POST["p_typ_id"])] = intval($_POST["produkt_ks"]); 
}
toca
Profil *
Radas, Crusher Děkuji za postřehy, udělal jsem tam při zkoušení pár chyb, nefunguje to ale ani s POSTem. Měl jsem tam ještě jeden formulář a podmínku pro odeslání údajů do databáze, ten jsem z toho vysekal a taky nic, takže uvažuju že už to může být opravdu nějaká blbost nebo SESSION. Posílám ještě jednou aktuální kód, pokud by se na to rád někdo podíval.

<?php
session_start();
session_register("kosik");

If(isset($_POST["pridat"]))
{
$_SESSION["kosik"][intval($_POST["p_typ_id"])] = intval($_POST["produkt_ks"]);
}
?>


<table class="tabulka-formular" border="0">
<tr><th>Název výrobku</th><th>Kusů</th><th>Akce</th></tr>
   
<?
//echo '<tr><td>id: '.$_POST["p_typ_id"].'</td></tr>';
if ($_SESSION["kosik"]) 
{
//echo '<tr><td>id: '.$p_typ_id.'</td></tr>';
$result = mysql_query("SELECT p_typ_id, p_typ_nazevvystup FROM produkt_typ WHERE p_typ_id IN ('" . implode("', '", array_keys($_SESSION["kosik"])) . "')");
while ($row = mysql_fetch_assoc($result)) 
{
echo '<tr><td>'.htmlspecialchars($row["p_typ_nazevvystup"]) . ' (' . $_SESSION["kosik"][$row["p_typ_id"]] . ')</td></tr>';
}
mysql_free_result($result);
}
?> 
<tr>
<td>
<form method="post" action="objednavka-prijata-new-temp.php">
<?
// výpis záznamů z tabulky produktů
echo '<select name="produkt_typ" style="width: 400px;">';
$vysledek_p_typ= mysql_query("
SELECT 
p_typ_id, p_typ_nazevvystup, p_typ_druh,
p_druh_id,  p_druh_nazev
FROM produkt_typ 
LEFT JOIN produkt_druh ON p_typ_druh = p_druh_id
ORDER BY p_druh_nazev, p_typ_nazevvystup");
while ($radek_p_typ = mysql_fetch_array($vysledek_p_typ, MYSQL_ASSOC))
{
$p_typ_id = $radek_p_typ['p_typ_id'];
$p_typ_nazevvystup = $radek_p_typ['p_typ_nazevvystup'];
$p_druh_nazev = $radek_p_typ['p_druh_nazev'];
echo '<option value="'.$p_typ_id.'">'.$p_druh_nazev.' '.$p_typ_nazevvystup.'</option>';
}
echo '</select>';
?>
</td>
<td><input type="text" name="produkt_ks" size="5" value="<?echo $_POST["produkt_ks"]?>"></td>
<td> 
<input type="Submit" name="pridat" value="Přidat výrobek">
</form>
</td>
</tr>
</table>
Radas
Profil *
na jaké verzi PHP se to provozuje?

tohle se už nepoužíva session_register("kosik");
Radas
Profil *
a ještěš by tam mělo byt

$_SESSION["kosik"]=array();
toca
Profil *
Radas: Se serverem ani se začínáním session problém nebyl, zkoušel jsem udělat jednodušší ukládání session a to fungvalo. Nicméně vyřešil jsem to trochu jinak, ale narazil jsem na jiný problém. Pomocí níže uvedeného kódu lze do session přidávat jakékoliv výrobky, nicméně mi je záhadou jak by bylo možné obejít chování, že se mi po znovunačetení stránky (stisk F5) odešlou předešle vybraná data znova:

<?php
// PŘIDÁNÍ PRODUKTŮ
If(isset($_POST["pridat"]))
{
// vyhledáme v databázi druh produktu a název podle id z formuláře
$vysledek_p_typ_pridani= mysql_query("
SELECT 
...
WHERE p_typ_aktivni=1 AND p_typ_id=$_POST[p_typ_id]");
while ($radek_p_typ_pridani = mysql_fetch_array($vysledek_p_typ_pridani, MYSQL_ASSOC))
{
$p_typ_id = $radek_p_typ_pridani['p_typ_id'];
...
}
// definuje proměnnou z pole
$kosik =& $_SESSION['kosik'];
// definuje pole z proměnných
$kosik[] = array( $_POST[p_typ_id], $p_druh_nazev, $p_typ_nazevvystup, $_POST[produkt_ks], $p_typ_nakupcena, $p_provize_hodnota, $mk_kurz, $mk_mnozstvi);
}
?>
<table class="tabulka-formular" border="0">
<form method="post" action="objednavka-prijata-new.php">
<tr><th>Vybrat výrobek</th><th>Počet kusů</th><th>Přidat výrobek</th></tr>
<tr><td>
<?
// výpis záznamů z tabulky produkt_typ
echo '<select name="p_typ_id" style="width: 400px;">';
$vysledek_p_typ= mysql_query("
SELECT 
p_typ_id, p_typ_nazevvystup, p_typ_druh,
p_druh_id,  p_druh_nazev
FROM produkt_typ 
LEFT JOIN produkt_druh ON p_typ_druh = p_druh_id
ORDER BY p_druh_nazev, p_typ_nazevvystup");
while ($radek_p_typ = mysql_fetch_array($vysledek_p_typ, MYSQL_ASSOC))
{
$p_typ_id = $radek_p_typ['p_typ_id'];
$p_typ_nazevvystup = $radek_p_typ['p_typ_nazevvystup'];
$p_druh_nazev = $radek_p_typ['p_druh_nazev'];
echo '<option value="'.$p_typ_id.'">'.$p_druh_nazev.' '.$p_typ_nazevvystup.'</option>';
}
echo '</select>';
?>
</td>
<td>
<input type="text" name="produkt_ks" size="5" value="<?echo $_POST["produkt_ks"]?>">
</td>
<td> 
<input type="Submit" name="pridat" value="Přidat">
</td>
</tr>
</form>
</table>
Radas
Profil *
a nestačilo by přesměrovani


If(isset($_POST["pridat"]))
{
$_SESSION["kosik"][intval($_POST["p_typ_id"])] = intval($_POST["produkt_ks"]);
header('location: vypis_kosiku.ph'); //nebo nekam jinam ...
}
toca
Profil *
Radas:
Díky. Formulář by měl končit na té samé stránce, max. pokud bych udělal stránku kam se jen přesměruje a odkud zase zpátky... Zdá se mi to trochu kostrbaté, ale asi nebudu mít jinou možnost.
Radas
Profil *
však to se může přesměrovat na tu samou stranku, jde spiš o to že už se nebudou posílat POST data..
Crusher
Profil
Sam pouzivam princip "prenacteni" stranky, aby se zabranilo znovuodesilani formulare. V podstate se jedna o jednoduchy kousek kodu.
Po odeslani formulare zpracujes vstupni data. Nasledne podle urcitych pravidel pouze nasmerujes pomoci:
header("Location:kosik.php?vypsat=ano&showMsg=kosikUlozeno");

Muzes prave pouzit jakoukoli adresu (doporucovane je absolutni, ale vim ze i relativni vetsinou funguje bez problemu). Vyhnes se timto opetovnemu odesilani formularovych dat po obnoveni stranky navstevnikem webu. A ziskas tim take kontrolu nad smerovanim scriptu po zpracovani formulare (nekdo pouziva napr stranky, ktere obsahuji informace o provedene akci, ktere lze dal smerovat pomoci html meta tagu pro dalsi smerovani, ja vsak pouzivam zobrazeni "hlasky" primo v generovane strance).

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:

0