problemzone: MySQL - Prüfen ob Eintrag exisitiert...

Guetn morgen liebe Forumsgemeinde,

also ich möchte prüfen ob ein Eintrag exisitiert (habe eine Tabelle mit den Spalten NAME und ID)

Das ganze mache ich mit einer Funktion die folgendermaßen aussieht:

function cod($ln)
     {
      //Zur Datenbank verbinden, geschicht in der Funktion
      $getadmindata = @mysql_query("SELECT * FROM artikel WHERE lagernr = '$ln';") or die("Ihre Daten konnten nicht aus der Datenbank gelesen werden !<br />\nVon MySQL angegebener Grund: <b>".mysql_error()."</b>");

$admindaten = mysql_fetch_assoc ( $getadmindata );
      if (empty($admindaten))
       {
        return false;
       }
      else
       {
        return true;
       }
     }

Wenn ich die Funktion nun aber folgendermaßen aufrufe:

if (cod($lagernr)) {die("Der Artikel konnte nicht in die Datenbank geschrieben werden, da schon ein Artikel mit dieser ID existiert.");}

bringt er mir keine Felermeldung. Egal ob die ID schon existiert oder nicht.

Wenn ich oben in der Funktion die Rückgabewerte tausche bringt er mir bei jedem Aufruf die FEhlermeldung, egal ob die ID existiert oder nict.

Also zur DB verbindet er, habe mal zu testen die Daten falsch eingegeben, dann bringt er ne FEhlermeldung, also verbindet er logischerweise ;-)

Was habe ich da falsch gemacht bzw kann mir ejamnd sagen wie ich das vielleicht anders lösen könnte?
Muss nicht sein, hauptsache es funktioniert ;-)

P.S.: Wenn ich die $admindaten ausgebe ist die leer, egel ob die ID existiert oder nicht.

Danke ;-)

  1. ops, also der query stimmt, habe die spalte lagernr genannt, habs nur beim posting falsch getippt.

    Soory.
    Aber das Problem besteht weitergin mit der gleichen Problemqtik, habe mich wie gesgat nur bei der ersten postng zeile vertippt ;)

    1. Hello,

      @mysql_query("SELECT * FROM artikel WHERE lagernr = '$ln';") or die("Ihre Daten konnten nicht aus der Datenbank gelesen werden !<br />\nVon MySQL angegebener Grund: <b>".mysql_error()."</b>");

      verbinden...

      $sql = "Select id_artikel from artikel where lagernr = '$ln'";
      $res = mysql_query($sql, $con);
      if (!$res)
      {
        ## Ausdruck des Bedauerns. Abfrage war nicht möglich
      }
      else
      {
        if (mysql_num_rows($res) > 0)
        {
          ## Ey Alda, da sinn scho Artikel mit diesa Numma
        }
        else
        {
          ## keine Nummer da
        }
      }

      So ist die Struktur. Nun mach ne vernünftige Funktion draus ;-))

      Harzliche Grüße aus http://www.annerschbarrich.de

      Tom

      --
      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
      Nur selber lernen macht schlau
      1. Moin

        @mysql_query("SELECT * FROM artikel WHERE lagernr = '$ln';") or die("Ihre Daten konnten nicht aus der Datenbank gelesen werden !<br />\nVon MySQL angegebener Grund: <b>".mysql_error()."</b>");

        verbinden...

        $sql = "Select id_artikel from artikel where lagernr = '$ln'";
        $res = mysql_query($sql, $con);
        if (!$res)
        {
          ## Ausdruck des Bedauerns. Abfrage war nicht möglich
        }
        else
        {
          if (mysql_num_rows($res) > 0)
          {
            ## Ey Alda, da sinn scho Artikel mit diesa Numma
          }
          else
          {
            ## keine Nummer da
          }
        }

        also wenn ich das so mache stirbt er immer ab weil die Abfrage nicht möglich war.
        Habe es jetzt so probiert:

        function cod($ln)
           {
         //Verbinden

        $sql = "Select warenname from 'artikel' where lagernr = '$ln'";
        $res = mysql_query($sql);
        {
          if (mysql_num_rows($res) > 0)
          {
            return true;
          }
          else
          {
            return false;
          }
         }
        }

        aber dann läst er wieder alle druch, egal ob es sie schon gibt oder nicht :(

        1. Mojnsen nochmal ;)

          @mysql_query("SELECT * FROM artikel WHERE lagernr = '$ln';") or die("Ihre Daten konnten nicht aus der Datenbank gelesen werden !<br />\nVon MySQL angegebener Grund: <b>".mysql_error()."</b>");

          verbinden...

          $sql = "Select id_artikel from artikel where lagernr = '$ln'";
          $res = mysql_query($sql, $con);
          if (!$res)
          {
            ## Ausdruck des Bedauerns. Abfrage war nicht möglich
          }
          else
          {
            if (mysql_num_rows($res) > 0)
            {
              ## Ey Alda, da sinn scho Artikel mit diesa Numma
            }
            else
            {
              ## keine Nummer da
            }
          }

          also wenn ich das so mache stirbt er immer ab weil die Abfrage nicht möglich war.
          Habe es jetzt so probiert:

          function cod($ln)
             {
           //Verbinden

          $sql = "Select warenname from 'artikel' where lagernr = '$ln'";
          $res = mysql_query($sql);
          {
            if (mysql_num_rows($res) > 0)
            {
              return true;
            }
            else
            {
              return false;
            }
           }
          }

          also den query am anfang hab ich logischwerweise weggemacht ;-)
          Wenn ich das ganze ohne Funktion mach gibter mirmauch den Error wo du "## Ausdruck des Bedauerns. Abfrage war nicht möglich" hingeschrieben hast...

          1. Hello,

            <?php   ### artikel_check.php ###

            $host = "           ";  ##  <--- hier ausfüllen
            $user = "           ";  ##  <--- hier ausfüllen
            $pw   = "           ";  ##  <--- hier ausfüllen

            $database = "       ";  ##  <--- hier ausfüllen

            $lagernr  =          ;  ##  <--- hier ausfüllen oder per Formular übertragen

            $con = mysql_connect($host,$user,$pw) or die("keine Serververbindung");
            $db  = mysql_select_db($database, $con) or die("Datenbank nicht zugänglich: ".mysql_error($con));

            Die Funktion liefert einen Wert größer 0, wenn nicht sichergestellt ist

            dass die Artilenummer frei ist

            abzuprüfen mit if artikel_check(nr) === 0

            function artikel_check($lagernr)
            {
              $ret = "keine Prüfung";

            $sql = "Select id_artikel from artikel where lagernr = '$lagernr'";
              $res = mysql_query($sql, $con);
              if (!$res)
              {
                ## Ausdruck des Bedauerns. Abfrage war nicht möglich
                $ret = "leider keine Abfrage möglich: ".mysql_error($con);
              }
              else
              {
                if (mysql_num_rows($res) > 0)
                {
                  ## Ey Alda, da sinn scho Artikel mit diesa Numma
                  $ret = "die Artikelnummer $lagernr existiert schon";
                }
                else
                {
                  ## keine Nummer da
                  $ret = 0,
                }
              }
              return $ret;    # kein Fehler aufgetreten, nummer nicht da
            }

            #-----------------------------------------------------------

            echo artikel_check($lagernr);

            ?>

            Anzumerken ist:

            Wenn die Verbindung innerhalb eines Scriptes mehrfach benutzt wird, baut man sie nur einmal auf und am Ende des Scriptes wieder ab (obwohl das PHP auch automatisch macht)

            Funktionen dieser Art sollten immer Fehlernummern zurückgeben und 0 für "kein Fehler". Am Anfang der Funktion sollte man immer die Annahme setzen, dass der schwerste Fehler aufgetreten ist.

            Harzliche Grüße aus http://www.annerschbarrich.de

            Tom

            --
            Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
            Nur selber lernen macht schlau
            1. Danke des war jetzt sogar für dumme verständlich ;-)

              Nur habe ich jetzt erkannt dass er bei der verbindungsfunktion schon stribt, was mir wiiederum unverständlich ist.

              ICh include die Datendatei mit den ganzen Funktionen gleich in der 2. Zeile des Scripts nach <?php

              Wenn ich die Funktion in ZEile 5 aufrufe gehts, wenn ich sie in Zeile 500 aufrufe gehts auch, nur wenn ichmsie da wo ich sie auch noch haben will aufrufe stirbt er.
              Nun ja, ich denke ds muss ich alleine lösen aber danke für deine Hilfe ;-)

              1. Hello,

                Nur habe ich jetzt erkannt dass er bei der verbindungsfunktion schon stribt, was mir wiiederum unverständlich ist.

                Wenn ich die Funktion in ZEile 5 aufrufe gehts, wenn ich sie in Zeile 500 aufrufe gehts auch, nur wenn ichmsie da wo ich sie auch noch haben will aufrufe stirbt er.

                Da würde ich mal vermuten:

                • Saphetti-Code
                • Mit Globals gearbeitet und irgendwo vergessen
                • Namensbereiche nicht geachtet

                Also:
                Keine Globals außer den PHP-Superarrays!
                Alle Konfigurationswerte als Konstanten definieren
                Alle Variablen initialisieren
                Jede (JEDE!) Fehlermeldungsmöglichkeit auswerten

                und dann noch was:

                Bau an den verscheidenen kritischen Stellen der Scripte ein

                if(DEBUG) { # gib Auskunft über: ... }

                ein.

                Wie die Auskunft auszusehen hat, regelt

                function auskunft($_wertearray,$einzelwert)
                  {
                    if (FILEONLY)
                    {
                      ## ausgabe in Log-Datei
                    }
                    else
                    {
                      ## echo der Werte
                    }
                  }

                Und DEBUG und FILEONLY deklarierst Du am Anfang des Scriptes als Konstanten, am besten in einer zentralen include-Datei. Dort könnten sie mittels Cookieabfrage gesetzt werden. Das ist ein elegantes Verfahren für Online-Debugging.

                Harzliche Grüße aus http://www.annerschbarrich.de

                Tom

                --
                Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                Nur selber lernen macht schlau
              2. yo,

                Nur habe ich jetzt erkannt dass er bei der verbindungsfunktion schon stribt, was mir wiiederum unverständlich ist.

                nur eine vermutung, falls du die verbindung über eine funktion aufrufst, hast du den datenbank-connector auch als rückgabewert der funktion ? ausserhalb der funktion verliert die variable nämlich ihre gültigkeit.

                Ilja

                1. Hm, also ich habe eine Funktion verbinde_zu_mysql(); die zu MySQL verbindet.

                  Und im Script wird dann zuerst diese Funktion ausgeführt.

                  Hm, aber wo dus grad sagts, die Funktion hat gar keinen Rückgabewert...

                  Jetzt habe ich es so gemacht wie bei den anderen auch, einfach verbinde_zu_mysql(); ohne or und ohne @.

                  Dann kommt aber wieder die Fehlermeldung, dass keine Abfrage möglich ist...

                  Danke, Problemzone.

                  1. Hello,

                    Hm, also ich habe eine Funktion verbinde_zu_mysql(); die zu MySQL verbindet.

                    Jetzt habe ich es so gemacht wie bei den anderen auch, einfach verbinde_zu_mysql(); ohne or und ohne @.

                    ##Irgendwo am Anfang:
                    $_error = array();

                    function verbinde_zu_mysql($host,$user,$pass,$dbname, &$_error)
                    {
                      $con = @mysql_connect($host,$user,$host);
                      if{!$con)
                      {
                        $_error[] = "Keine Verbindung zum Server möglich";
                        return false;  ## <-- dies ist der Rückgabewert der Funktion
                      }

                    $db = @mysql_select_db($dbname, $con);
                      id (!$db)
                      {
                        $_error[] = "Datenbank ist nicht erreichbar: ".mysql_error($con);
                        return false;  ## <-- Dies wäre der alternative Rückgabewert
                      }
                      return $con;     ## <-- Dies ist der Rückgabewert, wenn alles geklappt hat.
                    }

                    im Array $_error steht nun in der letzten Position die Fehlermeldung, wenn die Funktion false geliefert hat.

                    Vielleicht hat Dein User keine Zugriffsrechte auf die Datenbank?

                    Harzliche Grüße aus http://www.annerschbarrich.de

                    Tom

                    --
                    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                    Nur selber lernen macht schlau
                    1. Vielleicht hat Dein User keine Zugriffsrechte auf die Datenbank?

                      Doch.
                      Das ist a das Problem.
                      Er schreibt doch ein paar ZEilen später alles in die Datenbank.
                      Wenn ich die Prüfung nicht mache geht ja alles ohne Probleme, alles wird reingeschrieben...

                      1. Also, so siehts komplett aus:

                        function verbinde_zu_mysql() { // Diese Funktion stimmt garantiert, da er einige Zeilen darunter die Daten problemlos in die Datenbnak schreibt und dort wird auch diese Funktion zum verbinden verwendet !

                        $mysql_db_name = "XXXXX";
                        $mysql_pass = "XXXXX";
                        $mysql_user = "XXXXX";
                        $mysql_host = "XXXXX";

                        @mysql_connect($mysql_host,$mysql_user,$mysql_pass) or die("Die Verbindung zur Datenbank konnte nicht hergestellt werden !<br />\nBitte kontaktieren sie ihren Serviceprovider für weitere Informationen !<br>\nFehlermeldung: ".mysql_error());

                        @mysql_select_db($mysql_db_name) or die("Die Datenbank konnte nicht ausgewählt werden !<br />\nBitte kontaktieren sie ihren Serviceprovider für weitere Informationen !");
                        }

                        verbinde_zu_mysql();

                        function artikel_check($lagernr)
                        {
                          $ret = "keine Prüfung";

                        $sql = "Select warenname from artikel where lagernr = '$lagernr'";
                          $res = mysql_query($sql);
                          if (!$res)
                          {
                            $ret = "Leider keine Abfrage möglich, Grund:<br>\n ".mysql_error();
                          }
                          else
                          {
                            if (mysql_num_rows($res) > 0)
                            {

                        $ret = "Leider kann der Artikel nicht hinzugefügt werden, da schon ein Artikel mit der Lagernummer '$lagernr' existiert.<br>\n<a href = "list.php?action=show&artikel=$lagernr&step=2" target = "_blank">(Den Artikel anzeigen der schon mit dieser Lagernummer in der Datenbank steht)</a>";
                            }
                            else
                            {
                              $ret = 0;
                            }
                          }
                          return $ret;
                        }

                        if (artikel_check($lagernr)) {die(artikel_check($lagernr));}

                        So.
                        Und egal ob die LAgernummer schon existiert oder nicht, er bringt immer diese Fehlermeldung:

                        Leider keine Abfrage möglich, Grund:

                        ABER er gibt keinen Grund an, also mysql_error() ist leer.

                        *heul* warum geht das nicht? *aufdenbodenstampf*

                        1. HAbe es jetzt mal so probiert:

                          function artikel_check($lagernr)
                          {
                            $ret = "keine Prüfung";

                          $sql = "Select warenname from artikel where lagernr = '$lagernr'";
                            $res = mysql_query($sql);

                          if (mysql_num_rows($res) > 0)
                              {

                          $ret = "Leider kann der Artikel nicht hinzugefügt werden, da schon ein Artikel mit der Lagernummer '$lagernr' existiert.<br>\n<a href = "list.php?action=show&artikel=$lagernr&step=2" target = "_blank">(Den Artikel anzeigen der schon mit dieser Lagernummer in der Datenbank steht)</a>";
                              }
                              else
                              {
                                $ret = 0;
                              }
                            return $ret;
                          }

                          (nactürlich mit VErbindungsaufbau vorher ;-))

                          Geht auch nicht, speichert trotzdem alles, egal ob Nummer exist. oder nict.

                          Und ja, die Spalte warenname existiert und ist gefüllt.

  2. Nach stundenlangem rumpobieren wurde es mir jetzt zu blöde...

    Naja, jetzt hab ich einfach eine "SELECT * FROM artikel" -Abfrage gemacht un dann bei jeden Schleifendurchlauf geprüft ob $lagernr = $row['lagernr'] ist, wenn ja $error = true; und break;

    Jetzt funktionirts wenigstens..

    Naja, wenn alles immer problemlos funktionieren würde und ich keine Parse Errors mehr hätte wärs auch langweilig ;=)

    Schönen Tag noch euch allen.

    Mfg Problemzone.