Autor Zpráva
Kroupa
Profil *
Zdravím. Jsem začátečník a tápu ohledně použití session. Zkouším vymazat "řádek" podle ID, která je uložená jako jedna hodnota v poli samotného. Jde to nějak? Zkoušel jsem to následujícím způsobem, ale mám podezření, že to spíše maže podle nějakého klíče...

<?php
session_start();
If(isset($_POST["smazat"])) {
unset($_SESSION['kosik'][$_POST['sessionid_aktualni']]);
}

foreach( $_SESSION['kosik'] as $data ) 
{
list($_POST[sessionid], $_POST[nazev] ) = array_values( $data );
echo '<form method="post" action="onew.php">';
echo '<input type="hidden" name="sessionid_aktualni" value="'.$_POST[sessionid].'">';
echo '<input type="Submit" name="smazat" value="Smazat">';
echo '</form>';
}


?>
Fisir
Profil
Reaguji na Kroupu:
V konstrukci unset() ti přebývá jedno ].
Tori
Profil
Kroupa:
Přiřazování do POST na ř.9 vypadá trochu divně (a chybí vám tam apostrofy okolo klíčů pole), proč nepoužijete obyčejnou proměnnou? A podle způsobu, jakým to mažete, by to mělo vypadat spíš takhle:
foreach ($_SESSION['kosik'] as $id => $data) 
{
    echo '<form method="post" action="onew.php">';
    echo '<input type="hidden" name="sessionid_aktualni" value="'.$id.'">';
    echo '<input type="Submit" name="smazat" value="Smazat">';
    echo '</form>';
}

Fisir:
Nepřebývá.
Kroupa
Profil *
Zkusil jsem to opravit, ale nic moc to nevyřešilo. Chci přidávat a mazat položky ze session. Mám k tomu dva formuláře "pridat" a "smazat" a proměnné "sessionid_aktulani" a "sessionid_vybrane". Problém je, že mi to při mazání nenačte "sessionid_vybrane" a už vůbec nevymaže správný řádek i když tam správné "sessionid_vybrane" je...

<?php
session_start();
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>

<?php
If(isset($_POST['sessionid_aktulani'])) {$sessionid_aktulani = $_POST['sessionid_aktulani'];} else {$sessionid_aktulani = 1;}
If(isset($_POST['sessionid_vybrane'])) {$sessionid_vybrane = $_POST['sessionid_vybrane'];} else {$sessionid_vybrane = 1;}


If(isset($_POST["pridat"]))
{ 
echo "POST[nazev]: ".$_POST['nazev'].'<br>';
$kosik =& $_SESSION['kosik'];
$sessionid_aktulani = $sessionid_aktulani + 1;
$kosik[] = array($sessionid_aktulani, $_POST['nazev']);
}    

If(isset($_POST["smazat"])) {
unset($_SESSION['kosik'][$_POST['sessionid_vybrane']]);
}


echo '<table>';
echo '<form method="post" action="onew.php">';
echo '<tr><th>Session id</th><th>název</th><th>přidat</th></tr>';
echo '<tr>';
echo '<td><input type="text" name="sessionid_aktulani" value="'.$sessionid_aktulani.'"></td>';
echo '<td>';
echo '<select name="nazev">';
echo '<option>jablka</option>';
echo '<option>hrušky</option>';
echo '<option>švestky</option>';
echo '</select>';
echo '</td>';
echo '<td>';
echo '<input type="Submit" name="pridat" value="Přidat">';
echo '</td>';
echo '</tr>';
echo '</form>';


if  ( $_SESSION['kosik']!=0 ) { 
echo '<table>' ;
echo '<form method="post" action="onew.php">';
echo '<tr><th>vybrané id</th><th>název</th></tr>';
foreach( $_SESSION['kosik'] as $data ) 
{
list($sessionid_vybrane, $nazev) = array_values( $data );
echo '<tr>';
echo '<td><input type="text" name="sessionid_vybrane" value="'.$sessionid_vybrane.'">';
echo '<td><input type="text" name="nazev" value="'.$nazev.'"></td>';
echo '<td>';
echo '<input type="Submit" name="smazat" value="Smazat"> ';
echo '</td>';
echo '</tr>';
}
echo '</form>';
echo '</table>';
}

?>

</body>
</html>
Kroupa
Profil *
Žádný nápad jak to vyřešit?
abc
Profil
Posílám funkční kód, projděte si úpravy, které jsem provedl a případně se zeptejte proč
PS - nechcete ještě aby mazání mazalo označený řádek, a ne vždy první? (nevím, zda to byl záměr či nikoliv)

<?php
session_start();
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    </head>
    <body>

    <?php
    If (isset($_POST['sessionid_aktulani'])) {
        $sessionid_aktulani = $_POST['sessionid_aktulani'];
    } else {
        $sessionid_aktulani = 1;
    }
    If (isset($_POST['sessionid_vybrane'])) {
        $sessionid_vybrane = $_POST['sessionid_vybrane'];
    } else {
        $sessionid_vybrane = 1;
    }


    If (isset($_POST["pridat"])) {
        echo "POST[nazev]: " . $_POST['nazev'] . '<br>';
        //nerozumím proč tam chcete +1 proti číslu z formuláře, ale asi k tomu máte nějaký důvod
        $_SESSION['kosik'][$sessionid_aktulani + 1] = $_POST['nazev'];
    }

    If (isset($_POST["smazat"])) {
        unset($_SESSION['kosik'][$sessionid_vybrane]);
    }


    echo '<table>';
    echo '<form method="post" action="">';
    echo '<tr><th>Session id</th><th>název</th><th>přidat</th></tr>';
    echo '<tr>';
    echo '<td><input type="text" name="sessionid_aktulani" value="' . $sessionid_aktulani . '"></td>';
    echo '<td>';
    echo '<select name="nazev">';
    echo '<option>jablka</option>';
    echo '<option>hrušky</option>';
    echo '<option>švestky</option>';
    echo '</select>';
    echo '</td>';
    echo '<td>';
    echo '<input type="Submit" name="pridat" value="Přidat">';
    echo '</td>';
    echo '</tr>';
    echo '</form>';


    if (isset($_SESSION['kosik']) && !empty($_SESSION['kosik'])) {
        echo '<table>';
        echo '<form method="post" action="">';
        echo '<tr><th>vybrané id</th><th>název</th></tr>';
        foreach ($_SESSION['kosik'] as $sessionid_vybrane => $nazev) {
        echo '<tr>';
        echo '<td><input type="text" name="sessionid_vybrane" value="' . $sessionid_vybrane . '">';
        echo '<td><input type="text" name="nazev" value="' . $nazev . '"></td>';
        echo '<td>';
        echo '<input type="Submit" name="smazat" value="Smazat"> ';
        echo '</td>';
        echo '</tr>';
        }
        echo '</form>';
        echo '</table>';
    }
    ?>

    </body>
