Mastershrimp: SQL importieren mit mysqli_multi_query: FK-Problem

Heyho!

Ich baue gerade einen Installer für mein System. Um die Datenbank aufzusetzen soll er eine .sql-Datei auslesen und mit mysqli_multi_query() ausführen.

Leider können die Tabellen nicht angelegt werden, weil InnoDB Probleme beim Anlegen der FK-Constraints hat.

Ich habe deshalb mal das Beispiel für mysqli_multi_query aus der PHP-Doku mit dem einfachen FK-Beispiel aus der MySQL-Doku kombiniert, einfach nur um irgendwas irgendwie ans Laufen zu kriegen:

  
<?php  
$link = mysqli_connect("localhost", "benutzer", "passwort", "datenbankname");  
  
/* check connection */  
if (mysqli_connect_errno()) {  
    printf("Connect failed: %s\n", mysqli_connect_error());  
    exit();  
}  
  
$query  = "CREATE TABLE parent (id INT NOT NULL,  
                     PRIMARY KEY (id)  
) ENGINE=INNODB;  
  
CREATE TABLE child (id INT, parent_id INT,  
                    INDEX par_ind (parent_id),  
                    FOREIGN KEY (parent_id) REFERENCES parent(id)  
                      ON DELETE CASCADE  
) ENGINE=INNODB;";  
  
/* execute multi query */  
echo "sending query";  
if (mysqli_multi_query($link, $query)) {  
    echo "start processing multi-query";  
    do {  
        /* store first result set */  
        if ($result = mysqli_store_result($link)) {  
            while ($row = mysqli_fetch_row($result)) {  
                printf("%s\n", $row[0]);  
            }  
            mysqli_free_result($result);  
        }  
        else  
            echo "no result returned";  
  
        /* print divider */  
        if (mysqli_more_results($link)) {  
            printf("-----------------\n");  
        }  
    } while (mysqli_next_result($link));  
}  
  
/* close connection */  
mysqli_close($link);  
?>  

Die Ausgabe ist eine weiße Seite mit "sending query". Er kommt also noch nicht einmal in die while-Schleife.

Führe ich SHOW ENGINE INNODB STATUS in phpMyAdmin aus, sagt der Fehler:
LATEST FOREIGN KEY ERROR
------------------------
100301 14:14:05 Error in foreign key constraint of table mec@002dcms/parent:
FOREIGN KEY (parent_id) REFERENCES parent(id)
                     ON DELETE CASCADE
) ENGINE=INNODB:
Cannot resolve column name close to:
) REFERENCES parent(id)
                     ON DELETE CASCADE
) ENGINE=INNODB

Woran liegt das? Die Beispiel-Codes aus den Dokus müssten doch eigentlich funktionieren....Kann ich das mit mysqli_multi_query nicht machen?

Das Verrückte: Wenn ich obiges SQL in phpMyAdmin ausführe, klappts.

Hat jemand ne Idee? Bin etwas verzweifelt gerade...

Mein System:

Server Version: 5.1.33-community

Apache/2.2.11 (Win32) DAV/2 mod_ssl/2.2.11 OpenSSL/0.9.8i PHP/5.2.9

MySQL-Client-Version: 5.0.51a

(XAMPP unter Windows Vista)

Viele Grüße

Mastershrimp

  1. Hi,

    nichts zum eigentlichen Problem, aber:

    Das Verrückte: Wenn ich obiges SQL in phpMyAdmin ausführe, klappts.

    PMA wird vermutlich nicht multi_query nutzen, sondern das in einzelne Statements aufsplitten, die dann nacheinander abgesetzt werden.

    MfG ChrisB

    --
    “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]
    1. PMA wird vermutlich nicht multi_query nutzen, sondern das in einzelne Statements aufsplitten, die dann nacheinander abgesetzt werden.

      Ja, das vermute ich auch. Ich war anfangs einfach auf der Suche nach einem möglichst einfachen und sicheren Weg, eine .sql-Datei zu importieren. Auslesen und mit ";" splitten ist mir zu unsicher, weil ein ";" ja auch in nem Text bspw vorkommen könnte. Und das dann auch noch zu berücksichtigen wird dann extrem haarig.

      Hatte mir mal angeguckt wie phpMyAdmin das macht und deren Lösung ist extrem unübersichtlich und über 100 Zeilen lang...deshalb kam mir mysqli_multi_query() ganz gelegen.

      Hast du das Script mal ausprobiert? Schlägt das bei dir auch fehl?

      Viele Grüße

      Mastershrimp

  2. Hi!

    Ich habe deshalb mal das Beispiel für mysqli_multi_query aus der PHP-Doku mit dem einfachen FK-Beispiel aus der MySQL-Doku kombiniert, einfach nur um irgendwas irgendwie ans Laufen zu kriegen:

    Das Biespiel im PHP-Handbuch behandelt zwei SELECT-Statements, die eine Ergebnismenge zurückliefern. Ein CREATE-Statement macht dies nicht, also ist eine Abfrage des Resultsets überflüssig. Wie das Handbuch allerdings im Abschnitt Return Values schreibt, ist jedoch zumindest der Aufruf von mysqli_next_result() notwendig, damit man die individuellen Fehlermeldungen abgefragt werden können.

    Die Ausgabe ist eine weiße Seite mit "sending query". Er kommt also noch nicht einmal in die while-Schleife.

    Das könntest du ja auch sehr schön sehen, wenn du das

    if (mysqli_multi_query($link, $query)) {

    um einen else-Zweig erweitertest:

    } else
      echo mysqli_error($link);

    Dann sähest du auch, was es zu beanstanden gibt.

    Lo!

    1. Ja, das ist ja alles schön und gut - was es zu beanstanden gibt sehe ich ja am besten mit SHOW ENGINE INNODB STATUS (Ergebnis hab ich im Anfangs-Posting eingefügt).
      mysqli_error() sagt nur "Cannot create table".

      Die Frage ist halt, warum das FK-Constraint fehlschlägt!

      Viele Grüße

      Mastershrimp

      1. Hi!

        Ja, das ist ja alles schön und gut - was es zu beanstanden gibt sehe ich ja am besten mit SHOW ENGINE INNODB STATUS (Ergebnis hab ich im Anfangs-Posting eingefügt).

        Ja, aber deine Problembeschreibung las sich so, als ob du dich wunderst, warum PHP nicht richtig arbeitet.

        mysqli_error() sagt nur "Cannot create table".

        Ich kann dein Problem (mit MySQL 5.0.51) nicht nachvollziehen. Beim Erstaufruf legt es bei mir mit deinen beiden Statements die Tabellen problemlos an. Beim Zweitaufruf kommt hingegen: Table 'parent' already exists.

        Lo!