bender.ac: Funktionsaufruf in while-Bedingung

Hallo,
mit den Zeilen
[PHP]$link=mysql_connect($db_server,$db_user,$db_pw);
$db=mysql_select_db($db,$link);
$sql = "SELECT * FROM $tab_group WHERE deleted = '0' ORDER BY name ASC";
$result = mysql_query($sql);
while ($myrow = mysql_fetch_array($result))
{
 ...
}[/PHP]
holt man sich ja einfach jeden Treffer in einem Schleifendurchlauf aus der DB und kann damit einfach ne Tabelle oder sowas füllen.

Nun hab ich zur Vereinfachung eine Funktion geschrieben, die das alles ein wenig kapselt:
der Prototyp: [PHP]function sqlselect ($db-nr, $tab-nr, $SELECT ,$WHERE, $LIMIT)[/PHP]
(Was da jetzt genau und wie übergeben wird ist egal, der sql-string ist okay)
Jedenfalls endet die Funktion mit
[PHP]return mysql_fetch_array($result);[/PHP]
Somit sollte nach meinem Verständnis möglich sein die Funktion
mit [PHP]while (sqlselect ($db-nr, $tab-nr, $SELECT ,$WHERE, $LIMIT))
{
...
}[/PHP]
aufzurufen und dann sollte ich das gleiche haben wie vorher nur wesentlich schlanker.

Nur endet das ganze in einer Endlosschleife.....
und ausgegeben wird immer nur der 1. Treffer
Hat da jmd einen Rat zu?

