Funktionsparameter übergeben

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

  • Funktionsparameter übergeben

    Hallo Community.

    Wer kann mir sagen, was an meinem Code falsch ist, dass er nicht funktioniert ?

    index.php
    PHP-Code:
    include "functions.php";
    echo 
    sqlabfrage("1"); 
    functions.php
    PHP-Code:
    function sqlabfrage($kat)
    {
        
    $sql mysql_query("SELECT 
                                kategorie,
                            COUNT(*) AS Anzahl
                            FROM 
                                user_items, "
    .SESSIONS_TABLE." s
                            WHERE 
                                user_id = s.session_user_id
                            AND
                                kategorie = '
    $kat'
                               GROUP BY 
                                kategorie"
    ) OR die(mysql_error());
        while(
    $row mysql_fetch_array($sql))
        {
        
    $row['Anzahl'];
        }
    return 
    $row;

    Als Ausgabe erscheint nichts, also nichtmal eine Fehlermeldung o.ä., obwohl error_reporting(E_ALL);

  • #2
    Was passiert denn? "Funktioniert nicht" ist - immer noch - keine Fehlerbeschreibung.

    (Außerdem übergibst du am Ende ein Array ... das kann man nicht mit echo ausgeben.)
    Zuletzt geändert von unset; 14.04.2008, 11:58.
    [FONT="Helvetica"]twitter.com/unset[/FONT]

    Shitstorm Podcast – Wöchentliches Auskotzen

    Kommentar


    • #3
      Lass dir halt die evaluierte Abfrage ausgeben. Möglicherweise existiert die Konstante «SESSIONS_TABLE» nicht.
      Und was willst du mit
      PHP-Code:
      while($row mysql_fetch_array($sql)){
          
      $row['Anzahl'];

      erreichen?
      Gruss
      H2O

      Kommentar


      • #4
        Jetzt funktioniert es.
        Mein Code in der functions.php sieht nun so aus:
        PHP-Code:
        function sqlabrage($kat)
        {
            
        $sql mysql_query("SELECT 
                                    kategorie,
                                COUNT(*) AS Anzahl
                                FROM 
                                    user_items, "
        .SESSIONS_TABLE." s
                                WHERE 
                                    user_id = s.session_user_id
                                AND
                                    kategorie = '
        $kat'
                                   GROUP BY 
                                    kategorie"
        ) OR die(mysql_error());
            
        $row mysql_fetch_array($sql);
            
        return 
        $row['Anzahl'];

        Lag das jetzt nur an der überflüssigen while-Schleife ? Denn auch mit der While-Schleife hat es direkt in der index.php, also ohne Benutzung einer Funktion, funktioniert.

        Kommentar


        • #5
          Mit einer if-Abfrage kann ich doch bestimmt sagen, dass wenn $row in der Funktion kein Ergebnis liefert, eine 0 ausgegeben wird...wie müsste sowas aussehen ? Etwa so ?

          PHP-Code:
          $row mysql_fetch_array($sql);
              if(
          $row "")
              {
              return echo 
          "0";
              }
              else
              {
              return 
          $row['Anzahl'];
              } 
          Aber wenn ich das genau so mache, kommt leider die Meldung unexpected T_ECHO...hab schon mehrere Varianten ausprobiert, das return vor echo weggelassen , aber alles hat nichts genutzt. ein Tip ?

          Kommentar


          • #6
            Das würde ich mit mysql_num_rows() machen. Allerdings fängst du nicht ab, dass es mehrere Ergebnisse geben könnte. In deinem Fall würde immer nur das erste Ausgegeben werden. Das ist insofern ok, dass du das auch wahrscheinlich haben willst, trotzdem belastest du die Datenbank damit.
            [FONT="Helvetica"]twitter.com/unset[/FONT]

            Shitstorm Podcast – Wöchentliches Auskotzen

            Kommentar


            • #7
              Ich habs jetzt mit der empty Funktion machen können. Bei mysql_num_rows geht das nicht. Es sind mehrere Spalten unbestimmter Anzahl, die durchlaufen werden und geschaut wird, in welchen bei der UserID des jeweiligen Users die gleichen Kategorien sind. Es sind also mehrere Zeilen die durchlaufen werden, aber das Ergebnis ist immer nur eine Zahl, niemals mehrere Zahlen.

              Kommentar


              • #8
                Original geschrieben von CosmoPhobia

                PHP-Code:
                ...
                    return echo 
                "0";
                ... 
                Aber wenn ich das genau so mache, kommt leider die Meldung unexpected T_ECHO.
                Natürlich kommt diese Meldung. Du versuchst ja die Konstante «echo» zurückzugeben, und die ist natürlich nicht definiert.
                Ausserdem gibt dir COUNT(*) ja schon 0 zurück, wenn nichts gefunden wurde. Und ich würde mit einem expliziten JOIN arbeiten:
                PHP-Code:
                function sqlabrage($kat){
                    
                $sql "
                        SELECT 
                            COUNT(*) AS Anzahl
                        FROM 
                            user_items u
                        INNER JOIN 
                            " 
                SESSIONS_TABLE " s ON u.user_id = s.session_user_id
                        WHERE 
                            kategorie = '
                $kat'";       
                    
                $res mysql_query($sql) OR die(mysql_error());
                                            
                    list(
                $anzahl) = mysql_fetch_array($sql);   
                    return 
                $anzahl;

                Gruss
                H2O

                Kommentar


                • #9
                  Also ich habe jetzt extra eine if-Abfrage in die Funktion geschrieben, weil er mir in dem Falle, dass er von einem Typ 0 gezählt hat, nichts angezeigt hat.
                  Wofür genau ist jetzt das INNER JOIN in meinem Fall ? Ich habe mich mal schlau gelesen, dass JOIN Überschneidungen mit anderen Tabellen wahrnimmt, aber habe den Zusammenhang zu meinem Beispiel noch nicht ganz verstanden. Bist du so nett, und erklärst mir grob mal, warum du denkst, dass es auch in meiner Abfrage gut aufgehoben wäre ?

                  Kommentar


                  • #10
                    Ich habe mich mal unter diesem Artikel mal ein wenig schlau gelesen, aber versteh immer noch nicht, warum ich in meiner Abfrage INNER JOIN verwenden soll, wenn ich doch nur eine tabelle anspreche...die UserID ist ja in der Tabelle auch vorhanden... Erklärung erwünscht...

                    PS. Habe es zwar jetzt so wie du mir empfohlen hast geändert, und es funktioniert auch, aber warum weiß ich immernoch nicht.....
                    Zuletzt geändert von CosmoPhobia; 14.04.2008, 20:19.

                    Kommentar


                    • #11
                      Es ist nicht so, dass es so wie due die Abfrage vorher gehabt hast, falsch war. Du hast ja auch auf zwei Tabellen zugegriffen. Es ist einfach ein wenig veraltet. Hier mal eine kleine Einführung in JOINS.
                      In deinem Beispiel heisst der INNER JOIN, dass nur die Zeilen gezählt werden, die eine Entsprechung in der in der SEESIONS_TABLE haben.
                      Wäre es ein LEFT JOIN (der in diesem Fall keinen Sinn macht) würden alle gezählt. Es gibt noch weitere Versionen von JOINS, die werden aber ehe selten gebraucht.
                      Gruss
                      H2O

                      Kommentar


                      • #12
                        Achso verstehe, d.h. also das er nicht die komplette SESSIONS_TABLE liest, und danach sich erst die Session des Users raussucht, sondern dass die Sortierung schon vorher, während der Abfrage, stattfindet, und das so die Datenflut erheblich reduziert...richtig ? Und LEFT JOIN zieht wohl nur beide Tabellen zusammen, und packt nur die redundanten Daten weg oder ?

                        PS. Danke für deine Antwort...

                        Kommentar


                        • #13
                          Original geschrieben von CosmoPhobia
                          Und LEFT JOIN zieht wohl nur beide Tabellen zusammen, und packt nur die redundanten Daten weg oder ?
                          Das stimmt nicht ganz. Ein kleines Beispiel Artikelgruppen und Artikel:
                          Code:
                          SELECT
                          	g.name gruppe,
                          	a.name artikel
                          FROM
                          	artiklegruppe g
                          LEFT JOIN
                          	artikel USING(grp_id)
                          bringt alle Artikelgruppen, ob es dazu Artikel hat oder nicht. Wenn du stattessen INNER JOIN schreibst, erscheinen nur diejenigen, zu denen es Artikel gibt
                          Gruss
                          H2O

                          Kommentar


                          • #14
                            Ich denke ich habs soo halbwegs verstanden. Danke für deine Aufmerksamkeit...Daumen hoch

                            Kommentar

                            Lädt...
                            X