kostenloser Webspace werbefrei: lima-city


Mehrere MySQL-Abfragen (mehrere Tabellen) gleichzeitig

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    s*****d

    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.
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. michaelkoepke

    michaelkoepke hat kostenlosen Webspace.

    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 ...
    while ($row = mysqli_fetch_assoc($abfrage)) {
    //...
    }
    while ($menu = mysqli_fetch_assoc($menuabfrage)) {
    //...
    }
    MFG Micha

    Beitrag zuletzt geändert: 30.6.2014 19:35:34 von michaelkoepke
  4. 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
  5. simon-d schrieb:
    ...
    SELECT * FROM Inhalt WHERE ID = '$seite'
    SELECT * FROM Menu
    gleichzeitig ausführen ist ein bisschen salopp formuliert ;)

    zeig mir die beiden 'creates' von den tabellen, dann zeige ich dir, wie es geht.
  6. Autor dieses Themas

    s*****d

    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.
  7. 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.
  8. @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
  9. Autor dieses Themas

    s*****d

    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.
  10. simon-d schrieb:
    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.
    obwohl eine lösung von dir schon angedeutet worden, trozdem muss ich 1-2 dinge loswerden.
    1. wie meinst du die abfrage
    SELECT * 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 zusammengefasst
    SELECT '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   | vc1       | vc2     | vc3        | lt      |
    +-----+-----------+---------+------------+---------+
    |   0 | Adresse   | Seite   | Unterseite | Article |
    | 999 | Title_1   | Link_1  |            |         |
    | ... | Title_?   | Link_?  |            |         |
    | 999 | Title_n   | Link_n  |            |         |
    +-----+-----------+---------+------------+---------+
    (i=integer, vcX=varchar, lt=longtext, 'SELECT 999 ...' ist nur eine alibihandlung [siehe UNION!] ;)
    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).

    nochmals
    Nein, 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
  11. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!