PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Datenbankabfrage innerhalb foreach-Schleife?


sputnik72
15.10.2005, 14:16:15
Hallo!

Ich habe eine Frage zur Umsetzung eines Warenkorbes mit SESSION.

In meinem Bsp. geht es um Bücher (ein Datensatz der Dantenbanktabelle enthält also id, Titel, Autor, Jahr, Preis, usw.), die bestellt werden können. Mit Hilfe von SESSION sammle ich die id's der bestellten Bücher.
Nun möchte ich dem Käufer die Gelegenheit geben, den Warenkorb anzuschauen, und ich bin soweit gekommen, dass dort die id's der bestellten Bücher auch erscheinen. Das habe ich so gemacht:


if (isset($_SESSION['warenkorb']) &&
!empty($_SESSION['warenkorb'])) {

echo "<p>Ihre Bestellung umfasst folgendes:</p>";

foreach ($_SESSION['warenkorb'] as $id) {


echo $id, "<br>";
}

}


Nun meine Frage: Wie komme ich jetzt an die restlichen Daten der Buchtitel heran (Titel, Autor, Preis, etc.)?
Kann man eine Datenbankabfrage in die foreach-Schleife einsetzten? Wen ja, wäre es schön wenn mir jemand sagen könnte wo und wie, da ich es bereits erfolglos probiert habe.

Oder muss ich die anderen Daten bereits zusammen mit id in der Session zusammensammeln? Falls ja, geht das in der gleichen Variablen, oder ... ich bin mir einfach sehr unsicher. Ich habe glaube ich schon von mehrdimensionalen Arrays gehört, ist das die Lösung?

Wäre wirklich dankbar für ein paar Tips!

Gruss Sputnik

Stevie B.
15.10.2005, 18:49:54
Ja, das geht. Du kannst das ganze in verschiedene Funktionen aufteilen, damit Du nicht überall alles neu schreiben musst und auch überall einsetzen kannst.
Beispiel:
<?php
$link;
connectToDB();

//Verbindung zur Datenbank herstellen
function connectToDB() {
global $link;
$link = @mysql_connect( "$host", "$user", "$pass" );
if ( ! $link )
die( "Keine Verbindung zu MySQL" );
@mysql_select_db( "$db", $link )
or die ( "Konnte Datenbank nicht öffnen: ".mysql_error() );
}

//Daten einer Tabelle in ein Array einlesen
function holeDS($table,$field,$value) {
global $link;
$ergebnis = @mysql_query( "SELECT * FROM $table
WHERE $field='$value'", $link );
if ( ! $ergebnis )
die ( "holeDS fatal error: ".mysql_error() );
return @mysql_fetch_array( $ergebnis );
}

//Daten auslesen
foreach ($_SESSION['warenkorb'] as $id) {
//Daten über die Function in einem Array speichern
$data = holeDS("warenkorb","id",$id);
echo $data[titel]." - ".$data[autor]." - ".$data[preis]."...<br>";
}

Gruß,
Stevie B.

feuervogel
15.10.2005, 19:41:17
//Verbindung zur Datenbank herstellen
function connectToDB() {
global $link;
$link = @mysql_connect( "$host", "$user", "$pass" );
if ( ! $link )
die( "Keine Verbindung zu MySQL" );
@mysql_select_db( "$db", $link )
or die ( "Konnte Datenbank nicht öffnen: ".mysql_error() );
}


woher kommen denn die variablen $host usw? zweitens kann ich sie nur beschränkt wiederverwenden, da meine variablen außerhalb der funktionen genau die gleichen namen tragen müssen. warum übergibst du sie nicht einfach?

Stevie B.
15.10.2005, 19:52:53
Ich mache es so, dass ich die Zugangsdaten in einer separaten Datei ablege. Daher binde ich diese innerhalb der Funktion ein.
function connectToDB() {
global $link;
include('datei.inc.php');
$link = @mysql_connect( "$host", "$user", "$pass" );
if ( ! $link )
die( "Keine Verbindung zu MySQL" );
@mysql_select_db( "$db", $link )
or die ( "Konnte Datenbank nicht öffnen: ".mysql_error() );
}

Die Variablen könntest Du natürlich umbenennen. Aber außerhalb der Funktion interessieren die Namen ja nicht, da sie in der Funktion keine Gültigkeit haben und umgekehrt.

meikel (†)
16.10.2005, 10:44:25
Ich mache es so, dass ich die Zugangsdaten in einer separaten Datei ablege. Daher binde ich diese innerhalb der Funktion ein.
Umständlich. Definiere die Zugangsdaten gleich als Konstanten, weil Konstanten auch innerhalb von Funktionen gültig sind.

Stevie B.
16.10.2005, 11:12:38
Umständlich? Naja, wie man's nimmt. Aber der Sicherheit wegen besser, wenn Du die Zugangsdaten in einer Datei innerhalb eines htaccess-geschützten Ordners ablegst! DB-Zugangsdaten sind immerhin nicht verschlüsselt...

feuervogel
16.10.2005, 12:34:57
und wenn der server auf einmal seine .htaccess-fähigkeit verliert, ist das auch schnulli, daher sollten diese daten in einen ordner außerhalb des www-roots.

Stevie B.
16.10.2005, 12:54:51
Da hast Du auch wieder Recht.

sputnik72
18.10.2005, 14:07:57
Hallo Stevie B.,
es hat zwar einige Zeit gedauert, bis ich das Script verstanden hatte - aber es funktioniert! Vielen Dank für die Hilfe!

Gruss Sputnik

meikel (†)
18.10.2005, 18:59:30
Umständlich? Naja, wie man's nimmt.
Bitte?

define('dbhost', 'localhost');
define('dbuser', 'icke');
define('dbpass', 'vajessen');
define('dbname', 'db');

define('debug', true); # später auf false ändern

funktion error($msg='', $die = true)
{
if ($die)
die($msg);
printf('<b>%s</b>', $msg);
if (debug)
printf('<p>Error: %s</p>', mysql_error());
return false;
}

function connect($die = true)
{
if (!defined('dbpass'))
return error('Keine Zugangsdaten', $die);
if (! $conn = @mysql_connect(dbhost, dbuser, dbname))
return error('Kein Login möglich', $die);
if (! @mysql_select_db(dbname))
return error(sprintf('Auswahl der DB %s nicht möglich', dbname), $die);
return $conn;
}