ccc: MySQL Abfrage in PHP-Funktion

Hallo,

gibt es irgendeine Regel oder irgend etwas, was verbietet in einer Funktion eine MySQL Abfrage zu machen? Ich habe nämlich sowas feines zusammengeschrieben, bekomm aber immer ne hübsche Fehlermeldung.

hier mal der Code:
function site($i)
{
    $connect = mysql_connect($db_host,$db_user,$db_pass);
    mysql_select_db($db1_name);
    if($i != "x")
    {
        $site_reason = "SELECT * FROM \_sites WHERE id = '".$i."'";
    }
    else
    {
        $site_reason = "SELECT * FROM \_sites WHERE id = '1'";
    }
    echo $site_reason;
    $get_site = mysql_query($site_reason);
    $sitename = mysql_fetch_array($get_site);
    mysql_close($connect);
    $n = $sitename[name];
return $n;
}

und die Fehlermeldung:
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in C:\xxx\functions.php on line 16

Wenn jemand einen Hinweis hat, ich wäre sehr Dankbar.

  1. Ich habe nämlich sowas feines zusammengeschrieben,

    Was feines? Soso, dann schauen wir mal:

    $connect = mysql_connect($db_host,$db_user,$db_pass);

    Woher weißt Du, daß die Verbindung geklappt hat?

    $site_reason = "SELECT * FROM \_sites WHERE id = '".$i."'";

    Hier nicht unbedingt wichtig, aber informiere Dich trotzdem mal über mysql_escape_string().

    $get_site = mysql_query($site_reason);

    Woher weißt Du, daß die Abfrage geklappt hat?

    $sitename = mysql_fetch_array($get_site);

    Wie kommst Du darauf, das Ergebnis von mysql_query() benutzen zu können, wo Du ohne Fehlerprüfung gar nicht weißt, ob da überhaupt ein brauchbares Ergebnis drin ist?

    Fazit: Nicht fein, eher reichlich vertrauensselig.

    Gruß,
      soenk.e

    1. $connect = mysql_connect($db_host,$db_user,$db_pass);

      Woher weißt Du, daß die Verbindung geklappt hat?

      $site_reason = "SELECT * FROM \_sites WHERE id = '".$i."'";

      Hier nicht unbedingt wichtig, aber informiere Dich trotzdem mal über mysql_escape_string().

      $get_site = mysql_query($site_reason);

      Woher weißt Du, daß die Abfrage geklappt hat?

      $sitename = mysql_fetch_array($get_site);

      Wie kommst Du darauf, das Ergebnis von mysql_query() benutzen zu können, wo Du ohne Fehlerprüfung gar nicht weißt, ob da überhaupt ein brauchbares Ergebnis drin ist?

      Also, ersteinmal danke, das du es dir angesehn hast. ich weiß, das alles funktioniert, da wenn ich mal das function site() und die netten 2 { } klammern wegnehm, das es dann funktioniert... also ist die abfrage, verbindung aufbauen usw... richtig und die variableninhalte stimmen auch alle ... nur die mysql abfrage funzt nicht ....

      1. Hello,

        Also, ersteinmal danke, das du es dir angesehn hast. ich weiß, das alles funktioniert, da wenn ich mal das function site() und die netten 2 { } klammern wegnehm, das es dann funktioniert... also ist die abfrage, verbindung aufbauen usw... richtig und die variableninhalte stimmen auch alle ... nur die mysql abfrage funzt nicht ....

        Warum fragst Du uns dann, wenn Du es doch besser weißt? *mit dem Fuß aufstampf und kreisch*

        Schau Dir mal die Antwort von Thomas Luethi an, und dann komm runter von Deinem Sockel.

        Liebe Grüße aus http://www.braunschweig.de

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
  2. Hallo,
    bei mir geht eine MySQL in einer function, aber alle variablen musst du übernehmen:

    ich hab es so gemacht:

    $extra = "extra";
    function extraformular($tbhtml, $extra)
    {

    $ex_abfrage = "SELECT * FROM $extra ORDER BY id";
    $ex_ergebnis = mysql_query($ex_abfrage);

    while($ex_row = mysql_fetch_object($ex_ergebnis))
       {
       echo "mein Text";
       }

    return $tbhtml;
    }

    das geht ohne probleme.

    MFG
    Andavos

    --
    http://www.rpgcommunity.de/clanwissen/index.php Webdesign, PHP, Clan-Aufbau und mehr
  3. Hello,

    $site_reason = "SELECT * FROM \_sites WHERE id = '".$i."'";

    Wenn jemand einen Hinweis hat, ich wäre sehr Dankbar.

    Erst, wenn Du mir erklärt hast, wofür die Backticks um _sites und um id gut sind.

    Liebe Grüße aus http://www.braunschweig.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
  4. Hallo,

    gibt es irgendeine Regel oder irgend etwas, was verbietet in einer Funktion eine MySQL Abfrage zu machen?

    Nein.
    Dein Problem ist, dass Du in der Funktion drin
    gewisse Variablen verwenden willst, die Du
    ausserhalb der Funktion definiert hast.

    function site($i)
    {
        $connect = mysql_connect($db_host,$db_user,$db_pass);

    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                                    wo sind die definiert?
    Tip: mit der Zeile
    global $db_host, $db_user, $db_pass;
    ganz am Anfang der Funktion kannst Du diese
    Variablen verfuegbar machen.

    Zudem hast Du kein vernuenftiges Fehlermanagement.
    Bei jedem Schritt solltest Du im Fehlerfall eine
    Meldung ausgeben, damit Du sofort weisst, _wo_
    etwas schief laeuft.

    Statt nur
     $connect = mysql_connect($db_host,$db_user,$db_pass);
    solltest Du z.B. schreiben:
     $connect = mysql_connect($db_host,$db_user,$db_pass)
       OR die("Fehler: Konnte nicht mit dem Datenbankserver verbinden.");
    u.s.w.

    Woher hast Du diesen schlechten Code ohne Fehlermanagement?

    Lies unbedingt mal das Manual und nimm dessen Code als Beispiel!
    http://www.php.net/manual/de/ref.mysql.php

    $site_reason = "SELECT * FROM \_sites WHERE id = '".$i."'";

    => http://www.dclp-faq.de/q/q-sql-select.html

    und die Fehlermeldung:
    Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in C:\xxx\functions.php on line 16

    ... ist vermutlich ein Folgefehler.
    Weil die Verbindung nicht hergestellt wurde,
    gibt es auch kein Resultat. So einfach ist das. ;-)

    Gruesse,

    Thomas

    --
    Dank /my/ automatisch ausgeblendet: JavaScript, ASP.
    Manuell "ausgeblendet": Threads mit Frames, Iframes und Scrollbalken im Subject...
    Bitte keine Mails mit Fachfragen - dafuer gibt es das Forum!
    1. Moin!

      Woher hast Du diesen schlechten Code ohne Fehlermanagement?

      Hallo Thomas!

      Schau Dir die gämgigen Bücher, selbst die so renomierter Verlage wie O'Reilly, Addison Wesley... an. Da steht der Schrott wirklich drin. Auch ein gewisser bekannter Herr K. veröffentlicht sowas. (gefunden erst kürzlich wieder mal in einem teuren und durchaus umfassenden Buch über MySQL). Es ist ein Trauerspiel. Wie sollen die "Jungprogrammierer" etwas vernünftiges lernen, wenn Ihnen ständig solcher Schrott vorgesetzt wird?

      MFFG (Mit freundlich- friedfertigem Grinsen)

      fastix®

      --
      Als Freiberufler bin ich immer auf der Suche nach Aufträgen: Schulungen, Development. Auch  für seriöse Agenturen.
      1. Woher hast Du diesen schlechten Code ohne Fehlermanagement?

        Schau Dir die gämgigen Bücher, selbst die so renomierter Verlage wie O'Reilly, Addison Wesley... an. Da steht der Schrott wirklich drin.

        Ohne die Bücher im Einzelnen zu kenen: Hier und da wird extra auf die Fehlerabfrage verzichtet, um sich ganz auf die Funktionsweise des Beispielcodes zu konzentrieren. IMHO auch eine durchaus akzeptable Vorgehensweise.

        Ist natürlich dumm für Leute, die nur den Code abtippen, anstatt auch mal den Begleittext zu lesen (in dem ausdrücklich auf den gekürzten Code hingewiesen wird)..

        Kurz: Nicht jedes Buch ist schlecht, es kann auch am Leser liegen.

        Gruß,
          soenk.e

      2. Hallo,

        Schau Dir die gängigen Bücher, [...] Da steht der Schrott wirklich drin.

        Das glaube ich sofort.

        Die armen Newbies tun mir ja schon leid.
        Da wagen sie sich an etwas neues, und beim
        ersten Fehlerchen wissen sie nicht weiter
        und fragen hier um Hilfe.

        Es ist wirklich eine Schande, was da offenbar
        an schlechten Beispielen in all den Buechern
        steht.

        Und ich kann mir durchaus vorstellen, dass es
        Buecher gibt, die das Fehlermanagement wirklich
        aussen vor lassen und genauso vertrauensselig
        und blauaeugig programmieren wie der "ccc" hier.

        Wie sollen die "Jungprogrammierer" etwas vernünftiges lernen, wenn Ihnen ständig solcher Schrott vorgesetzt wird?

        Wahrscheinlich bleibt uns wirklich nicht viel
        anderes uebrig, als sie auf die guten Vorbilder
        (Manual, dclp-FAQ) hinzuweisen und ihnen halt
        auch hier - so gut es geht - beizubringen, was
        sauberes und stabiles Programmieren bedeutet.

        Bei einem arroganten Script-Kiddie, das es erst
        noch wagt, sich "ccc" zu nennen, sind aber
        unsere didaktischen Bemuehungen wohl umsonst. ;-)

        Nachdem innert Stunden gleich zwei Newbies
        hier mit inexistenter Fehlerbehandlung
        aufgefallen sind, denke ich wieder mal,
        wie schoen es doch waere, wenn wir sie
        einfach zu einem Artikel oder FAQ-Eintrag
        schicken koennten, wo das ganze Schritt
        fuer Schritt erklaert ist.

        Gerade bei MySQL-Problemen kommen die
        Newbies ja oft mit der Fehlermeldung:
        "supplied argument is not a valid MySQL result resource"
        und wir sollen dann glaskugeln, an
        welcher Stelle der Fehler ist.
        Wenn ich's mir richtig ueberlege,
        sollte diese Fehlermeldung gar nie
        auftauchen, nicht wahr?

        Sei's drum - ich gehe jetzt offline...

        Schoenen Abend allerseits,

        Thomas

        1. Moin!

          Die armen Newbies tun mir ja schon leid.
          Da wagen sie sich an etwas neues, und beim
          ersten Fehlerchen wissen sie nicht weiter
          und fragen hier um Hilfe.

          Naja. Die hier antworten tun das ja aus den verschiedensten Motiven und deren beliebigen Mischungen heraus. Ich finds daher gut, wenn gefragt wird. Das Problem des Fragers ist weniger trivial als man allgemein annimmt. Es ist für "Newbies" nicht gerade ganz einfach den Umgang mit Funktionen und Variablen zu beherrschen.

          Es ist wirklich eine Schande, was da offenbar
          an schlechten Beispielen in all den Buechern
          steht.

          Da mag ja auch gelten, was Sönke Tech geschrieben hat. Aber es ist ein Fakt: Die Fehlerbehandlung kommt oft schlecht weg. Statt desse wird oft auch noch "schön" programmiert (komplexe Einzeiler...) Gerade bei komplexeren Themen sollten sich die Autoren mehr "am Arsch reissen".

          Wahrscheinlich bleibt uns wirklich nicht viel
          anderes uebrig, als sie auf die guten Vorbilder
          (Manual, dclp-FAQ) hinzuweisen und ihnen halt
          auch hier - so gut es geht - beizubringen, was
          sauberes und stabiles Programmieren bedeutet.

          ... Was Du sehr gut und absolut umfassend gemacht hast. Ich verteile eben manchmal ganz gerne Stupser um die Leute in die richtige Richtung zu weisen und hoffe auf deren eigene Intelligenz. Oder hoffe das die selbst darauf kommen, daß vor dem in phpinfo(); aufgeführten "_SERVER['yxz']" ein "$" gehört. Mir ist das ja seinerzeit auch gelungen.
          Da fällt mir auf: Du hast ihn nicht auf die ungarische Notation und deren unglaubliche Vorteile hingewiesen :)

          Bei einem arroganten Script-Kiddie, das es erst
          noch wagt, sich "ccc" zu nennen, sind aber
          unsere didaktischen Bemuehungen wohl umsonst. ;-)

          Du vermutest er meint mit "CCC" den bekannten Club? Naja. Das ist eine Möglichkeit. Eine andere ist "christiansen cash crash". Arrogant finde ich ihn jedenfalls nicht. Da gibt es gaaaaanz andere, die gleich mal loslegen wollen um einen Server zu kaufen und hosten zu lassen und hier fragen, welches OS und welcher Webserver denn zu empfehlen wäre. Nick selbstredend: "WebmasterGott" - oder sich hartnäckig weigern Quelltext zu veröffentlichen. Nein, ich habe Dein Smylie nicht übersehen.

          Gerade bei MySQL-Problemen kommen die
          Newbies ja oft mit der Fehlermeldung:
          "supplied argument is not a valid MySQL result resource"
          und wir sollen dann glaskugeln

          Naja. Ich selbst vermute bei der Fehlermeldung: die Verbindungaufnahme... obwohl die im bei mir .z.B. standardmäßig includierten Skript selbstredend eine Fehlermeldung ausgibt. Übrigens hatte er die ja... vielleicht hat er das Skript für die Veröffentlichung gekürzt.

          MFFG (Mit freundlich- friedfertigem Grinsen)

          fastix®

          --
          Als Freiberufler bin ich immer auf der Suche nach Aufträgen: Schulungen, Development. Auch  für seriöse Agenturen.
          1. Hallo fastix,

            Da fällt mir auf: Du hast ihn nicht auf die ungarische Notation und deren unglaubliche Vorteile hingewiesen :)

            Wie bitte? Davon habe ich noch nie etwas gehoert.
            OK, mit einem Stichwort und einer Suchmaschine
            kann man sich ja rasch weiterbilden. Gesagt - getan.

            Es geht offenbar um ein Schema, wie man
            Variablennamen bilden sollte.

            Verwendest Du es, oder meintest Du den
            Satz voellig ironisch?

            Du vermutest er meint mit "CCC" den bekannten Club?

            Ja, das vermutete ich, und fand es etwas
            anmassend

            Arrogant finde ich ihn jedenfalls nicht.

            Das erste Posting war nicht arrogant, und
            die Problembeschreibung und das
            Quellcode-Fragment waren fuer jemanden,
            der noch nie etwas von globalen und
            lokalen Variablen [*] gehoert hat und somit
            IMHO am Anfang seiner PHP-Karriere steht,
            sogar ueberdurchschnittlich brauchbar.
            (Mit Freuden stellte ich fest, dass er sich
            sogar die Query anzeigen laesst, bevor
            er sie an die Datenbank schickt.)

            Arrogant fand ich aber sein zweites Posting
            von 20.19 Uhr [pref:t=67286&m=384783].
            Dort lehnt er Soenkes Vorschlag, ein
            Fehlermanagement zu machen, schnoede
            ab mit einer Behauptung im Stil "es funktioniert
            ja normalerweise, nur jetzt in der Funktion
            nicht..." Das fand ich engstirnig, faul und dumm.

            Aber was soll's - Du hast recht, es gibt
            noch viel schlimmere und arrogantere
            Newbies...

            Und ja, es faellt mir manchmal schwer, mich
            in die Newbies hineinzuversetzen.
            Dass Konzepte wie Funktionen oder
            verschiedene Variablentypen ein
            Problem sein koennen, ist mir gar nicht
            mehr bewusst, da ich schon vor ca.
            12 Jahren mit TurboPascal "so richtig"
            zu programmieren anfing und mir diese
            Konzepte seither sehr gelaeufig sind.

            Gruesse,

            Thomas

            [*] http://www.php.net/manual/de/language.variables.scope.php

            1. Hello Thomas,

              jezt hast Du aber immer noch nicht die ungarische Notation erklärt. *schnüff*
              Muss ich jetzt tatsächlich selber googlen?

              http://www.bytelords.de/cowiki/251.html?cowiki=a925ea113ab9302558ca7e21342d9289

              Datentyp            Präfix      Beispiel
              ------------------  ----------  ----------
              globale Variable    g           gVariable
              Zeiger (Pointer)    p           pZeiger
              Feld (Array)        a           aiFeld
              Struct              s           sAdresse
              Void                v           pvDaten
              Unsigned            u           ucZeichen
              Short               s           siAnzahl
              signed              s           scZeichen
              Long                l           liPrimzahl
              Char                c           cZeichen
              Int                 i           iNummer
              Float               f           fGehalt
              Double              d           dKapital
              zero-terminated
              string              sz          szString

              Ich finde allerdings, dass in PHP andere Dinge viel wichtiger sind:

              -----PHP--------
              ALLESGROSS          Konstante   -> eigene und PHP
              $ALLESGROSS         mit $ davor -> PHP-Systemarray (sollten die ändern!)
              $_POST              mit $_      -> PHP-Systemarray, meistens mit externen
                                                 Daten
              $doof               einfache Scriptvariable, benutzerdefiniert! Globals(OFF)
              $php_errormsg       einzige Funktion mit $davor, liefert den
                                  letzten Fehler. Nach Aufruf gelöscht

              -----eigene-----
              $_schlau            mit $_ davor benutzerdefiniertes Array

              $_SERVER["PHP_SELF"] PHP-definiertes Array-Element
              $_data["name"]      benutzerdefiniertes Array-Element Scriptintern
              $_data["NAME"]      benutzerdefiniertes Array-Element mit Datenkopplung
                                  z.B. zur Datenbank

              ...   na, und so weiter. Wichtig ist ja, dass man es für seine
                    Scripte irgendwo dokumentiert und bei solchen, die man weitergibt
                    auch auf die Doku hinweist.

              Und für Funktionen sollte man sich auch Konventionen überlegen:
              (das ist meine Konvention, so als Idee)

              get_value()         liefert einen Wert oder ein Wertearray zur Weiter-
                                  verarbeitung
              put_value()         führt eigenständig eine Ausgabe auf die Standardausgabe
                                  durch, natürlich HTML-gerecht
              make_value()        erzeugt einen HTML-gerechten Ausgabestring, der dann
                                  später z.B. mit echo ausgegeben werden kann.

              ...                 na und auch hier usw.

              Und wenn man nicht OO programmiert dann kann als Präfix noch die Kennzeichnung der Include-Datei sinnvoll sein. Sonst kann es leicht passieren, dass die eigenen Includes später nicht mehr zusammenpassen und man einen cannot-redefine-Error bekommt.

              So, nun habe ich diesen Thread auch mal missbraucht, um meine Gedanken zu sortieren. Vielleicht gebt Ihr ja mal Rückmeldung, was Ihr von derartigen Konventionen haltet.

              Liebe Grüße aus http://www.braunschweig.de

              Tom

              --
              Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen