Mehrere MySQL-Abfragen (mehrere Tabellen) gleichzeitig
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
abfrage
abfragen
adresse
array
artikel
beispiel
bezug
code
erstellen
inhalt
not
null
nummer
probieren
stehen
tabelle
union
unterseite
url
verbindung
-
Hallo!
Ich habe 2 Tabellen.
Einmal Menu und einmal Inhalt.
Ich will nun beide gleichzeitig abfragen. Aus Menu sollen alle Werte gewählt werden, bei Inhalt nur eine Zeile mit einer bestimmten ID. Also die Abfragen einzeln:
SELECT * FROM Inhalt WHERE ID = '$seite'
SELECT * FROM Menu
Wie schaffe ich, es diese Abfragen entweder in EINER Abfrage verbunden werden, oder beide getrennt gleichzeitig ausgeführt werden. Ich habe es schon damit versucht, doch das geht nicht:
$verbindung = mysqli_connect($sever, $user, $passwort, $datenbank); $abfrage = mysqli_query($verbindung, "SELECT * FROM Inhalt WHERE ID = '" . $seite . "'"); $menuabfrage = mysqli_query($verbindung, "SELECT * FROM Menu"); while ($row = mysqli_fetch_assoc($abfrage) && $menu = mysqli_fetch_assoc($menuabfrage)) { //... }
Ich habe nicht im Internet gefunden, was ich verstanden habe...
MfG. Simon D. -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Zwei Befehle gleichzeitig geht nicht, aber hintereinander!
Einfach Datenbankverbindung aufbauen
die erste Abfrage -> in Variable A speichern
die zweite Abfrage -> in Variable B speichern
Datenbankverbindung schließen
Dein Beispiel ist schon fast richtig! Nur so ...
MFG Michawhile ($row = mysqli_fetch_assoc($abfrage)) { //... } while ($menu = mysqli_fetch_assoc($menuabfrage)) { //... }
Beitrag zuletzt geändert: 30.6.2014 19:35:34 von michaelkoepke -
Hoi simon
Steht denn die Menu Tabelle in irgendeiner Verbindung mit der Inhalt-Tabelle?
Dann liesse sich das nämlich mittels eines Join erledigen. Ansonsten ist mir nicht so klar warum diese Abfrage verbunden werden soll?
Kannst du das etwas genauer erklären?
Gruess
Meron -
simon-d schrieb:
gleichzeitig ausführen ist ein bisschen salopp formuliert ;)
...SELECT * FROM Inhalt WHERE ID = '$seite'
SELECT * FROM Menu
zeig mir die beiden 'creates' von den tabellen, dann zeige ich dir, wie es geht. -
Hallo!
Ich werde mal schauen, ob ich das mit den mehreren whiles machen werde.
Nein, die Tabellen stehen nicht in Bezug zueinander.
Mit den "creates" meinst du wahrscheinlich den SQL-Code zum erstellen der Tabellen. Sollst du haben:
CREATE TABLE IF NOT EXISTS `Menu` ( `Nummer` int(11) NOT NULL, `Titel` varchar(10) NOT NULL, `Link` varchar(255) NOT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
CREATE TABLE IF NOT EXISTS `Inhalt` ( `Adresse` varchar(20) NOT NULL, `Seite` varchar(50) NOT NULL, `Unterseite` varchar(50) NOT NULL, `Artikel` longtext NOT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
Bis nachher. Ich werde dann mal weiter probieren.
MfG. Simon D. -
Wenn die Tabellen nicht in Bezug zueinander stehen, würde ich mir mal eingehende Gedanken über Sinn und Unsinn machen. Denn wenn es nötig ist, aus beiden Tabellen abzufragen, besteht auch irgendein Bezug zueinander.
-
@fabo hat es schon gesagt, nur dass es vielleicht nicht so eindeutig ist, was willst du eigentlich genau machen?
Nach allem was du uns jetzt geschrieben hast könnte ich mal meine Glaskugel bemühen und raten, dass du eine Seite mit einem bestimmten Inhalt anzeigen willst und dazu ein Menü, wo jeder Menüeintrag abgespeichert werden soll, oder?
Warum machst du das dann nicht auch genau so? Beispiel gefällig?
Template:<!Doctype html> <html> <head> <title><?php echo $inhalt['seite'] ?></Foo> </head> <body> <ul> <?php foreach($menu as $entry): ?> <li> <a href="<?php echo $entry['link']; ?>"><?php echo $entry['titel']; ?></a> </li> <?php endforeach; ?> </ul> <?php echo $inhalt['artikel']; ?> </body> </html>
PHP:<?php $inhalt = array(); $menu = array(); $mysqli = new mysqli(MYSQL_HOST, MYSQL_USER, MYSQL_PASSWORD, MYSQL_DB); $query = "SELECT `Seite`, `Artikel` FROM `Inahlt` WHERE id = ?"; if($stmt = $mysql->prepare($query)){ $stmt->bindParam('i', $pageId); $stmt->execute(); $stmt->bindResult($seite, $artikel); if(!$stmt->fetch()){ die("Fehler Seite existiert nicht"); }else{ $inhalt['seite'] = $seite; $inhalt['artikel'] = $artikel; } $stmt->close(); } $query = "SELECT `Link`, `Titel` FROM `Menu`"; if($stmt = $mysql->prepare($query)){ $stmt->execute(); $stmt->bindResult($link, $titel); while($stmt->fetch()){ $menu[] = array( 'link' => $link, 'titel' => $titel, ); } $stmt->close(); } include_once 'template.php';
Das Ganze ist wie immer ungetestet und weder besonders gut, noch besonders sinnvoll, aber es sollte funktionieren.
Aber es bleibt dabei, gleichzeitig gibt es nicht und ohne Angabe, was du überhaupt machen willst können wir dir nicht helfen.
Mit freundlichen Grüßen -
Hallo!
Danke für eure zahlreichen Antworten!
Ich habe mittlerweile bemerkt, dass ich viel zu kompliziert gedacht habe. Ich habe auch die Anfrage in mehrere while's aufteilen können.
MfG. Simon D. -
simon-d schrieb:
obwohl eine lösung von dir schon angedeutet worden, trozdem muss ich 1-2 dinge loswerden.
Hallo!
Ich werde mal schauen, ob ich das mit den mehreren whiles machen werde.
Nein, die Tabellen stehen nicht in Bezug zueinander.
Mit den "creates" meinst du wahrscheinlich den SQL-Code zum erstellen der Tabellen. Sollst du haben:
CREATE TABLE IF NOT EXISTS `Menu` ( `Nummer` int(11) NOT NULL, `Titel` varchar(10) NOT NULL, `Link` varchar(255) NOT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
CREATE TABLE IF NOT EXISTS `Inhalt` ( `Adresse` varchar(20) NOT NULL, `Seite` varchar(50) NOT NULL, `Unterseite` varchar(50) NOT NULL, `Artikel` longtext NOT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
Bis nachher. Ich werde dann mal weiter probieren.
MfG. Simon D.
1. wie meinst du die abfrageSELECT * FROM Inhalt WHERE ID = '$seite'
es schein niemanden zu stören, dass die spalte 'ID' in deinem create durch abwesenheit glänzt ;)
2. auf deine ursprüngliche frage ist die query in nur eine zusammengefasstSELECT 'Nummer' i, 'Adresse' vc1, 'Seite' vc2, 'Unterseite' vc3, 'Article' lt FROM Inhalt WHERE Seite='$seite' UNION SELECT 999 i, 'Title' vc1, 'Link' vc2, '' vc3, '' lt FROM Menu
was ein ergebnis in etwa so ausgibt:
(i=integer, vcX=varchar, lt=longtext, 'SELECT 999 ...' ist nur eine alibihandlung [siehe UNION!] ;)+-----+-----------+---------+------------+---------+ | i | vc1 | vc2 | vc3 | lt | +-----+-----------+---------+------------+---------+ | 0 | Adresse | Seite | Unterseite | Article | | 999 | Title_1 | Link_1 | | | | ... | Title_? | Link_? | | | | 999 | Title_n | Link_n | | | +-----+-----------+---------+------------+---------+
das heißt, die erste zeile ist dein article, die restlichen (alle) das menu. genau das ist aber das problem, weil
3. die erstellung von menues ist eine condition sine qua non für die erreichbarkeit von inhalten, deswegen ist bei jeder nichterreichbarkeit der hersteller des menues in einer beweispflich, um sich der direkten verantwortung zu befreien (oder auch nicht).
nochmalsNein, die Tabellen stehen nicht in Bezug zueinander.
so ist es! zu einem enzigen inhalt liest du alle vorhandenen menus ab. ich würde zwischen 'Inhalt' und 'Menu' dringend ein bezug herstellen, ja brutalst erzwingen.
Beitrag zuletzt geändert: 4.7.2014 10:50:38 von czibere -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage