WernerK: in_array bei mehrdimensionalem array

Hallo,
ich bekomme von einer "fetchAll()" SQL Abfrage ein mehrdimensionales Array zurück.Siehe print_r Ausgabe unten
$check_type = get_type($ID);
ich möchte gerne prüfen ob es einen Wert schon gibt bevor ich einen neuen in die DB hinzufüge.
Bisher mache ich es so:

  
$found = "";  
foreach($check_type as $type){  
if($type['Type'] == $type){  
$found = "yes";  
echo "gefunden gleicher wert <br>";  
}  
}  
if($found != "yes"){  
 //insert  
}  

Gibt es keine Möglichkeit mit in_array das zu prüfen also ohne foreach Schleife?
So geht es ja nicht
if(in_array($type,$check_type[0]['PaperType'])){
echo "gefunden gleicher wert <br>";
}

  
Array  
(  
    [0] => Array  
        (  
            [TypeID] => 34  
            [Type] => job  
            [ID] => 3418  
        )  
  
    [1] => Array  
        (  
            [TypeID] => 35  
            [Type] => Special  
            [ID] => 3417  
        )  
  
    [2] => Array  
        (  
            [TypeID] => 39  
            [Type] => Super  
            [ID] => 4316  
        )  
  
    [3] => Array  
        (  
            [TypeID] => 40  
            [Type] => Super1  
            [ID] => 4317  
        )  
  
)  

