"Christmas - the time to fix the computers of your loved ones" « Lord Wyrm

php problem mit sql abfrage

bBU.CyTrobIc 24.02.2004 - 12:29 572 13
Posts

bBU.CyTrobIc

#include "billrulz.h"
Avatar
Registered: Oct 2000
Location: Hamburg
Posts: 1875
Folgender Codeschnipsel gibt mir nur die Werte zurück die direkt unter "while($rowa = mysql_fetch_array($r_sql_text)){" gefunden werden, die darunter verschachtelten werden nicht gefunden.

Aber ich weiss nicht warum,... und pls nicht über den stil meckern, wers besser kann kann gern einen neuen vorschlag posten :)

Code: PHP
   $z = 0; 
   $a_new = array(); 


   $r_sql_text = mysql_db_query($datenbk, $sql_text); 
   while($rowa = mysql_fetch_array($r_sql_text)){ 

      if($rowa[titel] != ""){ 
        $array = array('titel' => $rowa[titel], 'url' => $rowa[url], 'text' => $rowa[text], 'seit' => $rowa[seit], 'webmaster' => $rowa[benutzer], 'pos' => 3); 
         array_push($a_new, $array); 
       echo "3 "; 
        $z++;    
      } else { 

        $r_sql_such = mysql_db_query($datenbk, $sql_such); 
           while($rowb = mysql_fetch_array($r_sql_such)){ 
       
          if($rowb[titel] != ""){ 
             $array = array('titel' => $rowb[titel], 'url' => $rowb[url], 'text' => $rowb[text], 'seit' => $rowb[seit], 'webmaster' => $rowb[benutzer], 'pos' => 2); 
             array_push($a_new, $array); 
            echo "2 "; 
            $z++; 
          } else { 

             $r_sql_titel = mysql_db_query($datenbk, $sql_titel); 
                  while($rowc = mysql_fetch_array($r_sql_titel)){ 
       
               if($rowc[titel] != ""){ 
                    $array = array('titel' => $rowc[titel], 'url' => $rowc[url], 'text' => $rowc[text], 'seit' => $rowc[seit], 'webmaster' => $rowc[benutzer], 'pos' => 1); 
                     array_push($a_new, $array); 
                echo "1 "; 
                 $z++; 
               } 
              } 
          } 
         } 
      } 
   } 

    
   $z--; 
   for($i = 0; $i <= $z; $i++){ 
      echo("<br>\n"); 
      echo("<table width=\"800\" border=\"0\" cellspacing=\"1\" cellpadding=\"3\" bgcolor=\"#000000\">\n"); 
      echo(" <tr bgcolor=\"#EEEEEE\"> \n"); 
      echo("   <td colspan=\"3\"><font size=\"2\" face=\"Verdana, Arial, Helvetica, sans-serif\"><a href=\"".$a_new[$i]['url']."\" target=\"_blank\">".$a_new[$i]['titel']."</a></font></td>\n"); 
      echo(" </tr>\n"); 
      echo(" <tr bgcolor=\"#DDDDEE\"> \n"); 
      echo("   <td colspan=\"3\"><font size=\"2\" face=\"Verdana, Arial, Helvetica, sans-serif\">".$a_new[$i]['text']."</font></td>\n"); 
      echo(" </tr>\n"); 
      echo(" <tr bgcolor=\"#DDDDEE\"> \n"); 
      echo("   <td width=\"50%\"><font size=\"1\" face=\"Verdana, Arial, Helvetica, sans-serif\">Seitenanmeldung: ".$a_new[$i]['seit']."</font></td>\n"); 
      echo("   <td width=\"50%\" bgcolor=\"#DDDDEE\" align=\"right\"><font size=\"1\" face=\"Verdana, Arial, Helvetica, sans-serif\">Alle Seiten dieses Webmasters</font></td>\n"); 
      echo(" </tr>\n"); 
      echo("</table>\n"); 
      echo("<br>\n\n"); 
   } 
} 

watchout

Legend
undead
Avatar
Registered: Nov 2000
Location: Off the grid.
Posts: 6845
wo kommt sql_text und sql_such her?

und trotzdem: dein stil is shize, kein einziger comment und die struktur is total unübersichtlich - denn _wir_ (die nicht darüber meckern sollen/dürfen) müssen ja den code auch verstehen, damit wir dir helfen können

roye

Little Overclocker
Registered: Nov 2003
Location: Wien
Posts: 52
bekommst du überhaupt datensätze aus $sql_text, die keinen titel haben? ich würde mal im else zweig der ersten if abfrage ein echo hinzufügen um das zu kontrollieren.

bBU.CyTrobIc

#include "billrulz.h"
Avatar
Registered: Oct 2000
Location: Hamburg
Posts: 1875
Hi,

aus $sql_text bekomm ich werte, je nachdem wieviele geunden werden, aus $sql_such und $sql_titel kommen keine Daten, die Daten für $sql_text und die anderen beiden kommen von hier:

Code: PHP
//SUCHWÖRTER DURCHSUCHEN

   for($i = 0; $i <= $anzahl; $i++){
      if($i == 0){
	 $sql_such = $sql."such LIKE '%".$worte[$i]."%'";
      }
      if($i != 0 && $i != $anzahl) {
	 $sql_such = $sql_such." OR such LIKE '%".$worte[$i]."%'";
      }
   }

//TEXT DURCHSUCHEN

   for($i = 0; $i <= $anzahl; $i++){
      if($i == 0){
	 $sql_text = $sql."text LIKE '%".$worte[$i]."%'";
      }
      if($i != 0 && $i != $anzahl) {
	 $sql_text = $sql_text." OR text LIKE '% ".$worte[$i]."%'";
      }
   }

//TITEL DURCHSUCHEN

   for($i = 0; $i <= $anzahl; $i++){
      if($i == 0){
	 $sql_titel = $sql."titel LIKE '%".$worte[$i]."%'";
      }
      if($i != 0 && $i != $anzahl) {
	 $sql_titel = $sql_titel." OR titel LIKE '% ".$worte[$i]."%'";
      }
   }

es muss aber ein fehler in der schleife sein, wenn ich sie weglasse und jede abfrage einzelnd starte bekomme ich auch $sql_such und $sql_titel Datensätze ausgegeben (habe dann aber Datensätze doppelt, aber mit verschiedenen $pos Werten, und kann die doppelten deshalb nicht rausschmeissen)

Der Code ansich soll folgendes tun, wenn das erste der suchwörter nicht mit $sql_text gefunden werden soll $sql_such durchsucht werden, wird dort auch nichts gefunden soll $sql_titel durchsucht werden. Dann von vorne mit den 2 dann mit dem 3 suchwort usw.

thx

roye

Little Overclocker
Registered: Nov 2003
Location: Wien
Posts: 52
du bist zwar nicht genau auf meine frage eingegangen, aber wenn ich es richtig verstanden habe, sollte folgendes helfen:

Code: PHP
$z = 0; 
$a_new = array(); 
if($z <= 0) {
   $r_sql_text = mysql_db_query($datenbk, $sql_text); 
   while($rowa = mysql_fetch_array($r_sql_text)) {
      if($rowa[titel] != "") { 
         $array = array('titel' => $rowa[titel], 'url' => $rowa[url], 'text' => $rowa[text], 'seit' => $rowa[seit], 'webmaster' => $rowa[benutzer], 'pos' => 3); 
         array_push($a_new, $array); 
         echo "3 "; 
         $z++;     
      } 
   }
}
if($z <= 0) {
   $r_sql_such = mysql_db_query($datenbk, $sql_such); 
   while($rowb = mysql_fetch_array($r_sql_such)) { 
      if($rowb[titel] != "") { 
         $array = array('titel' => $rowb[titel], 'url' => $rowb[url], 'text' => $rowb[text], 'seit' => $rowb[seit], 'webmaster' => $rowb[benutzer], 'pos' => 2); 
         array_push($a_new, $array); 
         echo "2 "; 
         $z++; 
      }
   }
}
if($z <= 0) {
   $r_sql_titel = mysql_db_query($datenbk, $sql_titel); 
   while($rowc = mysql_fetch_array($r_sql_titel)) { 
      if($rowc[titel] != "") { 
         $array = array('titel' => $rowc[titel], 'url' => $rowc[url], 'text' => $rowc[text], 'seit' => $rowc[seit], 'webmaster' => $rowc[benutzer], 'pos' => 1); 
         array_push($a_new, $array); 
         echo "1 "; 
         $z++; 
      } 
   } 
} 

bBU.CyTrobIc

#include "billrulz.h"
Avatar
Registered: Oct 2000
Location: Hamburg
Posts: 1875
yo danke funtzt soweit, jetzt wird aber pro suchbegriff nur der erste treffer gematched, also wenn bei $sql_text schon was gefunden wird ja nicht mehr weitergesucht ob ein andere datenbankeintrag in $sql_such oder $sql_titel das suchwort enthält.

Achja @roye: ich bekomm bei $sql_text mit meiner schleife die richtigen datensätze aus der Datenbank. es wird halt nur nicht weitergesucht über die letzten beiden schleifen für such und titel.

thx dir schonmal bisher :) haste noch ne idee wie man jetzt noch alle 3 durchsuchen kann ?

roye

Little Overclocker
Registered: Nov 2003
Location: Wien
Posts: 52
Zitat von bBU.CyTrobIc
yo danke funtzt soweit, jetzt wird aber pro suchbegriff nur der erste treffer gematched, also wenn bei $sql_text schon was gefunden wird ja nicht mehr weitergesucht ob ein andere datenbankeintrag in $sql_such oder $sql_titel das suchwort enthält.

Achja @roye: ich bekomm bei $sql_text mit meiner schleife die richtigen datensätze aus der Datenbank. es wird halt nur nicht weitergesucht über die letzten beiden schleifen für such und titel.

thx dir schonmal bisher :) haste noch ne idee wie man jetzt noch alle 3 durchsuchen kann ?
Zitat von bBU.CyTrobIc
Der Code ansich soll folgendes tun, wenn das erste der suchwörter nicht mit $sql_text gefunden werden soll $sql_such durchsucht werden, wird dort auch nichts gefunden soll $sql_titel durchsucht werden. Dann von vorne mit den 2 dann mit dem 3 suchwort usw.

ich dachte das war der sinn dahinter, dass nur dann weitergesucht werden sollte, wenn NICHTS gefunden wurde, sonst könntest du ja gleich nur 1 sql statement, welches alle felder durchsucht, abfeuern!

bBU.CyTrobIc

#include "billrulz.h"
Avatar
Registered: Oct 2000
Location: Hamburg
Posts: 1875
ja das könnt ich machen, aber wie kann ich dann differenzieren in welchem Feld (text, such oder titel) das wort gefunden wurde ?

ich möchte die daten nähmlich danach ausgeben, oben sollen die datensätze stehen wo das suchwort in "text" gefunden wurde, darunter die wo das suchwort in "such" und ganz unten sollen die in "titel" gefundenen datensätze stehen.

roye

Little Overclocker
Registered: Nov 2003
Location: Wien
Posts: 52
dann würde ich auf die schnelle alle 3 sql abfragen durchrasseln und mich dann mit http://de.php.net/manual/de/function.array-unique.php beschäftigen :-)

watchout

Legend
undead
Avatar
Registered: Nov 2000
Location: Off the grid.
Posts: 6845
Zitat von roye
dann würde ich auf die schnelle alle 3 sql abfragen durchrasseln und mich dann mit http://de.php.net/manual/de/function.array-unique.php beschäftigen :-)
oder du machst es auf die art:
Code:
SELECT titel,[andere columns] FROM [table] WHERE [bla]
UNION
SELECT text,[andere columns] FROM [table] WHERE [bla]
UNION
SELECT woerter,[andere columns] FROM [table] WHERE [bla]

du siehst dann aber halt nicht wo titel aufhört und text anfangt, dafür sind die zeilen automatisch unique...

bBU.CyTrobIc

#include "billrulz.h"
Avatar
Registered: Oct 2000
Location: Hamburg
Posts: 1875
hmm... *****, andere möglichkeit gibts nicht ? mit array unique schmeiss ich ja doppelte raus, aber ich hab ja die variable $pos, die 1, 2 oder 3 sein kann, je nachdem in welchem abschnitt das wort gefunden wurde... deshalb funktioniert dies ja nicht mit unique.

Die funktion mit union sagt mir garnichts :)

roye

Little Overclocker
Registered: Nov 2003
Location: Wien
Posts: 52
dann würde ich vor dem reinspeichern in das array, abfragen ob dieser datensatz schon existiert, zum beispiel, du wirst ja irgendein unique feld in deiner tabelle haben. zum beispiel wenn "titel" dein index ist, in etwa so:
Code: PHP
$z = 0; 
$a_new = array();
$myindex = array();
$r_sql_text = mysql_db_query($datenbk, $sql_text); 
while($rowa = mysql_fetch_array($r_sql_text)) { 
   if($rowa[titel] != "" && $myindex[$rowa[titel]] != 1) { 
      $myindex[$rowa[titel]]=1;
      $array = array('titel' => $rowa[titel], 'url' => $rowa[url], 'text' => $rowa[text], 'seit' => $rowa[seit], 'webmaster' => $rowa[benutzer], 'pos' => 3); 
      array_push($a_new, $array); 
      echo "3 "; 
      $z++;      
   } 
} 
$r_sql_such = mysql_db_query($datenbk, $sql_such); 
while($rowb = mysql_fetch_array($r_sql_such)) { 
   if($rowb[titel] != "" && $myindex[$rowb[titel]] != 1) { 
      $myindex[$rowb[titel]]=1;
      $array = array('titel' => $rowb[titel], 'url' => $rowb[url], 'text' => $rowb[text], 'seit' => $rowb[seit], 'webmaster' => $rowb[benutzer], 'pos' => 2); 
      array_push($a_new, $array); 
      echo "2 "; 
      $z++; 
   } 
} 
$r_sql_titel = mysql_db_query($datenbk, $sql_titel); 
while($rowc = mysql_fetch_array($r_sql_titel)) { 
   if($rowc[titel] != "" && $myindex[$rowc[titel]] != 1) { 
      $myindex[$rowc[titel]]=1;
      $array = array('titel' => $rowc[titel], 'url' => $rowc[url], 'text' => $rowc[text], 'seit' => $rowc[seit], 'webmaster' => $rowc[benutzer], 'pos' => 1); 
      array_push($a_new, $array); 
      echo "1 "; 
      $z++; 
   } 
}
Bearbeitet von roye am 24.02.2004, 19:27

watchout

Legend
undead
Avatar
Registered: Nov 2000
Location: Off the grid.
Posts: 6845
Zitat von bBU.CyTrobIc
Die funktion mit union sagt mir garnichts :)
http://www.mysql.com/documentation/...ntax.html#UNION

bBU.CyTrobIc

#include "billrulz.h"
Avatar
Registered: Oct 2000
Location: Hamburg
Posts: 1875
thx roye aber das haut irgendwie nicht so richtig hin... muss ich nochmal schauen aber thx
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz