php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > PHP Developer Forum
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Fragen zu Laravel, YII oder anderen PHP-Frameworks.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 26-02-2008, 11:07
neophyt
 Newbie
Links : Onlinestatus : neophyt ist offline
Registriert seit: Feb 2008
Beiträge: 7
neophyt ist zur Zeit noch ein unbeschriebenes Blatt
Standard Mehrere DELETE-Statements in einem Query-String

/*
$sql = "DELETE FROM tblcontent where contentCodeID "."\n";
$sql .= "in (select tblcode.codeID from tblcode where ";
$sql .= "tblcode.codeEntityID in (SELECT ma.id ";
$sql .= "FROM mitarbeiter ma ";
$sql .= "WHERE ma.id=" .$_GET['id']."));";

$sql .= "DELETE FROM tblcode where ";
$sql .= "codeEntityID in (SELECT ma.id ";
$sql .= "FROM mitarbeiter ma ";
$sql .= "WHERE ma.id=".$_GET['id'].");";

$sql .= "DELETE FROM mitarbeiter ";
$sql .= "WHERE id=".$_GET['id'].";";
$ergebnis = mysql_query($sql)or die("Error, Daten konnten nicht gelöscht werden.");
echo "Daten wurden erfolgreich gelöscht."."\n";
mysql_close();
*/

Hallo *

Ich bin ein PHP-Neuling und habe bis anhin in VB6.0 und/oder C# Programmiert.

Dort war es kein Problem, in einem Query-String mehrere Inline-Transaktionen, also z.B. mehrere DELETE-Statements abzusetzen.

Hier in PHP kriege ich es einfach nicht hin. Siehe obiges Code-Fragment.
Wenn ich diesen Code mittels echo rauskopiere und diesen im mySQL-Manager ausführe, wird die Löschung ausgeführt, aber mittels PHP nicht
(DB-Connect ist i.O).

Wenn ich die DELETE-Queries einzeln auslöse, funktioniert es.
Ist aber "transaktionsmässig" nicht gerade das gelbe vom Ei.

Kann mir jemand miteilen, was ich falsch mache?

Besten Dank und Gruss
Mit Zitat antworten
  #2 (permalink)  
Alt 26-02-2008, 11:18
Kropff
  Administrator
Links : Onlinestatus : Kropff ist offline
Registriert seit: Mar 2002
Ort: Köln
Beiträge: 11.721
Kropff befindet sich auf einem aufstrebenden Ast
Standard

siehe transaktionen mysql

gruß
peter
__________________
Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
Meine Seite
Mit Zitat antworten
  #3 (permalink)  
Alt 26-02-2008, 11:20
st@tic
 Registrierter Benutzer
Links : Onlinestatus : st@tic ist offline
Registriert seit: Mar 2004
Beiträge: 344
st@tic ist zur Zeit noch ein unbeschriebenes Blatt
Standard

soweit ich weiß kann man pro query(); nur ein statement ausführen. das einzige was da bleibt ist eine schleife. alternative siehe etwas weiter unten.

aber ne transaktion ist meines wissens was anderes.
man erzeugt ne transaction führt dann x-beliebig viele queries aus und am schluss prüft man ob die alle erfolgreich waren. wenn mindestens eins schiefgegangen ist, gibts nen rollback.

es ist zwar unwahrscheinlich, weil alles sehr schnell in server manager ausgeführt wird, aber wenn du jetzt 100 queris hintereinander setzt und beim 87. der server abraucht, dann sind nur 13 stück nicht ausgeführt worden.

achja nutz doch einfach ein framework/klassensammlung wie z.B. Zend (hab ich selbst jetzt noch nicht mitgearbeitet) oder die PEAR-Klasse mdb2. zumindest bei letzterem gibt es "multiple executes" und auch transaktionen
Mit Zitat antworten
  #4 (permalink)  
Alt 26-02-2008, 11:39
nohfreak
 Registrierter Benutzer
Links : Onlinestatus : nohfreak ist offline
Registriert seit: Nov 2007
Beiträge: 160
nohfreak ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Mit PDO geht das auch. Viel sagen kann ich dir dazu allerdings nicht, da ich das momentan selbst noch erforsche. Scheint aber eigentlich ne feine Sache zu sein das Ding. Und Transaktionen sind dort auch möglich. ( Abschnitt 5 in dem Link da oben ).
Mit Zitat antworten
  #5 (permalink)  
Alt 26-02-2008, 11:53
neophyt
 Newbie
Links : Onlinestatus : neophyt ist offline
Registriert seit: Feb 2008
Beiträge: 7
neophyt ist zur Zeit noch ein unbeschriebenes Blatt
Standard MyISAM

Danke für die Antworten.

Ist es tatsächlich so dass man pro query() nur ein Statement ausführen kann?

Aber jetzt ist mir einiges klar(er).
Die Tabellen sind vom Typ myISAM, ich kann daraus keine InnoDB machen, da es sich um eine bestehende Lösung handelt.
Keine referenzielle Intergrität mit Lösch-Option (dann könnte ich mir den Murks sparen) und keine Transaktionen.
Pech gehabt.
Werde eine andere Lösung suchen. Vielleicht eine Klasse welche die Löschungen in den Tabellen Schritt für Schritt überprüft. Die Pear-Klasse mdb2 werde ich auch noch ganauer unter die Lupe nehmen.

Gruss und einen schönen Tag
Mit Zitat antworten
  #6 (permalink)  
Alt 26-02-2008, 14:51
nohfreak
 Registrierter Benutzer
Links : Onlinestatus : nohfreak ist offline
Registriert seit: Nov 2007
Beiträge: 160
nohfreak ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Die Transaktionen von PDO funktionieren doch mit myISAM, odernicht ?
Mit Zitat antworten
  #7 (permalink)  
Alt 26-02-2008, 15:34
ghostgambler
 Master
Links : Onlinestatus : ghostgambler ist offline
Registriert seit: Jul 2004
Ort: DE - NRW
Beiträge: 4.620
ghostgambler ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Da MyISAM keine unterstützt. Nein.
Das kann man nicht "emulieren".
Mit Zitat antworten
  #8 (permalink)  
Alt 26-02-2008, 15:38
PHP-Desaster
 PHP Expert
Links : Onlinestatus : PHP-Desaster ist offline
Registriert seit: Mar 2006
Beiträge: 3.105
PHP-Desaster befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Die Transaktionen von PDO funktionieren doch mit myISAM, odernicht ?
Afaik sind die PDO-Methoden nur Wrapper um entsprechende Transaktionsfunktionen des nativen Treibers.
Mit Zitat antworten
  #9 (permalink)  
Alt 26-02-2008, 17:29
jmc
 PHP Junior
Links : Onlinestatus : jmc ist offline
Registriert seit: Mar 2006
Beiträge: 868
jmc befindet sich auf einem aufstrebenden Ast
Standard

Warum verwendest du nicht einfach "OR" um eine zweite, dritte oder vierte Bedingung festzulegen?
Mit Zitat antworten
  #10 (permalink)  
Alt 26-02-2008, 17:43
MelloPie
 PHP Master
Links : Onlinestatus : MelloPie ist offline
Registriert seit: Jan 2002
Ort: Hessen
Beiträge: 4.380
MelloPie ist zur Zeit noch ein unbeschriebenes Blatt
Standard

evt kannst Du
http://de2.php.net/manual/de/functio...ulti-query.php
benutzen
Delete mit OR bei verschiedenen Tabellen geht nicht.
__________________
Beantworte nie Threads mit mehr als 15 followups...
Real programmers confuse Halloween and Christmas because OCT 31 = DEC 25
Mit Zitat antworten
  #11 (permalink)  
Alt 26-02-2008, 19:58
neophyt
 Newbie
Links : Onlinestatus : neophyt ist offline
Registriert seit: Feb 2008
Beiträge: 7
neophyt ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Original geschrieben von MelloPie
evt kannst Du
http://de2.php.net/manual/de/functio...ulti-query.php
benutzen
Delete mit OR bei verschiedenen Tabellen geht nicht.
Mit dem multi_query() hat es funktionert.
Einziger Schöheitsfehler: Wenn ein Teilquery dazwischen abschmiert
(testweise falscher Table-Namen eingegeben), wird der Rest trotzdem ausgeführt. Also
kein Transaction-Rollback in der Funktion. Damit muss ich wohl leben mit myISAM.

