Reiner: selbe Verbindung läuft irgendwie nicht seriell ab

Hi,

ich stehe gerade vor einem komischen Problem.
Ich mache eine(!) Verbindungs zur DB (MySQL) auf und speicher Daten in eine Tabelle, bei der ein Feld auf unique steht.
Vorher prüfe ich, ob das nicht schon drin ist (dann würde ich mir die ID holen), ansonsten: rein damit.

Jetzt habe ich mir mal die DB-Fehler ausgeben lassen und merke, das es dennoch knallt, d.h. doppelte Werte festgestellt werden.

Kann/darf das sein, daß ein und dieselbe Verbindung Ihre Werte nicht kennt? Das also nicht seriell abläuft?

Ich habe auch schon festgestellt, daß Daten, die das Programm gerade speichert in phpMyAdmin erst nach Ablauf sichtbar werden. Das beziehe ich mal darauf, daß das eben eine andere Verbindung ist.

Achso, der Typ ist myisam, also kein Problem bzgl. innodb-Transaktion oder so.

Gibt es da einen Schalter, damit das write-cache-ähnliche Verhalten abgeschaltet werden kann?

Danke und Gruß,
Reiner

  1. Hier mal der Teil, der das Problem verursacht:

    sub get_file_id
    {
        my ($url, $dbh) = @_;
        my ($fileID, $sql, $in, $success);

    # Anker abtrennen
        ($url, undef) = split(/#/, $url, 2);

    $sql  = "select id from sub_files where url = " . $dbh->quote($url);
        $in = $dbh->prepare($sql);
        $in->execute;
        $fileID = $in->fetchrow_array;
        $in->finish;

    if ((!$fileID) || ($fileID eq "") || ($fileID eq " "))
        {
            my $filetype = get_file_type($url);
            $sql = "insert into sub_files (url, filetype) values (".$dbh->quote($url).", '$filetype')";
            $in = $dbh->prepare($sql);
            $success = $in->execute;
            if ($success)
            {
                $fileID = $dbh->{'mysql_insertid'};
            }
            $in->finish;
        }

    return $fileID;
    }

    1. Fehler gefunden, etwas peinlich...

      Unser Feld ist auf 255 Zeichen beschränkt.
      So finde ich ihn natürlich beim direkten Vergleich nicht wieder und es knallt, wenn ich es nochmal machen will.

      Wie blöd von mir.

      Gruß
      Reiner

    2. $fileID = $in->fetchrow_array;

      ich bin mir nicht sicher, aber wenn du bekommst hier eine Arrayreferenz auf Arrays.

      if ((!$fileID) || ($fileID eq "") || ($fileID eq " "))

      und hier musst du dann auch entsprechend darauf zugreifen.
      if( !$fileID || !$fileID[0])

      Struppi.

      --
      Javascript ist toll (Perl auch!)
      1. .. aber wenn du bekommst hier eine Arrayreferenz auf Arrays.

        Peinlich. Das übliche Problem wenn man während des schreibens die Aussage ändert

        Struppi.

        --
        Javascript ist toll (Perl auch!)
      2. $fileID = $in->fetchrow_array;

        ich bin mir nicht sicher, aber wenn du bekommst hier eine Arrayreferenz auf Arrays.

        Sauber formuliert ja, wäre es ein Array.
        Bei aber nur einem abgefragten Wert, kann man das so machen.

        Gruß
        Reier

  2. ich stehe gerade vor einem komischen Problem.
    Ich mache eine(!) Verbindungs zur DB (MySQL) auf und speicher Daten in eine Tabelle, bei der ein Feld auf unique steht.
    Vorher prüfe ich, ob das nicht schon drin ist (dann würde ich mir die ID holen), ansonsten: rein damit.

    Du erzeugst die ID also selbst.

    Jetzt habe ich mir mal die DB-Fehler ausgeben lassen und merke, das es dennoch knallt, d.h. doppelte Werte festgestellt werden.

    Das kann eigentlich nicht sein, bist Du sicher dass die Einstellung DB-seitig OK sind? Liefer mal das Datendesign.

    Kann/darf das sein, daß ein und dieselbe Verbindung Ihre Werte nicht kennt? Das also nicht seriell abläuft?

    Das hat nichts mit der Verbindung zu tun.

    Ich habe auch schon festgestellt, daß Daten, die das Programm gerade speichert in phpMyAdmin erst nach Ablauf sichtbar werden. Das beziehe ich mal darauf, daß das eben eine andere Verbindung ist.

    Naja, was macht denn das phpMyAdmin, es exekutiert Abfragen, d.h. der Datenbestand beim datenserver ist möglicherweise immer anders als im Abfragetool dargestellt, das ist nun mal so mit RDBMSen.

    Gibt es da einen Schalter, damit das write-cache-ähnliche Verhalten abgeschaltet werden kann?

    Hoffentlich nicht.  ;)