assoziatives Array in Session durchsuchen

Spelmann

Erfahrenes Mitglied
Ich versuche mich mal an einer Warenkorbfunktion.
Funktioniert soweit. Wenn nun ein Artikel zwei Mal angeklickt wird möchte ich darauf hinweisen, daß der Artikel schon im Warenkorb ist.

Der Warenkorb ist in einer Session gespeichert, die ein assoziatives Array enthält.
Um nun mittels Vergleich der übergebenen Artikel ID und den schon in der Session gespeicherten IDs eine Übereinstimmung zu finden habe ich es mit in_array() und array_search() versucht. Ohne Erfolg.

Funktionsweise von array_search
PHP:
$test = array('ID' => '0815', 'Artikel' => '5');
		if ( $x = array_search ( '0815', $test ) ){    
			echo $test[$x] . ' wurde gefunden!<br />';
			}

Mein Versuch das auf eine Session zu übertragen funktioniert aber nicht.
PHP:
if ( $x = array_search ( $_POST['idArtikel'], $_SESSION['warenkorb'] ) ){    
			echo $_SESSION['warenkorb'][$x] . ' wurde gefunden!<br />';
			}

Klicke ich einen Artikel zwei mal an, ergibt die Ausgabe der Werte des Arrays, dass zwei Mal der selbe Artikel existiert. Die Prüfung hätte also zu einem Ergebnis führen müssen.
Kann mir jemand sagen wo mein Fehler liegt?
 
Wie ist denn dein assoziatives Array genau aufgebaut?

Folgender Code funktioniert: http://codepad.org/vTHVDrvp
PHP:
<?php
$test = array('ID' => '0815', 'Artikel' => '5'); 
$x = '0815';

if (  array_search($x, $test) !== FALSE  )
{
  echo 'Artikel schon vorhanden!';
}
else
{
  echo 'Artikel _noch_ nicht vorhanden!';
}

?>
 
Hi ComFreek,
Wie ist denn dein assoziatives Array genau aufgebaut?
Bei jedem Klick auf einen Kaufbutton wird folgender Code ausgeführt:
PHP:
$_SESSION['warenkorb'][] = array('idArtikel' => $_POST['idArtikel'],
	'stckArtikel' => $_POST['stckArtikel'],
	'bezArtikel' => $zeile->bezArtikel,
	'preisArtikel' => $zeile->preisArtikel);

Die Ausgabe aller Werte der Artikel im Warenkorb via Schleife zeigt, dass auch die IDs vorhanden sind.
Ein Versuch, Dein Beispiel anzuwenden, führt interessanter Weise zu einem Fehler.

PHP:
if($_SESSION['warenkorb'] AND $_POST['idArtikel']){ //Prüfung ob warenkorb schon existiert und ob eine ID übergeben wurde.
			if (array_search($_POST['idArtikel'], $_SESSION['warenkorb'] !== FALSE) ){
				echo "VORHANDEN";
				}else{
				echo "NICHT VORHANDEN";
				}
		}

Fehlermeldung:
Code:
array_search() expects parameter 2 to be array, boolean given in

Die Fehlermeldung bringt mich aber auch nicht so richtig weiter.
 
Versuch es mal so:
PHP:
$_SESSION['warenkorb'][$_POST['idArtikel']] = array(
    'idArtikel'    => $_POST['idArtikel'], 
    'stckArtikel'  => $_POST['stckArtikel'], 
    'bezArtikel'   => $zeile->bezArtikel, 
    'preisArtikel' => $zeile->preisArtikel
);
Und so:
PHP:
if ( isset( $_SESSION['warenkorb'], $_POST['idArtikel'] ) ) {
    if ( isset( $_SESSION['warenkorb'][$_POST['idArtikel']] ) ) {
        echo 'VORHANDEN';
    } else {
        echo 'NICHT VORHANDEN';
    }
}

Gruß

Edit//
Bei deiner IF-Abfrage war ist eine Klammer falsch gesetzt:
PHP:
if (array_search($_POST['idArtikel'], $_SESSION['warenkorb'] !== FALSE) )
so wäre es mMn richtig:
PHP:
if ( array_search( $_POST['idArtikel'], $_SESSION['warenkorb'] ) !== false )
 
Zuletzt bearbeitet:
Hi Raisch,
stimmt. Die Klammer war falsch. Das Haupt-Problem besteht aber weiterhin.
Dein Beispiel funktioniert auch nicht.

Da behauptet die Seite auch bei zwei verschiedenen Artikeln sie seien identisch. Zusätzlich gibts einen neuen Fehler:
Code:
array_search() expects parameter 2 to be array, null given in
 
Hi Raisch,
stimmt. Die Klammer war falsch. Das Haupt-Problem besteht aber weiterhin.
Dein Beispiel funktioniert auch nicht.

Da behauptet die Seite auch bei zwei verschiedenen Artikeln sie seien identisch. Zusätzlich gibts einen neuen Fehler:
Code:
array_search() expects parameter 2 to be array, null given in
Hast Du es denn mit meiner Methode mal probiert?

Gruß
 
Ich bin mir jetzt nich ganz sicher, aber sucht array_search rekursiv?
Denn du hast ja ein zweidimensionalles Array, und suchst nach dem ID eines Untergeorneten Arrays.
Verstehst du was ich meine?
Vieleicht wäre eine foreach schleife angebracht. In der gehst du alle Einträge durch.
 
Hab hier nochmal ein Beispiel:
PHP:
$vorhanden = false;
foreach ($_SESSION['warenkorb'] as $ware)
{
  if ($_POST['idArtikel'] == $ware['idArtikel'])
  {
      $vorhanden = true;
  }
}
if ($vorhanden == true) { echo "Sie haben diesen Artikel schon im Warenkorb";}
 
Hey Entwicklerpages, danke so läufts!

Obwohl ich mich doch wundere. Ist doch nur ein assoziatives Array. Oder ist das gleichzusetzen mit zweidimensional und nur eine andere Form?

Das Array der Session hat doch die gleiche Struktur wie das Beispiel ganz oben im Thread (oder übersehe ich da was?). Und da funktioniert array_search.

Na jedenfalls komme ich jetzt erstmal weiter. Mal sehen was es noch so zu entdecken gibt.
Danke für eure Denkanstöße und Lösungen.

Hier für andere Einsteiger ins Thema einfache Beispieldateien ohne Datenbankgedöns.

FORUMindex.php
Code:
<?php
session_start();
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Shop Startseite</title>
<style type="text/css">
<!--
body, html {height:100%;padding:0;margin:0;font-family:Verdana, Geneva, sans-serif}
fieldset{width:750px;border:#CCC dotted 2px}
input{margin:0 0 5px 10px;}
label{color:#999; font-size:0.8em; line-height:1em}
td{ vertical-align:baseline}
table{font-size:0.9em}
.grau{color:#999}
-->
</style>
</head>

<body style="background-color:#FAF8F5">
<?php
if($_GET['job'] == 'resetCart'){
	session_destroy();
}
?>

<div style="width:960px; margin:0 auto; background-color:#FFF; height:100%;">&nbsp;
	<div style="margin:10% 0 0 100px">
      <h1>Startseite</h1>
      <fieldset><legend>Artikel</legend>
        <table width="700" border="0" cellspacing="0" cellpadding="2">
				<?php
				if(!isset($_SESSION['warenkorb'])){
					$_SESSION['warenkorb'] = array();
					} ?>
                        <tr>
                            <form action="FORUMwarenkorb.php" method="post" enctype="multipart/form-data" name="einkauf">
                                <td style="text-align:right"><input name="bezArtikel" type="text" value="Skihose" /></td>
                                <td style="text-align:left"><input name="preisArtikel" type="text" value="170.00 &euro;" /></td>
                                <td><span class="grau">Stückzahl</span> <input name="stckArtikel" type="text" size="2" maxlength="2" value="1" /></td>
                                <td><span class="grau">ID</span><input name="idArtikel" type="text" value="0815" size="4" /><input name="kaufen" type="submit" value="in den Warenkorb" /></td>
                            </form>
                        </tr>
                        <tr>
                            <form action="FORUMwarenkorb.php" method="post" enctype="multipart/form-data" name="einkauf">
                                <td style="text-align:right"><input name="bezArtikel" type="text" value="Skijacke" /></td>
                                <td style="text-align:left"><input name="preisArtikel" type="text" value="240.00 &euro;" /></td>
                                <td><span class="grau">Stückzahl</span> <input name="stckArtikel" type="text" size="2" maxlength="2" value="1" /></td>
                                <td><span class="grau">ID</span><input name="idArtikel" type="text" value="4711" size="4" /><input name="kaufen" type="submit" value="in den Warenkorb" /></td>
                            </form>
                        </tr>
                        <tr>
                            <form action="FORUMwarenkorb.php" method="post" enctype="multipart/form-data" name="einkauf">
                                <td style="text-align:right"><input name="bezArtikel" type="text" value="Handschuhe" /></td>
                                <td style="text-align:left"><input name="preisArtikel" type="text" value="45.00 &euro;" /></td>
                                <td><span class="grau">Stückzahl</span> <input name="stckArtikel" type="text" size="2" maxlength="2" value="1" /></td>
                                <td><span class="grau">ID</span><input name="idArtikel" type="text" value="007" size="4" /><input name="kaufen" type="submit" value="in den Warenkorb" /></td>
                            </form>
                        </tr>
        </table>
        </fieldset>
        <br />
        <input name="resetCart" type="button" value="Warenkorb leeren" onclick="window.location.href='FORUMindex.php?job=resetCart';" />     
  </div>
</div>
<a href="warenkorb.php">Zum Warenkorb ohne Bestellung</a>
</body>
</html>

FORUMwarenkorb.php
Code:
<?php
session_start();
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Warenkorb</title>
<style type="text/css">
<!--
body, html {height:100%;padding:0;margin:0;font-family:Verdana, Geneva, sans-serif}
fieldset{width:600px;border:#CCC dotted 2px;}
input{margin:0 0 5px 10px;}
label{color:#999; font-size:0.8em; line-height:1em}
td{ vertical-align:baseline}
.grau{color:#999}
-->
</style>
</head>

<body style="background-color:#FAF8F5">
<div style="width:960px; margin:0 auto; background-color:#FFF; height:100%">
&nbsp;
    <form action="FORUMwarenkorb.php" method="post" style="margin:10% 0 0 100px">
    <h1>Warenkorb</h1>
      <fieldset><legend>Warenkorb</legend>
		<?php
		/*if($_SESSION['warenkorb'] AND $_POST['idArtikel']){
			if (array_search($_POST['idArtikel'], $_SESSION['warenkorb']) !== FALSE ){
				echo "VORHANDEN";
				}else{
				echo "NICHT VORHANDEN";
				}
		}*/
		
		
		if($_SESSION['warenkorb'] AND $_POST['idArtikel']){
			$vorhanden = false;
			foreach ($_SESSION['warenkorb'] as $ware)
			{
			  if ($_POST['idArtikel'] == $ware['idArtikel'])
			  {
				  $vorhanden = true;
			  }
			}
			if ($vorhanden == true) { echo "Sie haben diesen Artikel schon im Warenkorb";}
		}
		
		//Wenn eine Artikel ID übergeben wird, wird der gewählte Artikel aus der Datenbank geholt
		if($_POST['idArtikel']){
			
			
			//Der ausgelesene Artikel wird in die Session Warenkorb eingetragen
			$_SESSION['warenkorb'][] = array('idArtikel' => $_POST['idArtikel'], 'bezArtikel' => $_POST['bezArtikel'], 'stckArtikel' => $_POST['stckArtikel'], 'preisArtikel' => $_POST['preisArtikel']);
			}
			

		//Ausgabe des Warenkorbs
		$count = count($_SESSION['warenkorb']);
		echo "in der Session befinden sich ".$count." Artikel";
		for ($i = 0; $i < $count; $i++) {
			echo "<p>";
			echo "<span class='grau'> id &raquo; ".$_SESSION['warenkorb'][$i]['idArtikel']." | ".$_SESSION['warenkorb'][$i]['stckArtikel']." x ".$_SESSION['warenkorb'][$i]['bezArtikel'];
		  }
		
		//Datenbank schließen
		?>

      </fieldset><br />
      <input name="weiter" type="button" value="weiter einkaufen" onclick="window.location.href='FORUMindex.php';" />

    </form>
    
</div>
</body>
</html>
 
Zuletzt bearbeitet:
Zurück