Gruss
Werner

  1. Hi,

    Gibt es keine Möglichkeit mit in_array das zu prüfen also ohne foreach Schleife?

    Die Nutzerkomentare im Manual machen Vorschläge, wie man das umsetzen kann.

    ich möchte gerne prüfen ob es einen Wert schon gibt bevor ich einen neuen in die DB hinzufüge.

    Warum machst du das eigentlich nicht gleich datenbankseitig?
    Böte sich ein Unique Index nicht an?

    MfG ChrisB

    --
    Light travels faster than sound - that's why most people appear bright until you hear them speak.
    1. Hi ChrisB,

      Warum machst du das eigentlich nicht gleich datenbankseitig?
      Böte sich ein Unique Index nicht an?

      Danke für den Vorschlag. Du wirst lachen, das gibt es bereits.
      Allerdings besteht dieser aus zwei Spalten. Einmal aus
      "LanguageID" und "Type"
      Ich verstehe allerdings nicht so recht die Syntax. Du meinst ja vermutlich
      INSERT ... ON DUPLICATE KEY UPDATE

      Gruss
      Werner

      1. echo $begrüßung;

        » Böte sich ein Unique Index nicht an?
        Ich verstehe allerdings nicht so recht die Syntax. Du meinst ja vermutlich
        INSERT ... ON DUPLICATE KEY UPDATE

        Den Zusatz ON DUPLICATE KEY UPDATE brauchst du nur, wenn du im Bereits-Vorhanden-Fall den Datensatz ändern willst. Willst du einfach nur den Eintrag verhindern möchtest, machst du zum einen ein normales INSERT und zum anderen dich auf die Fehlermeldung "Duplicate entry ..." beziehungsweise deren Fehlermeldungsnummer gefasst. Die kannst du dann ignorieren und alle anderen Fehler wie gewohnt behandeln. Als weitere Möglichkeit gibt es auch noch INSERT IGNORE ...

        echo "$verabschiedung $name";

        1. Hallo dedlfix,

          machst du zum einen ein normales INSERT und zum anderen dich auf die Fehlermeldung "Duplicate entry ..." beziehungsweise deren Fehlermeldungsnummer gefasst. Die kannst du dann ignorieren und alle anderen Fehler wie gewohnt behandeln.

          hmm, diese Situation habe ich ja gerade. Ich bekomme einen sofortigen Abbruch mit einer Fehlermeldung "..Duplicate entry.." Das Script hört also auf wegen eines schweren Fehlers.
          Gerade dies wollte ich ja vermeiden mit meinem Versuch vorher festzustellen ob es den Wert schon gibt
          Gruss
          Werner

          1. echo $begrüßung;

            hmm, diese Situation habe ich ja gerade. Ich bekomme einen sofortigen Abbruch mit einer Fehlermeldung "..Duplicate entry.." Das Script hört also auf wegen eines schweren Fehlers.

            Dann schreib dein Script so um, dass es nicht abbricht. die() ist keine Fehlerbehandlung.

            Gerade dies wollte ich ja vermeiden mit meinem Versuch vorher festzustellen ob es den Wert schon gibt

            Vorher zu schauen ist die schlechteste Methode, denn zwischen Schauen und Einfügen kann ein parallel laufender Request eine Einfügung vorgenommen haben.

            echo "$verabschiedung $name";

            1. Hallo,

              Dann schreib dein Script so um, dass es nicht abbricht. die() ist keine Fehlerbehandlung.

              ich habe doch nirgends ein die() drin. Das Script bzw. PDO oder MySQL bricht doch selbst wegen dem Duplicate Error ab.

              Gruss
              Werner

            2. Hallo zusammen,
              ich habe nun mal zwei verschiedene Varianten ausprobiert um den Duplicate Entry Fehler zu vermeiden.
              Wie gesagt: Bei Refreshen des Browser und vorherigen Insert gibt es ohne Fehlerbehandlung folgenden Abbruch:

              Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry...

              Mache ich den Insert mit IGNORE
              $dbInsertType = $DBO->prepare("INSERT IGNORE INTO
              kommt im Fehlerfall keine Meldung und der Insert wird auch nicht gemacht. OK so.

              Ich kann es aber auch mit Try & Catch machen.
              try {
              $dbInsertType = $DBO->prepare("INSERT INTO ..
              } catch (PDOException $ex) {
              echo "Fehler wegen doppelten Werten <br>";
               }
              Allerdings habe ich das echo im Catch Teil nur zum testen. Im Original Script braucht / will ich das nicht. eigentlich bleibt dann das Catch leer.

              Jetzt stellt sich die Frage:
              Was ist sauberer oder besserer Programmierstil?

              Gruss
              Werner

              1. echo $begrüßung;

                Wie gesagt: Bei Refreshen des Browser und vorherigen Insert gibt es ohne Fehlerbehandlung folgenden Abbruch:

                Da du bisher nicht gesagt hattest, dass du PDO verwendest, ging ich vom (leider zu oft) allgemein üblichen "mysql_...() or die(...)" aus. Die mysql-Extension klagt über Fehler nur leise. Die schnellste und unsauberste Methode, auf Fehler zu reagieren ist, das Script sterben zu lassen. Deswegen empfahl ich, das Sterbenlassen wegzulassen. PDO wirft eine Exception, die du abfangen musst. Es gibt sicher noch andere Stellen in deinem Script, die potentiell misslingen können und dann ebenfalls eine Exception werfen. Auch um die müsstest du dich kümmern, wenn du ein robustes Script haben willst.

                Mache ich den Insert mit IGNORE
                kommt im Fehlerfall keine Meldung und der Insert wird auch nicht gemacht. OK so.

                Da du genau den Duplicate-Fall ignorieren willst, ist das so in Ordnung.

                Ich kann es aber auch mit Try & Catch machen.
                Allerdings habe ich das echo im Catch Teil nur zum testen. Im Original Script braucht / will ich das nicht. eigentlich bleibt dann das Catch leer.

                Es gibt noch mehr Ursachen für ein misslungenes Insert. Am besten ist, nur genau den Duplicate-Fehler zu ignorieren, und die anderen angemessen zu behandeln. Auf genau den Duplicate-Fehler kannst du (hoffentlich, ich hab mit PDO nicht so viel Erfahrung) prüfen, indem du das PDOException-Objekt untersuchst. Ich nehme an, mit $ex->getCode() kommst du an einen eindeutigen und von anderen Ursachen unterscheidbaren Wert. Probier das mal mit einem Duplicate-Fall und mit beispielsweise einem Syntax-Fehler im Insert-Statement.

                echo "$verabschiedung $name";