Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Problem mit mysql_fetch_array

Einklappen

Neue Werbung 2019

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

  • [Erledigt] Problem mit mysql_fetch_array

    Ich habe folgendes Suchscript. In einem Formular kann ich in einem Textfeld ein oder mehrere Suchbegriffe eingeben und mittels Kontrollkästchen die Felder, in denen gesucht werden soll, auswählen. Die Suche funktioniert, solange ich nur ein Feld auswähle, aber sobald ich zwei Felder auswähle, bekomme ich den Fehler

    Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /u/www/php/orbabyl8/Suche.php on line 34

    Woran kann das liegen. Ich bin Laie und hoffe, mir kann hier jemand helfen.

    Danke schon im voraus. Ach ja, folgend der Code.

    Dareios


    Code:
    <?
    
    "Content-type: text/html\n\n";
    "'<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">'", "\n";
    "<html><head>\n";
    echo "<title>Suchergebnis</title></head>\n";
    
    $link = mysql_pconnect("XXX","XXX","XXX");
    mysql_select_db("XXX",$link);
    
    $Suche = explode(" ", $_POST[Suche]); 
    $i = 1;
    
    foreach($_POST['seite'] as $value)
    {
    
        foreach($Suche as $anfrageteil) 
        { 
           $anfrage .= " ".$value." LIKE '%".$anfrageteil."%' "; 
           if($i < count($Suche)) 
              $anfrage .= "AND"; 
           $i++; 
        }
    
    }
    
      $query = "SELECT * FROM Biblmes WHERE".$anfrage; 
      $result = mysql_query($query, $link);
    
    
    while($row = mysql_fetch_array($result)) 
    { 
    
         if (empty($row[Zitat])) { 
            echo "$row[Autor] $row[Titel] $row[Buchdaten].
    
    "; 
         } 
         if (empty($row[Buchdaten])) { 
            echo "$row[Autor] $row[Titel] $row[Zitat].
    
    "; 
         } 
    
    } 
    
    ?>

  • #2
    Mehr Fehlerbehandlung und -ausgaben einbauen
    PHP-Code:
    <?php
    error_reporting
    (E_ALL);
    ini_set('display_errors'true);
    $link mysql_pconnect("XXX","XXX","XXX") or die(mysql_error());
    mysql_select_db("XXX",$link) or die(mysql_error());

    $Suche explode(" "$_POST[Suche]);
    $i 1;

    foreach(
    $_POST['seite'] as $value)
    {
        foreach(
    $Suche as $anfrageteil)
        {
            
    $anfrage .= " ".$value." LIKE '%".$anfrageteil."%' ";
            if(
    $i count($Suche))
                
    $anfrage .= "AND";
            
    $i++;
        }
    }

    $query "SELECT * FROM Biblmes WHERE".$anfrage;
    $result mysql_query($query$link) or die(mysql_error().': '.$query);

    while(
    $row mysql_fetch_array($result))
    {
        if (empty(
    $row[Zitat])) {
            echo 
    "$row[Autor] $row[Titel] $row[Buchdaten].

    "
    ;
        }
        if (empty(
    $row[Buchdaten])) {
            echo 
    "$row[Autor] $row[Titel] $row[Zitat].

    "
    ;
        }
    }
    ?>

    Kommentar


    • #3
      Wenn du, wie von Bruchpilot schon gesagt, das Error-Reporting eingeschaltet hättest, dann wären noch mehr Fehler angezeigt worden.
      Ich würde das etwa so lösen:
      PHP-Code:
      error_reporting(E_ALL); 
      echo 
      "Content-type: text/html\n\n
            <!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01//EN'>\n
            <html><head>\n"
      ;
      echo 
      "<title>Suchergebnis</title></head>\n";

      $link mysql_connect("XXX","XXX","XXX");
      mysql_select_db("XXX");

      $Suche explode(" "$_POST['Suche']);

      foreach(
      $_POST['seite'] as $value)
      {
          foreach(
      $Suche as $anfrageteil)
          {
             
      $anfrage[] = "$value LIKE '%$anfrageteil%'";
          }
      }
      $query "SELECT Autor, Titel, Buchdaten, Zitat
                       FROM Biblmes 
                       WHERE" 
      implode(' AND '$anfrage);
      $result mysql_query($query) or die("Fehler: " mysql_error() . "
      Abfrage: 
      $query");

      while(
      $row mysql_fetch_array($result))
      {
           if (empty(
      $row[Zitat])) {
              echo 
      $row['Autor'] . " " $row['Titel'] . " " $row['Buchdaten'] . "

      "
      ;
           }
           if (empty(
      $row[Buchdaten])) {
              echo 
      $row['Autor'] . " " $row['Titel'] . " " $row['Zitat'] . "

      "
      ;
           }

      Dabei musst du die aber bewusst sein, dass wenn sowohl in Zitat, wie auch in Buchdaten etwas enthalten ist, nichts ausgegeben wird.
      Vielleicht muss das so sein, andernfalls kannst du ja auch eine Tabelle benutzen, bei der die entsprechenden Fleder einfach leer bleiben:
      PHP-Code:
      echo "<table border='0'>";
      echo 
      "<tr><th>Autor</th><th>Titel</th><th>Buchdaten</th><th>Zitat</th></tr>\n";
      while(
      $row mysql_fetch_row($result))
      {
           echo 
      "<tr><td>" implode('</td><td>'$row) . "</td></tr>\n";
      }
      echo 
      "</table>"
      Gruss
      L

      Kommentar


      • #4
        Vielen Dank!

        Ich werde das dann gleich ausprobieren. Ich hätte nicht so schnell mit einer Antwort gerechnet.

        Dareios

        Kommentar


        • #5
          Noch ein kleines Problem

          Ein kleines Problem hätt ich noch. Der Code funktioniert sehr gut. Nur eins: Wenn ich mit AND suche, dann bekomme ich nur positive Ergebnisse, wenn sich die beiden Wörter, nach denen ich suche, in einem Feld befinden. Wenn ich allerdings einen Autorsnamen und dann ein Stichwort eingebe, bekomme ich kein Ergebnis.

          Kann man den Code so abändern, dass es auch auf mehrere Felder anspricht, also eine SQL-Anweisung wie folgende:

          SELECT * FROM Biblmes WHERE Autor Like '%esel%' AND Titel Like '%esel%'

          Nur müsste das Tabellenfeld variabel sein. Ich hoffe ihr könnt mir auch in dieser Hinsicht helfen, weil ich sehe gerade keine Lösung. Danke.

          Code:
          $Suche = explode(" ", $_POST['Suche']); 
          
          foreach($_POST['seite'] as $value) 
          { 
              foreach($Suche as $anfrageteil) 
              { 
                 $anfrage[] = "$value LIKE '%$anfrageteil%'"; 
              } 
          } 
          $query = "SELECT * 
                           FROM Biblmes  
                           WHERE " . implode(' OR ', $anfrage); 
          $result = mysql_query($query) or die("Fehler: " . mysql_error() . "
          Abfrage: $query");
          $num = mysql_num_rows($result);
          
          
          while($row = mysql_fetch_array($result)) 
          { 
               if (empty($row['Zitat'])) { 
                  echo $row['Autor'] . " " . $row['Titel'] . " " . $row['Buchdaten'] . "
          
          "; 
               } 
               if (empty($row['Buchdaten'])) { 
                  echo $row['Autor'] . " " . $row['Titel'] . " " . $row['Zitat'] . "
          
          "; 
               } 
          }

          Kommentar


          • #6
            Die Frage hab ich jetzt nicht ganz verstanden. Du hast ja mit OR verknüpft, also erhälst du ein Resultat, wenn das Stichwort in irgendeinem Attribut vorkommt. Aber vielleicht kannst du die Frage nochmals präzisieren.
            Ach ja, und hier zur Repetition wieder einmal der altbekannte Link: http://www.php-faq.de/q/q-sql-select.html
            Gruss
            L

            Kommentar


            • #7
              Ja, im Zug ist mir dann eingefallen, dass ich wohl ein wenig kompliziert geschrieben habe:

              Also das Problem ist folgendes:

              Wenn ich zum Beispiel einen Autorsnamen eingebe, sagen wir Müller, und dann gebe ich Australien ein, dann möchte ich dass nur die Datensätze ausgegeben werden, die den Autorsnamen und beispielsweise im Titel "Australien" enthalten. Bei großen Datenbanken ist das natürlich sinnvoll, wenn ein Autor viel geschrieben hat. Wenn ich bei mir nun zwei Begriffe eingebe, die ganz sicher als Zeichenketten zumindest in einem Datensatz vorkommen, dann sollte dieser Datensatz erscheinen, das passiert aber nicht ... leider.

              Wenn es überhaupt nicht möglich ist - mir fällt keine Lösung ein - dann arbeite ich statt Kontrollkästchen mit einzelnen Textfeldern.

              Ich danke für jeden Vorschlag. Der Code ist ja oben.

              Kommentar


              • #8
                Schreib dir den SQL-Befehl hin, so wie er funktionieren würde für deine Begriffe.

                Wie auch immer der sein mag:
                Code:
                SELECT * FROM buecherei WHERE autor LIKE '%ABC%' AND (title LIKE '%DEF%' OR description LIKE '%DEF%')
                Ich weiß nicht ob er so sein soll. Jetzt setz für ABC und DEF PHP Variablen ein, und lass dir clevere Bedingungen oder Schleifen einfallen um diese SQL-Befehle so zu erzeugen.
                Und schon hast dus. Ist meistens einfacher das Problem rückwärts zu lösen.

                Kommentar


                • #9
                  Ich hab das oben schon getan. Ich hab die SQL-Anweisung hingeschrieben und auch über phpmyAdmin in der Datenbank direkt ausprobiert. Nur wie ich da mit den Bedingungen und Schleifen umgehen soll, weiß ich noch nicht.

                  Dareios

                  Kommentar

                  Lädt...
                  X