</html>
Kroupa
Profil *
[#6] abc Díky za odpověď!

Tato část mi v tvém kódu nezobrazuje seznam, ale pouze posledně přidaný produkt:

if (isset($_SESSION['kosik']) && !empty($_SESSION['kosik'])) {
        echo '<table>';
        echo '<form method="post" action="">';
        echo '<tr><th>vybrané id</th><th>název</th></tr>';
        foreach ($_SESSION['kosik'] as $sessionid_vybrane => $nazev) {
        echo '<tr>';
        echo '<td><input type="text" name="sessionid_vybrane" value="' . $sessionid_vybrane . '">';
        echo '<td><input type="text" name="nazev" value="' . $nazev . '"></td>';
        echo '<td>';
        echo '<input type="Submit" name="smazat" value="Smazat"> ';
        echo '</td>';
        echo '</tr>';
        }
        echo '</form>';
        echo '</table>';
    }
    ?>

Mezitím jsem opravil kód a vše funguje kromě mazání:

<?php
session_start();
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>

<?php
$sessionid_aktulani = $_POST['sessionid_aktulani'];

If(isset($_POST["pridat"]))
{ 
$kosik =& $_SESSION['kosik'];
$sessionid_aktulani = $sessionid_aktulani + 1;
$kosik[] = array($sessionid_aktulani, $_POST['nazev']);
}    

If(isset($_POST["smazat"])) {
echo $_POST['sessionid_vybrane'].''.$_POST['nazev'];


$key=array_search($_POST["sessionid_vybrane"],$_SESSION["kosik"]);
if($key!==false) {unset($_SESSION["kosik"][$key]);};
}


echo '<table>';
echo '<form method="post" action="onew.php">';
echo '<tr><th>název</th><th>přidat</th></tr>';
echo '<tr>';
echo '<td><input type="hidden" name="sessionid_aktulani" value="'.$sessionid_aktulani.'"></td>';
echo '<td>';
echo '<select name="nazev">';
echo '<option>jablka</option>';
echo '<option>hrušky</option>';
echo '<option>švestky</option>';
echo '</select>';
echo '</td>';
echo '<td>';
echo '<input type="Submit" name="pridat" value="Přidat">';
echo '</td>';
echo '</tr>';
echo '</form>';


if  ( $_SESSION['kosik']!=0 ) { 
echo '<table>' ;

echo '<tr><th>vybrané id</th><th>název</th></tr>';
foreach( $_SESSION['kosik'] as $data ) 
{
list($sessionid_vybrane, $nazev) = array_values( $data );
echo '<tr>';
echo '<form method="post" action="onew.php">';
echo '<td><input type="hidden" name="sessionid_aktulani" value="'.$sessionid_aktulani.'">';
echo '<input type="text" name="sessionid_vybrane" value="'.$sessionid_vybrane.'">';
echo '<td><input type="text" name="nazev" value="'.$nazev.'"></td>';
echo '<td>';
echo '<input type="Submit" name="smazat" value="Smazat"> ';
echo '</td>';
echo '</tr>';
echo '</form>';
}

echo '</table>';
}

?>

</body>
</html>

Nicméně s mazáním je problém, všechny údaje se pomocí POST správně přenesou, ale nějak ty data pak nemůžu podle těch údajů vymazat. Zkoušel jsem to dvěma způsoby, ale nepracuje to jak má.

Zkoušel jsem to s array_search:

$key=array_search($_POST["sessionid_vybrane"],$_SESSION["kosik"]);
if($key!==false) {unset($_SESSION["kosik"][$key]);}

Ale nic to nedělá. A taky takhle:

foreach( $_SESSION['kosik'] as $data ) 
{
list($sessionid_vybrane, $nazev) = array_values( $data );
if($sessionid_vybrane == $_POST['sessionid_vybrane']){unset($_SESSION['kosik'][$_POST['sessionid_vybrane']]);}
}

Tohle zase občas maže úplně jiné ID než je potřeba...
abc
Profil
Poslal jsem Vám funkční kód, který stačilo zkopírovat a spustit.
Mé úpravy si upravíte zpět, jak jste je měl a divíte se, že Vám to nefunguje.
Znovu to sem posílat nebudu.

Jen si musíte uvědomit, že to ukládání a výpis, jak jsem je upravil a v kódu v [#6] jsem neudělal pro nic za nic...

Co se týká toho mazání, tak jsem se v [#6] ptal, zda chcete, aby to takto "fungovalo" nebo aby to mazalo správný řádek a na to stačí použít radu od [#3] Tori
Kroupa
Profil *
[#8] abc Přečtěte si prosím první řádek mého předešlého příspěvku.
abc
Profil
Číst umím, rádo se stalo. Ale přece za poděkování nechcete tu radu poslat znovu?
Tu v podstatě nejdůležitější část, a sice "rozumné" ukládání do pole $_SESSION['kosik'] ve tvaru ($id => $hodnota) jste si hned změnil zpět a ukládáte do pole pod následující index 2 hodnoty do dalšího pole. Mohu se zeptat proč?
Pokud byste změnil ukládání tak, jak jsem ho napsal já, tak se Vám budou záznamy daleko lépe hledat, vypisovat i mazat - prostě smažete záznam s klíčem $vybraneId a nemusíte hledat v kterém poli se hodnota nachází.

Pokud Vám samozřejmě něco není jasné, rád Vám zodpovím i následující dotazy.
Pokud máte zájem o další ukázku funkčního kódu s doladěným mazáním, rád poskytnu.
Kroupa
Profil *
abc:
Nemám o Váš kód zájem. Jak jsem psal, nefunguje. Potřeboval jsem vyřešit problém, ne tam další přidělávat.
Tori
Profil
Kroupa:
Ty problémy si přiděláváte sám. Je to na první pohled zřejmé z kódu v [#4] i [#7]. Máte hodnotu a uvnitř vnořeného pole, uloženého v košíku pod klíčem b. Do formuláře na mazání vkládáte hodnoty a z vnořeného pole, ale při mazání je používáte jako klíč b v košíku. Je tedy pravděpodobné, že ve výsledku se budou z košíku mazat zdánlivě náhodné prvky místo těch, které chcete. Logické řešení by bylo vkládat do formuláře na mazání nikoli hodnoty z vnořeného pole, ale klíče košíku. Anebo pokud byste při mazání použil to procházení košíku cyklem, co máte na konci [#7], tak je potřeba při nalezení správného pole z košíku odstranit toto pole, a ne použít hodnotu z POST.
abc
Profil
Ještě by byla možnost při výpísu položek z košíku do formuláře přidat hidden input, ve kterém bude uložená hodnota klíče pro mazání.
Kroupa
Profil *
Díky za pomoc všem, podařilo se mi to rozchodit:

<?php
session_start();
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>

<?php

if(isset($_POST['sessionid_nejvyssi'])){$sessionid_nejvyssi = $_POST['sessionid_nejvyssi'];} 
else{$sessionid_nejvyssi = -1;} 

If(isset($_POST["pridat"]))
{ 
$kosik =& $_SESSION['kosik'];
$sessionid_nejvyssi = $sessionid_nejvyssi + 1;
$kosik[] = array($sessionid_nejvyssi, $_POST['nazev']);
}    

If(isset($_POST["smazat"])) {
echo "post:".$_POST['sessionid_vybrane'];
echo "<br>nejvyšší před výmazem: ".$sessionid_nejvyssi;
foreach( $_SESSION['kosik'] as $sessionid_vybrane2 => $data ) 
{
echo "<br>session:".$sessionid_vybrane2;
if($sessionid_vybrane2 == $_POST['sessionid_vybrane'])
{
unset($_SESSION['kosik'][$sessionid_vybrane2]);
if(empty($_SESSION['kosik'])){$sessionid_nejvyssi = -1;}
}
}
echo "<br>nejvyšší po výmazu: ".$sessionid_nejvyssi;
}




echo '<table>';
echo '<form method="post" action="onew.php">';
echo '<tr><th>nejvyšší id</th><th>název</th><th>přidat</th></tr>';
echo '<tr>';
echo '<td><input type="text" name="sessionid_nejvyssi" value="'.$sessionid_nejvyssi.'"></td>';
echo '<td>';
echo '<select name="nazev">';
echo '<option>jablka</option>';
echo '<option>hrušky</option>';
echo '<option>švestky</option>';
echo '</select>';
echo '</td>';
echo '<td>';
echo '<input type="Submit" name="pridat" value="Přidat">';
echo '</td>';
echo '</tr>';
echo '</form>';


if  ( $_SESSION['kosik']!=0 ) { 
echo '<table>' ;

echo '<tr><th>nejvyšší id</th><th>vybrané id</th><th>název</th></tr>';
foreach( $_SESSION['kosik'] as $sessionid_vybrane => $data ) 
{
list($sessionid_vybrane, $nazev) = array_values( $data );
echo '<tr>';
echo '<form method="post" action="onew.php">';
echo '<td><input type="text" name="sessionid_nejvyssi" value="'.$sessionid_nejvyssi.'"></td>';
echo '<td><input type="text" name="sessionid_vybrane" value="'.$sessionid_vybrane.'"></td>';
echo '<td><input type="text" name="nazev" value="'.$nazev.'"></td>';
echo '<td>';
echo '<input type="Submit" name="smazat" value="Smazat"> ';
echo '</td>';
echo '</tr>';
echo '</form>';
}

echo '</table>';
}

?>

</body>
</html>

Pokud by to šlo nějak zjednodušit, dejte mi vědět. Ale myslím že takhle to splní svůj účel.

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: