Lost connection to MySQL server during query

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

  • Lost connection to MySQL server during query

    Hallo miteinander,

    ich bin schlicht am verzweifeln
    Zum System: hab EasyPHP mit PHP 5.2 und MySQL 5.0.27

    Ich bekomm die Fehlermeldung:

    Lost connection to MySQL server during query

    bei Inserts, was ich echt nicht kapier.

    Hab bisher immer nur mit Standard MySQL Anfragen gearbeitet, aber jetzt brauch ich für ein Studienprojekt Foreign Keys, Transaktionen.
    Drum benutz ich MySQLI in PHP und InnoDB Tables.

    Sieht dan folgendermaßen aus:
    ich mach erst ein paar Create Tables in ner Transaktion (mit oder ohne Transaktion ändert nix am Fehler) und danach Inserts.
    An der Syntax stimmt alles, wenn ich die direkt in phpmyadmin eingeb, dann klappts auch.
    Nur in meiner "setup.php" wills nicht funktionieren weil der anscheinend immer die Connection verliert! Ich blicks ned!
    Ich mach sogar direkt vor den Inserts nochmal die Connection auf, das hilft auch nix!

    Hab die Standardeinstellungen von EasyPHP, hab auch gelesen, dass der StandardTimeout bei 8 Stunden liegt... ich peils nicht

    Bin um jede Hilfe dankbar!

    Konkret mein Code:
    PHP-Code:
    $link mysqli_connect($host$dbuser$dbpw$db);
    echo 
    mysqli_error($link);
    if (
    $link) echo "connection ok";

    $createTables "
    START TRANSACTION;

    CREATE TABLE "
    .$prefix."_muscle (
    muscle_id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
    muscle_name VARCHAR(255) NOT NULL 
    ) ENGINE = innodb; 

    CREATE TABLE "
    .$prefix."_equipment (
    equip_id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
    equip_name VARCHAR(255) NOT NULL 
    ) ENGINE = innodb; 

    CREATE TABLE "
    .$prefix."_level (
    level_id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
    level_name VARCHAR(255) NOT NULL 
    ) ENGINE = innodb; 

    CREATE TABLE "
    .$prefix."_exercise (
    ex_id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
    ex_name VARCHAR(255) NOT NULL,
    partner BOOL NOT NULL ,
    description TEXT NOT NULL ,
    image VARCHAR( 255 ) ,
    rank FLOAT ,
    lastupdate DATETIME NOT NULL
    ) ENGINE = innodb;

    CREATE TABLE "
    .$prefix."_exercise_has_equip (
    ex_id INT UNSIGNED NOT NULL,
    equip_id INT UNSIGNED NOT NULL,
    FOREIGN KEY (ex_id) REFERENCES "
    .$prefix."_exercise(ex_id),
    FOREIGN KEY (equip_id) REFERENCES "
    .$prefix."_equipment(equip_id)
    ) ENGINE=innodb;

    CREATE TABLE "
    .$prefix."_exercise_has_muscle (
    ex_id INT UNSIGNED NOT NULL,
    muscle_id INT UNSIGNED NOT NULL,
    FOREIGN KEY (ex_id) REFERENCES "
    .$prefix."_exercise(ex_id),
    FOREIGN KEY (muscle_id) REFERENCES "
    .$prefix."_muscle(muscle_id)
    ) ENGINE=innodb;

    CREATE TABLE "
    .$prefix."_exercise_has_level (
    ex_id INT UNSIGNED NOT NULL,
    level_id INT UNSIGNED NOT NULL,
    FOREIGN KEY (ex_id) REFERENCES "
    .$prefix."_exercise(ex_id),
    FOREIGN KEY (level_id) REFERENCES "
    .$prefix."_level(level_id)
    ) ENGINE=innodb;

    COMMIT;
    "
    ;

    echo 
    "Create Tables:<br>".$createTables."<p>";

    $link mysqli_connect($host$dbuser$dbpw$db);
    echo 
    mysqli_error($link);
    if (
    $link) echo "connection ok";

    mysqli_multi_query($link$createTables);
    echo 
    mysqli_error($link);

    $inserts "
    INSERT INTO "
    .$prefix."_muscle (muscle_name) VALUES ('Bizeps'), 
    ('Trizeps'), ('Bauch oben'), ('Bauch unten'), ('Bauch seite'), ('Brust'), 
    ('Schulter'), ('Oberschenkel'), ('Waden'), ('Trapez'), ('Latissimus'), 
    ('Unterarm'), ('Oberschenkel hinten'), ('Gesäß');

    INSERT INTO "
    .$prefix."_equipment (equip_name) VALUES 
    ('Langhantel'), ('Kurzhantel'), ('Tube'), ('GymBall');

    INSERT INTO "
    .$prefix."_level (level_name) VALUES ('Anfänger'), 
    ('Fortgeschritten'), ('Profi');
    "
    ;

    echo 
    "Inserts:<br>".$inserts."<br>";

    mysqli_multi_query($link$inserts);
    echo 
    mysqli_error($link); 
    Zuletzt geändert von CrashOverwrite; 04.07.2008, 11:23.

  • #2
    Ich arbeite zwar auch mit mysqli.., allerdings mit der Klasse, nicht procedural. Und mysqli_multi_query() habe ich selber noch nie benutzt. Versuche doch einmal die Befehle einzeln abzusetzen. Und wenn du schon mysqli benutzest (was absolut nichts mit Transaktionen und Constraints zu tun hat), dann nimm doch gleich die Klasse. Das würde dann etwa so aussehen:
    PHP-Code:
    $link = new mysqli($host$dbuser$dbpw$db);
    echo 
    $link->error;
    if (
    $link) {
        echo 
    "connection ok<br />";
    }
    else{
        exit 
    mysqli_connect_error();
    }

    $sql "START TRANSACTION";
    $res $link->query($sql) or exit("Fehler: $link->error<br />Abfrage: $sql<br />");

    $sql "
        CREATE TABLE " 
    $prefix "_muscle (
            muscle_id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
            muscle_name VARCHAR(255) NOT NULL 
        ) ENGINE = innodb"

    $res $link->query($sql) or exit("Fehler: $link->error<br />Abfrage: $sql<br />");

    $sql "
        CREATE TABLE " 
    $prefix "_equipment (
            equip_id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
            equip_name VARCHAR(255) NOT NULL 
        ) ENGINE = innodb"

    $res $link->query($sql) or exit("Fehler: $link->error<br />Abfrage: $sql<br />");

    $sql "
        CREATE TABLE " 
    $prefix "_level (
            level_id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,..."
    ;
    /*
    ....................
    */
    $sql "COMMIT";
    $res $link->query($sql) or exit("Fehler: $link->error<br />Abfrage: $sql<br />");

    $inserts "
        INSERT INTO " 
    $prefix "_muscle (muscle_name) 
            VALUES 
                ('Bizeps'), 
                ('Trizeps'), 
                ('Bauch oben'), 
                ('Bauch unten'), 
                ('Bauch seite'), 
                ('Brust'), 
                ('Schulter'), 
                ('Oberschenkel'), 
                ('Waden'), 
                ('Trapez'), 
                ('Latissimus'), 
                ('Unterarm'), 
                ('Oberschenkel hinten'), 
                ('Gesäß')"
    ;
    $res $link->query($sql) or exit("Fehler: $link->error<br />Abfrage: $sql<br />");
    /*
    ....................
    */ 
    PS
    Bitte brich deinen Code um, horizontal scrollen macht keinen Spass
    Gruss
    H2O

    Kommentar


    • #3
      Danke! Mit den einzelnen Querys funktionierts. Hm, schade :/ Dachte mit dem MulitQuery kann ich mir sowas ersparen. Entweder es gibt da nen Trick mit den MultiQueries oder es ist noch verbugged.
      Mit der Klasse hatte ich auch scho gearbeitet, aber da ging das mit den Multiqueries auch ned.

      Den Multiquery wollt ich scho wegen der Transaktion einbauen. Wenn ich jetzt nen Fehler einbaue, dann ist das Zeug vor dem Fehler in der Datenbank drin, obwohl kein Commit kam.

      ich habs auch mit
      PHP-Code:
      if(!$res) {
          
      $link->query("ROLLBACK;");
              
      //oder $link->rollback(); geht auch nicht
          
      exit("Fehler: $link->error<br />Abfrage: $sql<br />");

      versucht, aber er rollt nicht zurück
      Hm hab grad gelesen, dass Create Tables nicht zurückgerufen werden können (http://dev.mysql.com/doc/refman/5.0/...roll-back.html) liegt wohl daran. Ist das nur in MySQL so?
      Dann macht ne Transaktion um die Creates ja gar keinen Sinn.
      Hm in der Vorlesung hatten wir aber Transaktionen um Creates, drum dacht ich wär das klug

      Kommentar


      • #4
        Original geschrieben von CrashOverwrite

        Hm hab grad gelesen, dass Create Tables nicht zurückgerufen werden können .... Ist das nur in MySQL so?
        Dann macht ne Transaktion um die Creates ja gar keinen Sinn.
        Ja, das habe ich völlig vergessen. Transaktionen machen für DDL-Statements keinen Sinn, da diese ein explizites COMMIT machen, und damit nicht rückgängig gemacht werden können. Das scheint auch nicht eine MySQL-Spezialität zu sein, ein ähnliches Verhalten ist auch für Oracle beschrieben.
        Deshalb hat es, wie du selber schon festgestellt hast, keinen Sinn, DDL-Statements in Transaktionen zu stellen
        Zuletzt geändert von H2O; 04.07.2008, 12:37.
        Gruss
        H2O

        Kommentar


        • #5
          In der Vorlesung hatten wir halt ein Beispiel in der Tabelle A foreign Key auf B und B nen Foreignkey auf A hat.

          Beispiel war Fakultät hat Prof als Dekan also Foreignkey auf Prof Tabelle und Prof ist Fakultät zugeordnet also Foreignkey auf Fakultät Tabelle.

          Henne/Ei Problem Lösung war mit ne Transaktion um die Table Creates, drum hats mich gewundert, dass es nicht funktioniert.

          Kommentar


          • #6
            Klar, in Vorlesungen ist immer alles ganz einfach. Da werden in schöner Regelmäßigkeit Patentlösungen gezeigt. Die Mehrheit davon funktioniert aber nur in der Theorie, weil sie in der Praxis einen Haufen Probleme mit sich bringen würden.
            Ich hatte mal einen altgedienten DBA als Mithörer in so einer Vorlesung. Das war ein Spaß! Er und der Dozent waren abwechselnd am Kopfschütteln.

            Kommentar


            • #7
              Das sich das von dir genannte Problem mit einer Transaktion lösen lässt, kann ich mir kaum vorstellen. MySSQL oder Oracle-DB's können das kaum gewesen sein. Aber grundsätzlich ist das ja kein Problem: einfach beide Tabellen erstellen und die Constraints (oder mindestens das zweite) nachträglich zufügen.
              Gruss
              H2O

              Kommentar

              Lädt...
              X