kreuztabelle: so sinvoll?

Saturnus

Grünschnabel
hallo

ich muss eine art kreuztabelle in php/mysql erstellen. links, vertikal sind die produkte oben, horizontal sind die datums. dann wird angezeigt, welche daten besetzt sind und welche nicht.

ich hab das jetzt mal mit dem folgenden code gemacht. nun meine frage: ist das so einigermassen sinnvoll oder gibts da was besseres in bezug auf performance, etc.?

bin für tipps und hinweise, konstruktive kritik dankbar!

PHP:
<?php
$startdate = date('Y-m-d');
$anzahl_tage = '+14 days'; //STANDARD WENN NICHTS GEWÄHLT WIRD

#Query Produkt
$sql=mysql_query("SELECT 
p_id,produkt,pin_id FROM res_produkt where pin = 'zu' ");
echo mysql_error();
?>
<table style="width:100%" cellpadding="3" cellspacing="1">
<tr>
<td bgcolor="#F2F2F2">
<?php
#Nochmal Datums-for-Schleife für die Darstellung der Übersicht
for($today=$date=strtotime($startdate);$date<=strtotime($anzahl_tage,$today);$date=strtotime('+1 days',$date)) 
{
?></td>
<td bgcolor="#F2F2F2">
<?php echo date('d.m.Y',$date);?></td>
<?php
}
?>
</tr>
<?
while(list($p_id,$produkt,$zeitungsID)=mysql_fetch_row($sql))
{
?>
<tr>
  <td bgcolor="#F2F2F2">
<?php echo $produkt;?>  </td>  
<?php
#Nochmal Datums-for-Schleife für die Darstellung der Übersicht
for($today=$date=strtotime($startdate);$date<=strtotime($anzahl_tage,$today);$date=strtotime('+1 days',$date)) 
{
$datumDB = date('Y-m-d',$date);
#Query für den Belegungsplan
#Query für den Belegungsplan
$termine=mysql_query("SELECT
a.d_id,
a.datum,
a.benutzer,
a.bezeichnung,
a.z_id,
b.p_id,
b.produkt,
c.zeitung 
FROM 
res_daten as a, 
res_produkt as b, 
res_zeitung as c 
WHERE 
a.prod_id = b.p_id 
AND
a.z_id = c.zeitungs_id 
AND 
a.datum = '$datumDB' 
AND
b.produkt = '$produkt' 
AND 
a.z_id = '$zeitungsID' 
")or die(mysql_error());
#########
$row=mysql_fetch_assoc($termine);
?>  
  <td bgcolor="#F2F2F2"><?php if($datumDB == $row['datum']){echo 'ja';} ?></td>
<?
}
}
?>  
</tr>
</table>
 
Probier mal Folgendes:
PHP:
<?php

	#Query Produkt
	$result = mysql_query("SELECT p_id, produkt, pin_id FROM res_produkt WHERE pin = 'zu' ");
	echo mysql_error();
?> 
<table style="width:100%" cellpadding="3" cellspacing="1">
	<tr>
		<td bgcolor="#F2F2F2"></td>
<?php
	#Nochmal Datums-for-Schleife für die Darstellung der Übersicht 
	for( $i=0; $i<14; $i++ ) {
		echo '<th bgcolor="#F2F2F2">' . date('d.m.Y', time()+$i*86400) . '</th>';
	}
?>
	</tr>
<?php
	while( $row = mysql_fetch_assoc($result) ) {
		for( $i=0; $i<14; $i++ ) {
			$dates[] = 'a.datum="'.date('Y-m-d',$date+$i*86400).'"';
		}

?>
	<tr>
		<th bgcolor="#F2F2F2"><?php echo htmlspecialchars($row['b.produkt']); ?></th>
<?php

		#Nochmal Datums-for-Schleife für die Darstellung der Übersicht
		$query = "SELECT '.implode(', ', $dates).' FROM res_daten as a, res_produkt as b, res_zeitung as c WHERE a.prod_id = b.p_id AND a.z_id = c.zeitungs_id AND b.produkt = '".mysql_real_escape_string($row['produkt'])."' AND a.z_id = '$zeitungsID'"
		$termine = mysql_query($query) or die(mysql_error());
		#########
		$termin = mysql_fetch_num($termine);
		foreach( $termin as $val ) {
?>
		<td bgcolor="#F2F2F2"><?php if( $val ) {echo 'ja';} ?></td>
<?php
		}
	}
?>   
</tr> 
</table>
 
hi

danke für dein beispiel. leider keine erfolg. nur eine weisse seite.

PHP:
error_reporting(E_ALL); 

ini_set('display_errors', TRUE); // evtl. hilfreich

hab ich eingefügt, trotzdem wird nichts ausgegeben.
PHP version ist übrigens 5.0.4.

nach meinen tests stimmt was mit dieser query nicht
PHP:
        #Nochmal Datums-for-Schleife für die Darstellung der Übersicht
        $query = "SELECT '.implode(', ', $dates).' FROM res_daten as a, res_produkt as b, res_zeitung as c WHERE a.prod_id = b.p_id AND a.z_id = c.zeitungs_id AND b.produkt = '".mysql_real_escape_string($row['produkt'])."' AND a.z_id = ".$row['pin_id'].""
        $termine = mysql_query($query) or die(mysql_error());

$zeitungsID wird in deinem beispiel zu
PHP:
$row['pin_id']

PHP:
mysql_fetch_num
wird bei mir übrigens als ungültige funktion ausgegeben. aber auch wenn ich hier was ändere erhalte ich kein resultat.

ich hab noch nicht rausgefunden, an was es genau liegt...ev. ein tipp von dir?
 
Auf den ersten Blick waren es ein paar Syntaxfehler, des Weiteren lege ich dir nah, auch Querystrings einzurücken und ordentlich aufzuschreiben. Außerdem bringt ein Blick auf den gehighlighteten Syntax (wie hier im Forum zB über die [code=php]-Tags, oder in einem fähigen Editor oder einer PHP-IDE) oft schon die Problemaufklärung. Habe es mal nach bestem Gewissen ein wenig "verbessert":
PHP:
<?php
$query = "
    SELECT
        " . implode( ', ', $dates ) . "
    FROM
        res_daten as a,
        res_produkt as b,
        res_zeitung as c
    WHERE
        a.prod_id = b.p_id AND
        a.z_id = c.zeitungs_id AND
        b.produkt = '" . mysql_real_escape_string( $row['produkt'] ) . "' AND
        a.z_id = '{$row['pin_id']}
    ;";

$termine = mysql_query( $query ) || die( mysql_error() );

Gumbo meinte sicherlich die [phpf]mysql_fetch_row[/phpf] oder [phpf]mysql_fetch_assoc[/phpf] Funktion, wobei das "num" natürlich auf ersteres hindeutet. War sicherlich nur ein Vertipper.
 
ok, danke dir für den tipp.

bei der foreach-schleife erhalte ich eine fehlermeldung:
Warning: Invalid argument supplied for foreach() .....

wenn ich einfach
PHP:
<?php echo $val; ?>
ausgebe, erhalte ich spalten mit den jahreszahlen ab 1968....:confused:

der code:
PHP:
<?php
error_reporting(E_ALL); 

ini_set('display_errors', TRUE); // evtl. hilfreich 
    #Query Produkt
    $result = mysql_query("SELECT p_id, produkt, pin_id FROM res_produkt WHERE pin = 'zo' ");
    echo mysql_error();
?> 
<table style="width:100%" cellpadding="3" cellspacing="1">
    <tr>
        <td bgcolor="#F2F2F2"></td>
<?php
    #Nochmal Datums-for-Schleife für die Darstellung der Übersicht 
    for( $i=0; $i<7; $i++ ) {
        echo '<th bgcolor="#F2F2F2">' . date('d.m.Y', time()+$i*86400) . '</th>';
    }
?>
    </tr>
<?php
    while( $row = mysql_fetch_assoc($result) ) {
        for( $i=0; $i<7; $i++ ) {
            $dates[] = $row['datum']=date('Y-m-d',$date+$i*86400);
        }

?>
    <tr>
        <th bgcolor="#F2F2F2"><?php echo htmlspecialchars($row['produkt']); ?></th>
<?php     
		
		$query = "
    SELECT
        " . implode( ', ', $dates ) . "
    FROM
        res_daten as a,
        res_produkt as b,
        res_zeitung as c
    WHERE
        a.prod_id = b.p_id AND
        a.z_id = c.zeitungs_id AND
        b.produkt = '" . mysql_real_escape_string( $row['produkt'] ) . "' AND
        a.z_id = ".$row['pin_id']."
    ;";

$termine = mysql_query( $query ) or die( mysql_error() ); 		
$termin = mysql_fetch_assoc($termine);
				
        foreach( $termin as $val ) {
?>
        <td bgcolor="#F2F2F2"><?php echo $val;?></td>
<?php
        }
    }

?>   
</tr> 
</table>
 
die Fetch-Funktionen geben immer einen Datensatz zurück und schieben den Zeiger der Resource nach vorne - Es ist also sinnvoll, eine Whileschleife zu verwenden:
PHP:
<?php
$termine = mysql_query( $query ) or die( mysql_error() );         
while ($termin = mysql_fetch_assoc($termine)) {
?>
        <td bgcolor="#F2F2F2"><?php echo $termin['index'];?></td>
<?php
}

Eventuell solltest du dich mal über das EVA-Prinzip erkundigen: Eingabe, Verarbeitung, Ausgabe - In deinem Fall ist das alles mehr oder weniger zusammengewürfelt und dadurch erstmal schwerer überschaubar und des Weiteren leider auch schlechter wartbar. Nach dem EVA-Prinzip sähe das kleine Stückchen dann so aus:

PHP:
<?php
$result = mysql_query( $query ) or die( mysql_error() );
$termine = array();
while ($termin = mysql_fetch_assoc($result)) {
    // manipuliere $termin
    $termine[] = $termin;
}
// oder alternativ:
while ($termine[] = mysql_fetch_assoc($result));
array_pop($termine);

// ...

// Ausgabe
 
Zurück