Gruß Achim

  1. Hi,

    der Prototyp: function sqlselect ($db-nr, $tab-nr, $SELECT ,$WHERE, $LIMIT)
    mit while (sqlselect ($db-nr, $tab-nr, $SELECT ,$WHERE, $LIMIT))

    die Leerzeichen hinter "sqlselect" gehören dort nicht hin, also so:

      
    function sqlselect($db-nr, $tab-nr, $SELECT ,$WHERE, $LIMIT)  
    // und:  
    mit while (sqlselect($db-nr, $tab-nr, $SELECT ,$WHERE, $LIMIT))  
    
    
    1. Hi,

      die Leerzeichen hinter "sqlselect" gehören dort nicht hin

      okay aber geändert hat das nix...

      Problem besteht nach wie vor wie beschrieben...

      Gruß
      bender.ac

      1. Okay,

        dann versuch mal statt dieser Zeile:

        while ($myrow = mysql_fetch_array($result))

        diese:
        while ($myrow = mysql_fetch_assoc($result))

        1. Okay,

          dann versuch mal statt dieser Zeile:

          while ($myrow = mysql_fetch_array($result))

          diese:
          while ($myrow = mysql_fetch_assoc($result))

          was soll das bringen? mysql_fetch_assoc und mysql_fetch_array sind nahezu ident, bei _array kann man sich halt aussuchen ob man ein nummeriertes oder ein assoziatives haben will (bez beides) - einen unterschied in der while schleife die diese lustige funtkion bis zur unendlichkeit aufruft wirds nciht geben

        2. @nic:
          ne das geht ja nicht!
          Ich habe eine Funktion welche das komplette $myrow Array zurückgeben soll und will den Funktionsaufruf (meine Funktion) in die Klammern bei while schreiben... -> siehe 1. Frage von mir...

    2. Hallo,

      function sqlselect ($db-nr, $tab-nr, $SELECT ,$WHERE, $LIMIT)
      die Leerzeichen hinter "sqlselect" gehören dort nicht hin

      sie stören aber auch kein bisschen. Du kannst in PHP -wie in vielen anderen Programmiersprachen- Leerzeichen setzen, soviel es dir sinnvoll und günstig erscheint, solange damit nicht reservierte Wörter, Bezeichner oder aus mehreren Zeichen zusammengesetzte Operatoren getrennt werden.

      Letztendlich ist es ein Stilfrage, ob man zwischen dem Funktionsnamen und der öffnenden Klammer ein Leerzeichen setzen möchte; es hat sich weithin eingebürgert, das bei Funktionsdefinitionen und -aufrufen nicht zu tun. Zwischen reservierten Wörtern und nachfolgenden Klammern allerdings schon, while (...) oder if (...) zum Beispiel.

      So long,
       Martin

      --
      "Life! Don't talk to me about life!"
        (Marvin, the paranoid android in Douglas Adams' "The Hitchhiker's Guide To The Galaxy")
  2. Mahlzeit,

    es ist eine gute Idee, Quellcode kenntlich zu machen. Es ist keine gute Idee, dafür einfach irgendwelche Fantasie-Tags zu benutzen. In der Forums-Hilfe findest Du Informationen, wie es funktioniert ... und lass dann bitte in Zukunft zwischen Deinem Text und dem Quellcode ein oder zwei Leerzeilen - ansonsten ist das nur noch ein buntes Zeichengewimmel.

    Jedenfalls endet die Funktion mit
    return mysql_fetch_array($result);
    Somit sollte nach meinem Verständnis möglich sein die Funktion
    mit ~~~php

    while (sqlselect ($db-nr, $tab-nr, $SELECT ,$WHERE, $LIMIT))

    {
    ...
    }

    
    > aufzurufen und dann sollte ich das gleiche haben wie vorher nur wesentlich schlanker.  
      
    Möglich ist es. Das gleiche wie vorher hast Du damit allerdings nicht.  
      
      
    
    > Nur endet das ganze in einer Endlosschleife.....  
      
    Klar. Schließlich gibt Deine Funktion "sqlselect" jedesmal etwas zurück, dass PHP irgendwie als TRUE interpretieren kann - und solange wird die while-Schleife halt immer wieder durchlaufen.  
      
      
    
    > und ausgegeben wird immer nur der 1. Treffer  
    > Hat da jmd einen Rat zu?  
      
    Sicher. Wenn Du den Quellcode der Funktion zeigst. Irgendwie ist nämlich nicht so ganz klar, WAS diese überhaupt macht. Setzt Du etwas bei jedem Schleifendurchlauf erneut eine Anfrage an die Datenbank ab? Dann wäre es kein Wunder, wenn Du immer nur den ersten Datensatz bekommst ...  
      
      
    MfG,  
    EKKi  
    
    -- 
    sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
    
    1. @EKKi

      hier die komplette Funktion:

        
      $db[0]['server']="localhost";  
      $db[0]['user']="root";  
      $db[0]['pw']="***";  
      $db[0]['db']="kvkrac_bv";  
      $tab[0][0]="tickets";  
        
      function sqlselect($verb, $tabnr, $SELECT ,$WHERE, $LIMIT)  
      {  
       global $db, $tab;  
       if($db[$verb]['status'] != 1)sqlopen ($verb);  
        
       if($SELECT=='')$SELECT='*';  
       if(is_array($WHERE))  
       {  
        foreach ($WHERE as $key => $value)  
        {  
         if($WHERE_str != '')$WHERE_str.=" AND ";  
         $WHERE_str.=$key." = '".$value."' ";  
        }  
       }  
       else $WHERE_str=$WHERE;  
        
       $sql="SELECT $SELECT FROM ".$tab[$verb][$tabnr]." WHERE $WHERE_str";  
       if(is_numeric($LIMIT))$sql.=" LIMIT ".$LIMIT;  
       $result = mysql_query($sql);  
       return mysql_fetch_array($result)  
      }  
      
      

      also zwei drei Worte dazu:
      Klar die Sache sieht wüsst aus und geht sicherlich einfacher aber ich komme damit ganz gut zurecht und außerdem lernt man mit der Zeit dazu :-)

      und der Aufruf soll so

        
      while(sqlselect($verb, $tabnr, $SELECT ,$WHERE, $LIMIT))  
      {  
         //für jedes Element was  
      }  
      
      

      aussehen.

      Wie gesagt der Aufruf liefert eine Endlosschleife aber ich verstehe nicht wieso.

      weil

        
      while ($myrow = mysql_fetch_array($result))  
      {  
         //für jedes Element was  
      }  
      
      

      ja auch funktioniert.

      Gruß bender.ac

      1. Mahlzeit,

        $sql="SELECT $SELECT FROM ".$tab[$verb][$tabnr]." WHERE $WHERE_str";
        if(is_numeric($LIMIT))$sql.=" LIMIT ".$LIMIT;
        $result = mysql_query($sql);
        return mysql_fetch_array($result)
        }

          
        Insofern hat sich [meine Vermutung](https://forum.selfhtml.org/?t=170741&m=1116546) ja bestätigt: Du sendest in jedem Schleifendurchlauf eine erneute Anfrage an die Datenbank (was schon absolut kaputt ist), holst Dir dann den ersten Datensatz des Ergebnisses und gibst ihn zurück.  
          
          
        
        > Wie gesagt der Aufruf liefert eine Endlosschleife aber ich verstehe nicht wieso.  
          
        [Das habe ich Dir schon gesagt](https://forum.selfhtml.org/?t=170741&m=1116546) ... s.o.  
          
          
        
        > weil  
        > ~~~php
          
        
        > while ($myrow = mysql_fetch_array($result))  
        > {  
        >    //für jedes Element was  
        > }  
        > 
        
        

        ja auch funktioniert.

        Sicher, Du vergleichst hier aber Äpfel und Birnen. mysql_fetch_array() holt bei jedem Aufruf den nächsten Datensatz aus einem Ergebnis. Du hingegen fragst bei jedem Schleifendurchlauf die Datenbank erneut ab und holst Dir jedesmal den ersten Datensatz der Ergebnismenge.

        MfG,
        EKKi

        --
        sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
        1. Tag,

          Sicher, Du vergleichst hier aber Äpfel und Birnen. mysql_fetch_array() holt bei jedem Aufruf den nächsten Datensatz aus einem Ergebnis. Du hingegen fragst bei jedem Schleifendurchlauf die Datenbank erneut ab und holst Dir jedesmal den ersten Datensatz der Ergebnismenge.

          Okay wenn man das so liest fällts mir auch auf... *schäm* Ich hatte irgendwie im Kopf das Array würde Zeilenweise durchlaufen oder so... so á la foreach() aber ist natürlich Blödsinn. Somit muss ich mir meine Funktion ein wenig umbauen:

          Das neue Ende sieht dann so

            
          while ($myrow=sqlconv(mysql_fetch_array($result)))$ret[]=$myrow;  
           return $ret;  
          
          

          und der Aufrauf so
          [code lang=php]
          $mytab=sqlselectfor(...);
          foreach($mytab as $myrow)
          {
          ...
          }
          [code]
          aus. Hat jmd ne Idee wie das noch handlicher wird?

          1. Hi,

            Das neue Ende sieht dann so

            while ($myrow=sqlconv(mysql_fetch_array($result)))$ret[]=$myrow;
            return $ret;

            
            >   
            > und der Aufrauf so  
            > [code lang=php]  
            > $mytab=sqlselectfor(...);  
            > foreach($mytab as $myrow)  
            > {  
            > ...  
            > }  
            > [code]  
            > aus.  
              
            Sieht immer noch reichlich bloedsinnig aus.  
              
            Wieso uebergibst du jetzt den Rueckgabewert von mysql\_fetch\_array als Parameter an deine Funktion?  
              
            Du gibst damit einen Datensatz in deine Funktion hinein - um aus deiner Funktion eben diesen Datensatz zurueckzugeben ...?  
              
            
            > Hat jmd ne Idee wie das noch handlicher wird?  
              
            Versuche erst mal zu verstehen, wie der "normale" Ablauf "Abfrage gefolgt von Schleife ueber Datensaetze" \*vernuenftig\* umgesetzt wird - bevor du versuchst, etwas in eine Funktion zu kapseln, das du offenbar noch nicht verstanden hast.  
              
            MfG ChrisB  
              
            
            -- 
            "The Internet: Technological marvel of marvels - but if you don't know \*what\* you're lookin' for on the Internet, it is nothing but a time-sucking vortex from hell."
            
      2. Hello,

        function sqlselect($verb, $tabnr, $SELECT ,$WHERE, $LIMIT)

        [...]

        $sql="SELECT $SELECT FROM ".$tab[$verb][$tabnr]." WHERE $WHERE_str";
        if(is_numeric($LIMIT))$sql.=" LIMIT ".$LIMIT;
        $result = mysql_query($sql);

        wo ist das mysql_free_result() ?

        return mysql_fetch_array($result)
        }
        [/code]

        Ein harzliches Glückauf

        Tom vom Berg

        --
        Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de
      3. echo $begrüßung;

        hier die komplette Funktion:

        Das sieht schon vom Ansatz her eigenartig aus. Es gibt mittlerweile objektorientierte Implementationen wie mysqli oder PDO. Besonders PDO ist recht anwenderfreundlich. Man kommt mit recht wenig Aufwand ans Ziel. Eine einfache Abfrage ist ohne Fehlerbehandlung in drei Zeilen abgehandelt. Siehe Example #2 des PDO-Unterkapitels Connections and Connection management.

        echo "$verabschiedung $name";