PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Schleife zum Auslesen aus DB. Bitte um Hulfe!


mattfi
06.12.2005, 23:13:17
Habe 2 Tabellen, "DE" und "DEF".
"DE" enthält als Fremdschlüssel den Primärschlüssel von "DEF", "ID_DEF"

Die folgende Schleife funktioniert nicht. Ich bitte um Hilfe!


<?php
error_reporting(E_ALL);

// Konfigurationsdatei laden und Verbindung herstellen:

include '../lib/mysql_config.php';
include '../lib/mysql_connect.php';

// Auslesen aus Tabelle "DE" aller TERM = 'Probe' und Speichern
// der entsprechenden ID_DEF-Werte in einem Array.

$sql = "SELECT
ID_DEF
FROM
DE
WHERE
TERM = 'Probe';";

$result = mysql_query($sql) OR die(mysql_error());
while($row = mysql_fetch_assoc($result)) {
$id_def = array($row['ID_DEF']);
}

// Auslesen aus Tabelle "DEF" und Ausgabe aller Einträge "DEF = "Irgendwas'"

foreach($id_def as $id_val {

$sql = "SELECT
DEF,
ANM
FROM
DEF
WHERE
ID_DEF = $id_val;";

$result = mysql_query($sql) OR die(mysql_error());
echo $row['DEF']."<br/> \n".$row['ANM']."<br/> \n";
}

?>

Opendix
06.12.2005, 23:18:08
und was geht nicht? irgednwelche fehler?

und benutz nächstes ma die PHP-tags ;)

mattfi
06.12.2005, 23:24:44
1) Parse error: Unexpected ';'
Aber ich denke, dabei wird es nicht bleiben. Ist das Schleifenkonzept ansonsten ok?
2) PHP-Tags: Meinst du die Anfangs-/Schlusstags? Ich wollte Platz sparen.

xabbuh
06.12.2005, 23:43:06
1) Parse error: Unexpected ';'
Aha, und in welcher Zeile?

mattfi
06.12.2005, 23:54:04
Habe in mein früheres Posting den Code nochmal in nicht für das Forum vereinfachter eingeügt. Darin in Zeile 34.

Opendix
06.12.2005, 23:54:42
in der foreach machst du die klammer nicht zu!

ich meinte die PHP-tags des forums... jetzt hast du CODE-tags genommen ;)

mattfi
07.12.2005, 00:01:27
Jetzt gibt mir PHP eine Seite mit den beiden Tags <br/> zurück -- und mit nix anderem. Es müsste schon dumm zu gegangen sein, wenn ich die Schleife richtig konstruiert hätte! :-(

Marilu
07.12.2005, 08:27:47
Versuch mal:

" ... WHERE ID_DEF = '$id_val'";

mattfi
07.12.2005, 12:14:19
Nö, nicht mit '$id_val'"; und nicht mit '$id_val';"; ändert sich an der Ausgabe irgendwas. Andererseits funktioniert meine Variablenanweisung im SQL-Befehl so, wie sie in meinem Code-Beispiel steht, schon in:
http://www.fachterminologie.info/Glossar/MySQL_Test_1.php. Dort loope ich aber nicht über beide Tabellen hinweg.

Es muss doch auch in diesem Forum sowas wie ein, zwei Obergurus geben, die sowas, wie ich machen möchte, schon mal in ähnlicher Form gemacht oder gesehen haben...?

Ich rufe jetzt einfach nochmals ganz laut nach ihnen: Bitte um Hiiiilfe!!!

Wie muss ich meine Schleife bauen, um mir für einen Suchbegriff TERM in der Tabelle DE alle Einträge zu er-loopen, deren Fremdschlüssel ID_DEF auszulesen und zwischenzuspeichern (ist ein Array wirklich dazu geeignet?) und anschließend für jeden Wert von ID_DEF die entsprechenden Einträge für DEF aus der Tabelle DEF zu holen?

Oder muss mit JOIN oder irgendeinem anderen, komplexeren SQL-Befehlen ausgefragt werden?

xabbuh
07.12.2005, 13:40:40
Wie muss ich meine Schleife bauen, um mir für einen Suchbegriff TERM in der Tabelle DE alle Einträge zu er-loopen, deren Fremdschlüssel ID_DEF auszulesen und zwischenzuspeichern (ist ein Array wirklich dazu geeignet?) und anschließend für jeden Wert von ID_DEF die entsprechenden Einträge für DEF aus der Tabelle DEF zu holen?

Keine Ahnung, ob ich dich jetzt richtig verstanden habe, aber ich würde es so machen:

SELECT
d1.foo,
d2.bar
FROM
DE AS d1
INNER JOIN
DEF AS d2
ON
d1.ID_DEF = d2.ID_DEF
WHERE
d1.foo = 'TERM'

mattfi
07.12.2005, 15:41:18
Danke, xabbuh.

Da ich seit gestern in dieser Frage vorwärts kommen musste, aber nicht kam, habe ich außerhalb des Forums mal mein Skript durchsehen lassen. Im Ergebnis steht nun folgendes:


<?php

error_reporting(E_ALL);

// Konfigurationsdatei laden und Verbindung herstellen:

include 'blabla.php';

// Auslesen aus Tabelle "DE" aller TERM = 'Probe' und Speichern
// der entsprechenden ID_DEF-Werte in einem Array.

$sql = "SELECT ID_DEF FROM DE WHERE TERM = 'Probe';";
$result = mysql_query($sql) OR die(mysql_error());
while($row = mysql_fetch_assoc($result)) {


Hier lag Fehler Nr. 1 (die Art, wie ich mein Array definiert habe):


$id_def[] = $row['ID_DEF'];
}

// Auslesen aus Tabelle "DEF" und Ausgabe aller Einträge "DEF = "Irgendwas'"

foreach($id_def as $id_val) {


Hier Fehler Nr. 2 (das zweite SELECT-Statement und das zweite mysql_fetch_assoc() überschrieben die ersten wegen Namensgleichheit):


$query = "SELECT DEF, ANM FROM DEF WHERE ID_DEF = '$id_val'";
$result = mysql_query($query) OR die(mysql_error());
$row_def = mysql_fetch_assoc($result);

echo $row_def['DEF']."<br/>\n".$row_def['ANM']."<br/> \n";
}

?>


Ich nehme an, dein Skript mit INNER JOIN stellt die Verkürzung dieses Skripts dar. Die automatische Verwendung von JOIN und UNION habe ich immer wieder in Access beobachtet, aber sie sind immer ein Buch mit sieben Siegeln für mich geblieben.
Ich möchte an dieser Stelle anregen, dass ihr diesen Teil ins PHP-Tutorial aufnehmt, denn die Art, wie dort Dinge für Dummies erklärt werden, finde ich eigentlich gut gelungen. Gerade die Prozedur, wie man durch immer wieteres Zusammenfassen und Kürzen von dem oben dargestellten Skript auf deines, xabbuh, kommt, fände ich sehr lehrreich.
(Es ist mir klar, dass wir uns hier im Bereich von SQL und nicht von PHP bewegen, aber es wäre m.E. trotzdem ein "Goodie" für das PHP-Tutorial.)

mattfi
07.12.2005, 15:52:18
Warum funktioniert
$id_def[] = $row['ID_DEF'];
und warum funktioniert nicht:
$id_def = array($row['ID_DEF']);
gerade auch im Hinblick auf das hier Gesagte:
http://tut.php-q.net/array.html#u5?

xabbuh
07.12.2005, 19:23:00
Mit $array[] wird ein Element an ein bestehendes Array angehängt. Es handelt sich hierbei also um eine Kurzschreibweise von array_push() (http://www.php.net/array_push). Mit $array = array() definierst du dagegen ein neues Array mit den Elementen, die du als Argumente an array() übergeben hast. Der bisherige Inhalt von $array wird dabei überschrieben.

mattfi
07.12.2005, 19:27:46
Genauso hatte ich das verstanden.
Dann verstehe ich aber nicht, wieso ich in meinem Fall Werte hinzufügte, da es das Array id_def zum Startzeitpunkt von while gar nicht gibt? (Ich muss aber zugeben, dass es das Array ab dem ersten Schleifendurchgang dann natürlich gibt...)

xabbuh
07.12.2005, 19:36:04
Beim ersten Aufruf von $array[] wird das Array angelegt.

mattfi
07.12.2005, 19:57:22
Jop, alles klar. Danke.

Wenn sie versuchen ein Arrayelement in ein Array hinzuzufügen, das es noch gar nicht gibt, wird ein neues Arrayelement erstellt. Wenn sie aber versuchen ein Arrayelement in eine Variable einzuzufügen, die kein Array ist, z.B. einen String, kommt eine Fehlermeldung. Quelle: http://tut.php-q.net/array.html#u2

Das habe ich wohl überlesen.