[MySQL 4.0] Suche durch mehrere Tabellen

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [MySQL 4.0] Suche durch mehrere Tabellen

    Mein Ziel ist es nach einem Schlüsselwort in meiner Artistendatenbank zu suchen.
    Dafür habe ich 2 Tabellen:

    - artists
    - tracks

    Dabei will ich das Schlüsselwort in den Datenfeldern artists.name, tracks.titel und tracks.album durchsuchen.

    Mit LIKE bin ich da leider nicht weitgekommen. Und mit MATCH AGAINST bin ich daran gescheitert, 2 Tabellen zu durchsuchen. Bei einer Tabelle hat es jedoch funktioniert.

    Meine Abfrage:

    SELECT tracks.id as trackid, tracks.titel as tracktitel, artists.id as artistid, artists.name as artistname, tracks.plays as plays, DATE_FORMAT(tracks.date, '%d.%m.%Y') as datum, genres.name as genre, tracks.downloads as downloads FROM tracks, artists, genres WHERE MATCH (artists.name,tracks.titel,tracks.album) AGAINST ('$keyword') AND tracks.artist_id=artists.id AND genres.id=tracks.genre_id ORDER BY tracks.date DESC;

  • #2
    so geht es, wenn deine spalten beziechnung richtig ist:


    SELECT
    tracks.id as trackid,
    tracks.titel as tracktitel,
    artists.id as artistid,
    artists.name as artistname,
    tracks.plays as plays,
    DATE_FORMAT(tracks.date, '%d.%m.%Y') as datum,
    genres.name as genre,
    tracks.downloads as downloads
    FROM
    tracks,
    artists,
    genres
    WHERE
    (
    artists.name like '%$keyword%'
    OR
    tracks.titel like '%$keyword%'
    OR
    tracks.album like '%$keyword%'
    )
    AND
    tracks.artist_id=artists.id
    AND
    genres.id=tracks.genre_id
    ORDER BY
    tracks.date DESC;
    Beziehung? Klar habe ich mit Beziehungen zu tun ... ich bin Datenbankprogrammierer :-D

    Kommentar


    • #3
      super, danke. hat prima funktioniert.

      Kommentar


      • #4
        Suche über mehrere Tabellen

        Ich hab mich mal einiger Beispiele angenommen die ich im Netz gefunden habe. Aber stoße solangsam an meine Grenzen und verzweifle.

        Folgendes Problem, ich habe 3 Tabellen zB. tbltext, tblartikel und tbllink nun will ich mit einer Suchfunktion alle drei nach einem Suchwort durchsuchen lassen. Alle drei Tabellen enthalten die selben spalten fldlink und descr

        Nun zu meinem bisherigen vorgehen:
        PHP-Code:
        <?php
        include_once("database.php");
        include_once(
        "pagination.php");
        $obj = new pagination();

        $selectPageLink="SELECT 
        tbllink.fldlink as ab, 
        tbllink.descr as ba,
        tbltext.fldlink as cd,
        tbltext.descr as dc,
        tblartikel.fldlink as ef,
        tblartikel.descr as fe FROM (tbllink,tbltext,tblartikel) WHERE (tbllink.descr LIKE '%
        $suche%' OR tbllink.fldlink LIKE '%$suche%' OR tbltext.descr LIKE '%$suche%' OR tbltext.fldlink LIKE '%$suche%' OR tblartikel.descr LIKE '%$suche%' OR tblartikel.fldlink LIKE '%$suche%')";
        $ptrQuery $obj->createPaging($selectPageLink,$suchlimit);
        ?>
        Nun hab ich zwei Probleme mit der Ausgabe. Diese erfolgt a) doppelt und b) nicht nach dem gesuchten wort. Auch wird nur eine Tabelle durchsucht obwohl alle drei durchsucht werden sollen. Die Ausgabe erfolgt folgendermaßen:
        PHP-Code:
         <!-- Form validation and Results block start -->
        <center><font color=red><?php if(!empty($error)) echo $error?></font></center>
        <div class="left">
                <p><table width="100%" border="0">
          <tr>
            <td width="10%">Adresse</td>
            <td width="90%">Beschreibung</td>
          </tr>
        </table>
        </p></div>        
                <?php
                
        while($result mysql_fetch_array($ptrQuery))
                {
                
        ?>
                <div class="left">
                <p><table width="100%" border="0">
          <tr>
            <td width="10%"><a href="<?=$result['ab']?>" target="_blank" title="<?=$result['ba']?>"/><img src="<?php echo $url ?>/images/home.png" width="32" height="32" /></a></td>
            <td width="90%"><?=$result['ba']?></td>
        </tr>
        </table>

        </p>
        </div>
                <?php
                
        }
                
        ?>
        <?php
                
        while($result mysql_fetch_array($ptrQuery))
                {
                
        ?>
                <div class="left">
                <p><table width="100%" border="0">
          <tr>
            <td width="10%"><a href="<?=$result['cd']?>" target="_blank" title="<?=$result['cd']?>"/><img src="<?php echo $url ?>/images/home.png" width="32" height="32" /></a></td>
            <td width="90%"><?=$result['dc']?></td>
        </tr>
        </table>

        </p>
        </div>
                <?php
                
        }
                
        ?>
        <?php
                
        while($result mysql_fetch_array($ptrQuery))
                {
                
        ?>
                <div class="left">
                <p><table width="100%" border="0">
          <tr>
            <td width="10%"><a href="<?=$result['ef']?>" target="_blank" title="<?=$result['fe']?>"/><img src="<?php echo $url ?>/images/home.png" width="32" height="32" /></a></td>
            <td width="90%"><?=$result['fe']?></td>
        </tr>
        </table>

        </p>
        </div>
                <?php
                
        }
                
        ?>
        <!-- Form validation and Results block end -->
        Irgendwo hab ich nen Fehler drin, find ihn aber nicht. Sieht einer etwas was ich nicht sehe?

        Danke vorab für die Hilfe

        Kommentar


        • #5
          In deiner Ausgabe dürfte nur die erste while-schleife durchlaufen werden. Sind alle Datensätze durch, liefert mysql_fetch_* false zurück - daher dürfte dein Script nicht mehr in die folgenden while-schleifen reingehen. Um dies zu erreichen musst du jeweils nach den Schleifendurchläufen den Ergebniszeiger zurücksetzen.
          Ihr habt ein Torturial durchgearbeitet, das auf den mysql_-Funktionen aufbaut?
          Schön - etwas Geschichte kann ja nicht schaden.
          Aber jetzt seht euch bitte php.net/pdo oder php.net/mysqli bevor ihr beginnt!

          Kommentar


          • #6
            Die mysql_* Funktionen sind veraltet und sollten nicht mehr verwendet werden. Informier dich mal über mysqli oder PDO.

            Davon abgesehen sollte man Verarbeitung nicht mit Ausgabe vermischen. Einfach gesagt: Datenbankabfragen haben inmitten der HTML-Ausgabe nichts verloren.

            Außerdem beachtest du nicht den Kontextwechsel. Ausgabe von Werten in HTML-Code muss immer mit htmlspecialchars() escaped werden. Und du hast eine schöne Sicherheitslücke gebastelt. Werte, die in SQL-Abfragen eingefügt werden, müssen ebenfalls mit der passenden Funktion escaped werden.
            Zuletzt geändert von h3ll; 17.06.2014, 11:25.

            Kommentar


            • #7
              Zitat von h3ll Beitrag anzeigen
              Einfach gesagt: Datenbankabfragen haben inmitten der HTML-Ausgabe nichts verloren.
              Ich seh da keine DB-Abfragen im HTML

              Zitat von h3ll Beitrag anzeigen
              ... Und du hast eine schöne Sicherheitslücke gebastelt. Werte, die in SQL-Abfragen eingefügt werden, müssen ebenfalls...
              ... und register_globals steht wohl auch auf on
              Ihr habt ein Torturial durchgearbeitet, das auf den mysql_-Funktionen aufbaut?
              Schön - etwas Geschichte kann ja nicht schaden.
              Aber jetzt seht euch bitte php.net/pdo oder php.net/mysqli bevor ihr beginnt!

              Kommentar


              • #8
                Zitat von Quetschi Beitrag anzeigen
                Ich seh da keine DB-Abfragen im HTML
                Sorry, da war ich wohl etwas vorschnell

                Und wo ichs grad seh: Die veralteten Tags wie <center> und <font> sollten auch nicht mehr verwendet werden.

                Kommentar

                Lädt...
                X