ugrás a tartalomhoz

PHP session, felétel kérdés

LordEVon · 2010. Szep. 29. (Sze), 10.42
Heló!
Szeretnék segítséget kérni az alábbi problémámra. Van egy oldal, ahol lehet rendelni, s a kosar.php-ben írom ki az aktuális rendelés állását. Eddig úgy volt, hogy a "nev" feltétel szerint irta ki az újabb tételeket a listába, viszont meg kéne valahogy (nem tudom hogy) oldani, hogy a "nev" és a "nev_feltet" alapján írja ki.

Mutatom a kódot:
<?

// Új termék felvétele a kosárba
if (isset($_POST['kosarba']))
{ // Ha a kosár nem üres
if (!empty($_SESSION['kosar_tartalom']))
{ // Ha van már a kosárban ilyen termék, csak hozzáadjuk az új darabszámot
if (isset($_SESSION['kosar_tartalom'][$_POST['id']]))
{
$_SESSION['kosar_tartalom'][$_POST['nev']]['darab'] += $_POST['darab'];
}
// Ellenkező esetben felvisszük a kosárba
else
{
$_SESSION['kosar_tartalom'][$_POST['nev']] = array("id" => $_POST['id'],
"nev" => $_POST['nev'],
"nev_feltet" => $_POST['nev_feltet'],
"ar" => $_POST['ar'],

"far" => $_POST['far'],
"darab" => $_POST['darab']);
}



}
// Ha a kosár üres
else
{ // Kiválasztott termék felvitele
$_SESSION['kosar_tartalom'][$_POST['nev']] = array("id" => $_POST['id'],
"nev" => $_POST['nev'],
"nev_feltet" => $_POST['nev_feltet'],
"ar" => $_POST['ar'],

"far" => $_POST['far'],
"darab" => $_POST['darab']);
}
}

// Hány termék található a kosárban
echo @count($_SESSION['kosar_tartalom'])." Termék a kosárban";
if (@count($_SESSION['kosar_tartalom'])>0) {echo " - <a class='kosar' href=rendeles.php target='_parent'>Kosár</a><br />"; }

// Kosár tartalmának kiiratása
if (!empty($_SESSION['kosar_tartalom']))
{
foreach ($_SESSION['kosar_tartalom'] as &$aaa)
{
echo $aaa['nev'].": <br> ".$aaa['darab']." db | <a class='kosar' title='Eggyel többet a kosárba' href='kosar.php?act=plusz&id=".$aaa['nev']."'> + </a> :
<a class='kosar' title='Eggyel kevesebbet a kosárba' href='kosar.php?act=minusz&id=".$aaa['nev']."'> - </a><br/>".$aaa['nev_feltet']."<hr>
";
}
}
 
1

A forráskód részleteket légy

kuka · 2010. Szep. 29. (Sze), 11.37
A forráskód részleteket légy szíves írd [colorer=***] és [/colorer] BBCode formázók közé (ahol *** helyére a kód nyelvét írod).

Az ilyen típusú kérdésekre általában sokkal egyszerűbb válaszolni, ha adat példát is látunk. Jelen esetben a $_SESSION és az $aaa volna érdekes.
2

Kérdés

Poetro · 2010. Szep. 29. (Sze), 11.43
Itt van az eredeti kód olvasható formában
<?php
// Új termék felvétele a kosárba

if (isset($_POST['kosarba'])) { // Ha a kosár nem üres
  
  if (!empty($_SESSION['kosar_tartalom'])) {

    // Ha van már a kosárban ilyen termék, csak hozzáadjuk az új darabszámot   
    if (isset($_SESSION['kosar_tartalom'][$_POST['id']])) {
      $_SESSION['kosar_tartalom'][$_POST['nev']]['darab'] += $_POST['darab'];
    }
    // Ellenkező esetben felvisszük a kosárba
    else {
      $_SESSION['kosar_tartalom'][$_POST['nev']] = array(
        "id" => $_POST['id'],
        "nev" => $_POST['nev'],
        "nev_feltet" => $_POST['nev_feltet'],
        "ar" => $_POST['ar'],
        "far" => $_POST['far'],
        "darab" => $_POST['darab']
      );
    }
  }
  // Ha a kosár üres
  else { // Kiválasztott termék felvitele
    $_SESSION['kosar_tartalom'][$_POST['nev']] = array(
      "id" => $_POST['id'],
      "nev" => $_POST['nev'],
      "nev_feltet" => $_POST['nev_feltet'],
      "ar" => $_POST['ar'],
      "far" => $_POST['far'],
      "darab" => $_POST['darab']
    );
  }
}
// Hány termék található a kosárban
echo @count($_SESSION['kosar_tartalom']) . " Termék a kosárban";

if (@count($_SESSION['kosar_tartalom']) > 0) {
  echo " - <a class='kosar' href=rendeles.php target='_parent'>Kosár</a><br />";
}

// Kosár tartalmának kiiratása
if (!empty($_SESSION['kosar_tartalom'])) {
  foreach ($_SESSION['kosar_tartalom'] as & $aaa) {
    echo $aaa['nev'] . ": <br> " . $aaa['darab'] . " db | <a class='kosar' title='Eggyel többet a kosárba' href='kosar.php?act=plusz&id=" . $aaa['nev'] . "'> + </a> :
<a class='kosar' title='Eggyel kevesebbet a kosárba' href='kosar.php?act=minusz&id=" . $aaa['nev'] . "'> - </a><br/>" . $aaa['nev_feltet'] . "<hr>
";
  }
}
?>
viszont meg kéne valahogy (nem tudom hogy) oldani, hogy a "nev" és a "nev_feltet" alapján írja ki.

Ezt definiálnád, hogy mit jelent? És hogy egyáltalán miért nincsen semmi ellenőrzés arra vonatkozóan, hogy mi lett beküldve? Mert teszem azt, én módosítom a változókat a weboldalon, hogy mondjuk az ár legyen 1 Ft, a darab mondjuk 1000 és rendeltem 1000 darab netbookot összesen 1000 Forintért.
Legyen minden elemhez csak az azonosító és a darabszám tárolva, és a többi adatot pedig vedd adatbázisból, gondolom úgy is ott tárolod őket.
3

Bocsi, nem tudtam, hogyan

LordEVon · 2010. Szep. 29. (Sze), 16.04
Bocsi, nem tudtam, hogyan kell a kódot beilleszteni rendesen.
Most már látom is, hogyan kell...
Szóval az adatbázisból jön le kb minden, kivéve az nev_feltet és a hozzá tartozó ár, mert azokat nem tudtam úgy megoldani.
nekem most nem is az a lényeg.
nos akkor megmutatom, hogyan is van ez:
ez itt a pl. index.php szükséges fájlja
<script>
ar=new Array(0,80,80,80,80,80,80,80,100,100,100,100,100,100,100,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180);

function kivesz(mit, hova)
{
document.getElementById('far'+hova).innerHTML= ar[mit.selectedIndex]+"&nbsp;Ft"
document.getElementById('far_'+hova).value= ar[mit.selectedIndex]
document.getElementById('far45'+hova).innerHTML= ar[mit.selectedIndex]+"&nbsp;Ft"
document.getElementById('far45_'+hova).value= ar[mit.selectedIndex]
}
</script> 

ez ugyebár adatbázisból jön le:
$kiiras .="<tr><td>".$sor['id'].", "."<b>".$sor['nev']."</b>".$sor['akcio']."<br>".$sor['keszult']."</td>
    <form method='POST' action='kosar.php' name='TermForm' target='kosar_frame' onSubmit='return CheckRequiredFields()' ><input type='hidden' name='id' value='".$sor['id']."'><input type='hidden' name='nev' value='".$sor['nev']." - 30 cm'>
    "."<td style='text-align:center;'>"."<input type='hidden' name='ar' value='".$sor['ar30']."'>".$sor['ar30']."<br>db: 
    ".$sor['db30'].$sor['id'].$sor['db30uto']."</td>"."<td style='text-align:center;'><select name='nev_feltet' style='width: 20px' onchange='kivesz(this,".$sor['id'].")'>
    <option value=''>Semmi</option>                                                                                                  
    <option value='Zöldborsó - 80 Ft'>Zöldborsó - 80 Ft</option>
    <option value='Hagyma - 80 Ft'>Hagyma - 80 Ft</option>
    <option value='Fokhagyma - 80 Ft'>Fokhagyma - 80 Ft</option>
    <option value='Erős pista - 80 Ft'>Erős pista - 80 Ft</option>
 

stb még pár cucc...

    </select><div style='display:none' id='far".$sor['id']."'> 0&nbsp;Ft</div></td>
	<input type='hidden' name='far' id='far_".$sor['id']."' value='0'>
    <td style='text-align:center;'>".$sor['kosar30'].$sor['id'].$sor['kosar30uto']."</td></form>"."
Ehhez jön hozzá még pár kiegészítés, ami a kosar.phphez nem kell, így azokat nem írom be. A kosar.php tartalma amit megadtam először.
Szóval ha így beütöm, hogy mit is akarok rendelni, akkor csak úgy csinál új bejegyzést a kosar.php-ba, ha a név változik, tehát ha rendelek x ételt kukorica feltéttel, az jó. De ha e mellé x pizzát akarok rendelni feltétel nélkül, akkor az előzőt felülirja, s nem új sorba. Ez az amit meg kéne oldani....
remélem érthető a problémám
4

Problémák

Poetro · 2010. Szep. 29. (Sze), 16.57
A probléma továbbra is fent áll a árral kapcsolatban, mi van, ha én, mint felhasználó átírom a formban a termék árát 1 Ft-ra.
<?php
// Új termék felvétele a kosárba  
if (!empty($_SESSION['kosar_tartalom'])) {
  $_SESSION['kosar_tartalom'] = array();
}
  
if (!empty($_POST['kosarba'])) { // Ha a kosár nem üres  
  $id = intval($_POST['id']);
  $feltet = in_array($_POST['nev_feltet'], array(
    'Zöldborsó - 80 Ft',
    'Hagyma - 80 Ft',
    'Fokhagyma - 80 Ft',
    'Erős pista - 80 Ft',
  )) ? $_POST['nev_feltet'] : '';
  $darab = intval($_POST['darab']);
  
  if ($id && $darab) {
    // Ha van már a kosárban ilyen termék, csak hozzáadjuk az új darabszámot     
    if (isset($_SESSION['kosar_tartalom'][$id][$feltet])) {  
      $_SESSION['kosar_tartalom'][$id][$feltet]['darab'] += $darab;  
    }  
    // Ellenkező esetben felvisszük a kosárba  
    else {
      $result = db_query("SELECT *, %d AS darab, '%s' AS nev_feltet FROM table WHERE id = %d", $darab, $feltet, $id);
      if ($elem = db_fetch_array($result)) {
        $_SESSION['kosar_tartalom'][$id][$feltet] = $elem;
      }
    }  
  }  
}

$elemek = 0;
$output = '';
// Hány termék található a kosárban
foreach ($_SESSION['kosar_tartalom'] as $id => $val) {
  foreach ($val as $feltet => $elem) {
    $elemek++;

    $output .= $elem['nev'] . ": <br> " . $elem['darab'] . " db | <a class='kosar' title='Eggyel többet a kosárba' href='kosar.php?act=plusz&id=" . $elem['nev'] . "'> + </a> :  
    <a class='kosar' title='Eggyel kevesebbet a kosárba' href='kosar.php?act=minusz&id=" . $elem['id'] . '?feltet=' . urlencode($elem['nev_feltet']) . "'> - </a><br/>" . $elem['nev_feltet'] . "<hr>";
  }
}
echo $elemek . " Termék a kosárban";  
  
if ($elemek > 0) {  
  echo " - <a class='kosar' href=rendeles.php target='_parent'>Kosár</a><br />";  
}  

echo $output;
?>
Megjegyzés: A kódszínező az empty-t hajlamos kétszer kiírni.
5

Bízom benne, hogy nem teszed.

LordEVon · 2010. Szep. 29. (Sze), 18.44
Bízom benne, hogy nem teszed. :) Egyébként nem hinném, hogy a felhasználók nagy része ezt megtenné. De akkor hogyan gondolod, mit csináljak? db-ből hivassam le?
Na meg, a nevében benne van az ára a feltétnek, a pizzának meg az ára db-ből jön le...
látom írtál egy szép kódsort. ki fogom próbálni, köszi
6

...

gphilip · 2010. Szep. 29. (Sze), 18.56
"Egyébként nem hinném, hogy a felhasználók nagy része ezt megtenné."

Ha kész a webshop megmondod a címet? :)



Egyébként elég a termék ID-jté és darabszámát a session-ben eltárolnod, a többi jön az adatbázisból és nincs gond, persze az előbbeieket sem árt ellenőrizni.
7

Már vásároltam

Poetro · 2010. Szep. 29. (Sze), 19.45
Elhiszed, hogy már vásároltam 1 Ft-ért Netbook-ot? Persze ki már nem szállították, de ez már más kérdés. Elég ha a felhasználók kis része húz le pár millióval. Szerintem.
8

Hmm... Erre megtaníthatnál

LordEVon · 2010. Szep. 30. (Cs), 08.25
Hmm...
Erre megtaníthatnál hogyan kell, érdekelne:)
Elvégre ha valamit tud az ember, könnyebb ellene védekezni is.