SQL MySQL query

Gajel

Banned
Registriert
Mai 2010
Beiträge
1.146
Hallo Leute,

ich hab mal paar fragen zu mysql query's. Bin gelernter Mediengestalter aber muss mich nun bissel durch sql und php "kämpfen".

Folgende ausgangssituation: Es gibt (noch) 2 tabellen.

Tabelle 1 (artikel):
[table="width: 500, class: grid"]
[tr]
[td]id[/td]
[td]titel[/td]
[td]bild[/td]
[td]status[/td]
[/tr]
[tr]
[td]944[/td]
[td]lenkrad[/td]
[td]lenrakd.jpg[/td]
[td]1[/td]
[/tr]
[/table]

Tabelle 2 (attribute):
[table="width: 500, class: grid"]
[tr]
[td]id[/td]
[td]artikel-id[/td]
[td]attribut[/td]
[td]wert[/td]
[/tr]
[tr]
[td]944-durchmesser[/td]
[td]944[/td]
[td]durchmesser[/td]
[td]30 cm[/td]
[/tr]
[tr]
[td]944-farbe[/td]
[td]944[/td]
[td]farbe[/td]
[td]schwarz[/td]
[/tr]
[/table]


Ich möchte jetzt für den beispielartikel gerne den titel, bild, status und beide attribute abfragen.

Das mache ich wie folgt:

$result = mysql_query("SELECT artikel.titel, artikel.bild, attribute.wert FROM artikel INNER JOIN attribute ON artikel.id = attribute.artikel-id WHERE artikel.id like '$term'")

or die(mysql_error());

Das klappt auch soweit ganz gut und ich lasse mich die abgefragten daten wie folgt ausgeben:

$row = mysql_fetch_array( $result );

echo '<br>' . "Name: ".$row['titel'];
echo '<br>' . "Bild: ".$row['bild'];
echo '<br>' . "Durchmesser: ".$row['attribut'];
echo '<br>' . "Farbe: ".$row['attribut'];

Das PROBLEM ist das die 2 attribute die zu dem lenkrad gehören, nicht korrekt ausgegeben werden bzw. es wird immer nur das erste attribut ausgegeben. Sieht dann wie folgt aus:

Name: lenkrad
Bild: lenkrad.jpg
Durchmesser: 30 cm
Farbe: 30cm

Ich suche jetzt eine möglichkeit beide attribute abzurufen bzw. auszugeben wo und wann ich lust habe, wie mit dem namen und bild. Diese kann ich ja nach lust und laune per .$row['titel']; oder .$row['bild']; ausgeben lassen.

Hab mich mal bissel durch google gewühlt und bin da auf while und arrays gestossen aber so richtig habe ich es trotzdem nicht hinbekommen

Grüße und besten dank im voraus.
 
Zuletzt bearbeitet:
Und wie initialisierst du $row?
Code:
while( $row = mysql_fetch_array( $result ) )
{
  echo '<br>' . "Name: ".$row['titel'];
  echo '<br>' . "Bild: ".$row['bild'];
  echo '<br>' . "Durchmesser: ".$row['attribut'];
  echo '<br>' . "Farbe: ".$row['attribut'];
}
Wäre für alle Treffer richtig.
 
Wenn du mehrere Zeilen als Ergebnis kriegst, brauchst du eine Schleife und musst darüber iterieren.
 
Habs eben gerade ergänzt. Siehe oben.

Edit. Yuuri, soweit war ich (mehr oder weniger) auch schon. Leider sieht die ausgabe dann wie folgt aus:

Name: lenkrad
Bild: lenkrad.jpg
Durchmesser: 30 cm
Farbe: 30 cm
Name: lenkrad
Bild: lenkrad.jpg
Durchmesser: schwarz
Farbe: schwarz

Und ich möchte die werte dann später unabhängig von der schleife irgend wo mitten in der php datei ausgeben. Z.B.

<h1><?php echo $row['titel'];?></h1>

Was ja auch klappt mit dem titel oder bild wenn ich es ohne while mache.
 
Zuletzt bearbeitet:
Ist der Denkfehler nicht genau an der Stelle?
Code:
  echo '<br>' . "Durchmesser: ".$row['attribut'];
  echo '<br>' . "Farbe: ".$row['attribut'];

Damit hast du doch den Fehler, dass alles doppelt ausgegeben wird.
Du musst, wenn ich dich jetzt richtig verstanden habe nur den Teil mit den Attributen in einer Schleife abarbeiten ;)

Entweder du legst ein Array an für die entsprechenden Attribute, oder du brauchst nur jeweils diese Attribute, dann kannst du auch einzelne Variablen nehmen und die an beliebiger Stelle verwenden.
 
Wenn ich nur den teil mit den attributen in der schleife abarbeite dann kriege ich folgendes wieder:

Durchmesser: 30 cm
Durchmesser: schwarz

+ ich habe das problem das ich später außerhalb der while schelife nicht auf die einzelnen attribute zugreifen kann wie ich lust habe. Als noob nervt sowas extreme.
 
Einfachste und schnellste (wahrscheinlich nicht elegantestes) Lösung: Noch ne 2. Abfrage hinterherschicken (die dann als Schleife) und Ergebnisse beider Abfragen in ein Array packen.
 
Elegant muss es definitiv nicht sein, da die daten eh weiter verarbeitet werden und der query dann keine rolle mehr spielt. Rain hast du mal eine hilfestellung über? ;)
 
benutz mal fetch_row(), dann bekommst ein indiziertes Array. Dann kannst die Werte über die Indexe rausholen und später weiterverarbeiten.

​Ist die einfachste und eleganteste Lösung.
 
$arr = array();

$query1 = mysql_query("SELECT `titel`, `bild`, `status` FROM `artikel` WHERE `id` = '".$id."';");
$row = mysql_fetch_assoc($query1);

$arr = $row;

$query2 = mysql_query("SELECT `attribut`, `wert` FROM `attribute` WHERE `artikel-id` = '".$id."';");
while ($row = mysql_fetch_assoc($query2) ) {

$arr[$row['attribut']] = $row['wert']


}

mysql_real_escape_string($id) aber vernünftigerweise verwenden
 
Du hast eher ein allgemeines Problem in der Art und Weise zu verstehen, wie die Daten herausgeholt werden. Du hast zwei Datensätze, die mittels Join verbunden werden, ergo zwei resultierende Datensätze mit den jeweiligen Attributen. Du musst also mehrmals mysql_fetch_array o.ä. aufrufen, damit auch alle Datensätze abgeholt werden. Die Funktion holt immer nur einen Datensatz aus den Ergebnissen.

Weiterhin frage ich mich gerade, wieso du Daten mit $row['attribut'] herausziehen kannst, wenn die Spalte doch wert heißt und du keinen Alias definiert hast?!

Ist zwar nicht schön, erfüllt aber seinen Zweck.
Code:
$id = mysql_real_escape_string( ... );

$q = mysql_query( "
SELECT
	a.titel,
	a.bild,
	t.attribut
	t.wert
FROM
	artikel a
		JOIN attribute t
			ON a.id = `t.artikel-id`
WHERE
	a.id = '$id'
" );

$Daten = array(
	'name' => '',
	'bild' => '',
	'durchmesser' => '',
	'farbe' => ''
);

while( $r = mysql_fetch_array( $q ) )
{
	$Daten['name'] = $r['titel'];
	$Daten['bild'] = $r['bild'];
	
	switch( $r['attribut'] )
	{
		case 'durchmesser': $Daten['durchmesser'] = $r['wert']; break;
		case 'farbe': $Daten['farbe'] = $r['wert']; break;
	}
}

echo '<br>' . "Name: ".$Daten['name'];
echo '<br>' . "Bild: ".$Daten['bild'];
echo '<br>' . "Durchmesser: ".$Daten['durchmesser'];
echo '<br>' . "Farbe: ".$Daten['farbe'];
Du musst deine Daten irgendwie rausholen, strukturieren und dann ausgeben. Holen, ausgeben, holen, ausgeben, ... ist kein guter Weg!
 
Vielen dank für die mühe schon mal an alle beteiligten. Ich werd mal eure vorschläge ausprobieren. :)
Ergänzung ()

Yuuri schrieb:
Du hast eher ein allgemeines Problem in der Art und Weise zu verstehen, wie die Daten herausgeholt werden

Das ist wohl wahr aber als noob auch normal denke ich ;)
Ergänzung ()

Yuuri schrieb:
Weiterhin frage ich mich gerade, wieso du Daten mit $row['attribut'] herausziehen kannst, wenn die Spalte doch wert heißt und du keinen Alias definiert hast?!

Sind nur tippfehler ;)
Ergänzung ()

Wenn ich dein code nutze yuuri dann kriege ich nur titel und bild ausgegeben. Farbe und durchmesser bleiben leer.

Edit: Tja man sollte immer auf klein- und großschreibung achten :rolleyes:

Danke! Fehlen jetzt nur noch die restlichen sachen :freak:
 
Zuletzt bearbeitet:
Zurück
Oben