Aber sicherlich eine elegantere Lösung als Einzelabfragen generieren und ständig verbinden und schliessen.
Mit Zitat antworten
  #12 (permalink)  
Alt 26-02-2008, 20:50
ghostgambler
 Master
Links : Onlinestatus : ghostgambler ist offline
Registriert seit: Jul 2004
Ort: DE - NRW
Beiträge: 4.620
ghostgambler ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Na ja, ob das jetzt besser ist als ein paar mysql_query-Aufrufe wage ich zu bestreiten. Dazwischen mysql_connect und mysql_close auszuführen ist natürlich schwachsinnig.

Nur mysql_multi_query hat absolut nix mit Transaktionssicherheit zutun... das ist nicht Transaktionssicher und das ist auch keine Transaktion, wenn irgendwas da schief geht ist alles im Arsch und die Queries werden auch nicht ohne Unterbrechung hintereinander ausgeführt.
Mit Zitat antworten
  #13 (permalink)  
Alt 26-02-2008, 21:56
neophyt
 Newbie
Links : Onlinestatus : neophyt ist offline
Registriert seit: Feb 2008
Beiträge: 7
neophyt ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Original geschrieben von ghostgambler
Na ja, ob das jetzt besser ist als ein paar mysql_query-Aufrufe wage ich zu bestreiten. Dazwischen mysql_connect und mysql_close auszuführen ist natürlich schwachsinnig.

Nur mysql_multi_query hat absolut nix mit Transaktionssicherheit zutun... das ist nicht Transaktionssicher und das ist auch keine Transaktion, wenn irgendwas da schief geht ist alles im Arsch und die Queries werden auch nicht ohne Unterbrechung hintereinander ausgeführt.
Bin auch noch nicht glücklich über die Lösung.

Meinst Du es wäre ratsam die DB auf InnoDB umzustellen? Probleme resp. Seiteneffekte sollten keine auftreten. So viele Entitäten sind noch nicht in der DB vorhanden.
Mit Zitat antworten
  #14 (permalink)  
Alt 26-02-2008, 21:59
MelloPie
 PHP Master
Links : Onlinestatus : MelloPie ist offline
Registriert seit: Jan 2002
Ort: Hessen
Beiträge: 4.380
MelloPie ist zur Zeit noch ein unbeschriebenes Blatt
Standard

also ich bin noch nicht so tief in mysqli eingestiegen aber es gibt commit und rollack funktionalität und das manual sagt:
Zitat:
Commits the current transaction for the database connection.
Gilt das auch für multi_query() ?
__________________
Beantworte nie Threads mit mehr als 15 followups...
Real programmers confuse Halloween and Christmas because OCT 31 = DEC 25
Mit Zitat antworten
  #15 (permalink)  
Alt 26-02-2008, 22:22
neophyt
 Newbie
Links : Onlinestatus : neophyt ist offline
Registriert seit: Feb 2008
Beiträge: 7
neophyt ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Original geschrieben von MelloPie
also ich bin noch nicht so tief in mysqli eingestiegen aber es gibt commit und rollack funktionalität und das manual sagt:

Gilt das auch für multi_query() ?
Habe es getestet:
/*
$db->autocommit(FALSE);

$sql = "DELETE FROM tblcontent where contentCodeID ";
..................

$sql .= "DELETE FROM tblcode where ";
..................
$sql .= "DELETE FROM people ";
..................

/* execute multi query */
if ($db->multi_query($sql)) {
do {
/* store first result set */
if ($result = $db->store_result()) {
echo "Inhalt gelöscht";
$result->close();
}
/* print divider */
if ($db->more_results()) {
printf("-\n");
}
} while ($db->next_result());
echo "Löschung erfolgreich";
$db->rollback();
*/

Mit myIsam no way. Mit innoDB rollback ok.

Geändert von neophyt (26-02-2008 um 22:25 Uhr)
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 07:15 Uhr.