php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > SQL / Datenbanken
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


SQL / Datenbanken Probleme mit SQL? Hier könnt ihr eure Fragen zu SQL (MySQL, PostgreSQL, MS-SQL und andere ANSI-SQL Server) los werden.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 03-07-2008, 16:44
CrashOverwrite
 Newbie
Links : Onlinestatus : CrashOverwrite ist offline
Registriert seit: Jul 2008
Beiträge: 3
CrashOverwrite ist zur Zeit noch ein unbeschriebenes Blatt
Standard 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); 

Geändert von CrashOverwrite (04-07-2008 um 12:23 Uhr)
Mit Zitat antworten
  #2 (permalink)  
Alt 04-07-2008, 11:41
H2O
 PHP Junior
Links : Onlinestatus : H2O ist offline
Registriert seit: Jul 2007
Beiträge: 937
H2O ist zur Zeit noch ein unbeschriebenes Blatt
Standard

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
Mit Zitat antworten
  #3 (permalink)  
Alt 04-07-2008, 12:47
CrashOverwrite
 Newbie
Links : Onlinestatus : CrashOverwrite ist offline
Registriert seit: Jul 2008
Beiträge: 3
CrashOverwrite ist zur Zeit noch ein unbeschriebenes Blatt
Standard

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
Mit Zitat antworten
  #4 (permalink)  
Alt 04-07-2008, 13:32
H2O
 PHP Junior
Links : Onlinestatus : H2O ist offline
Registriert seit: Jul 2007
Beiträge: 937
H2O ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
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
__________________
Gruss
H2O

Geändert von H2O (04-07-2008 um 13:37 Uhr)
Mit Zitat antworten
  #5 (permalink)  
Alt 04-07-2008, 14:42
CrashOverwrite
 Newbie
Links : Onlinestatus : CrashOverwrite ist offline
Registriert seit: Jul 2008
Beiträge: 3
CrashOverwrite ist zur Zeit noch ein unbeschriebenes Blatt
Standard

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.
Mit Zitat antworten
  #6 (permalink)  
Alt 04-07-2008, 15:00
Benutzerbild von onemorenerd onemorenerd
  Moderator
Links : Onlinestatus : onemorenerd ist offline
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.471
onemorenerd wird schon bald berühmt werdenonemorenerd wird schon bald berühmt werden
Standard

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.
Mit Zitat antworten
  #7 (permalink)  
Alt 04-07-2008, 15:05
H2O
 PHP Junior
Links : Onlinestatus : H2O ist offline
Registriert seit: Jul 2007
Beiträge: 937
H2O ist zur Zeit noch ein unbeschriebenes Blatt
Standard

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
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

PHP Server Monitor

PHP Server Monitor ist ein Skript, das prüft, ob Ihre Websites und Server betriebsbereit sind.

11.09.2018 Berni | Kategorie: PHP/ Security
PHP WEB STATISTIK ansehen PHP WEB STATISTIK

Die PHP Web Statistik bietet Ihnen ein einfach zu konfigurierendes Script zur Aufzeichnung und grafischen und textuellen Auswertung der Besuchern Ihrer Webseite. Folgende zeitlichen Module sind verfügbar: Jahr, Monat, Tag, Wochentag, Stunde Folgende son

28.08.2018 phpwebstat | Kategorie: PHP/ Counter
Affilinator - Affilinet XML Produktlisten Skript

Die Affilinator Affilinet XML Edition ist ein vollautomatisches Skript zum einlesen und darstellen der Affili.net (Partnerprogramm Netzwerk) Produktlisten und Produktdaten. Im Grunde gibt der Webmaster seine Affilinet PartnerID ein und hat dann unmittelb

27.08.2018 freefrank@ | Kategorie: PHP/ Partnerprogramme
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 17:18 Uhr.