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 21-12-2004, 16:46
MaxPayne
 Member
Links : Onlinestatus : MaxPayne ist offline
Registriert seit: Jul 2002
Ort: Stadtilm
Beiträge: 359
MaxPayne ist zur Zeit noch ein unbeschriebenes Blatt
MaxPayne eine Nachricht über ICQ schicken
Standard Destruktor wird zu früh aufgerufen.

Tag,

habe ein Problem mit einer SQL-Klasse. Als Destruktor-Ablauf wird dort eine bestehende Datenbank-Verbindung (die anhand einer Eigenschaft der Klasse definiert wird) wieder geschlossen. Folgendes Skript benutzt diese Klasse namens "mysql":

PHP-Code:

/* gotophp-bookmark file */

require_once("../config-inc.php5");
require_once(
"db-mysql-inc.php5");
require_once(
"session-phpbb-inc.php5");

$sql= new mysql;
$sql->query("SELECT pid FROM gtp_pages WHERE...");

if(
$sql->rows() == 0) { throw new Exception("Unknown chapter-id or page-timestamp given, did you manipulate the URL?"); }

$sess = new bbsession;

if(
$sess->state())
    {
    
    
setcookie("sp_gtp"""time()-60"/"$cfg["domain"]);
print 
"1";
    
$sql->query("UPDATE users SET....");    

    
header("LOCATION: ./".$input->get["c"]."/".$input->get["p"]."/");
    }
else
    {
    
    
setcookie("sp_gtp"$input->get["c"]."_".$input->get["ts"]."_".$input->get["p"], time()+(60*60*24*300), "/"$cfg["domain"]);

    
header("LOCATION: ./".$input->get["c"]."/".$input->get["p"]."/");    
    }

?> 
Der Query wird dem Konstruktor der Klasse übergeben, habe die jetzt mal gekürzt, damit es das Forum-Layout nicht auseinanderreißt. Problematisch wird es mit dem erneuten Aufruf der der Methode Query in Zeile 21. Zu diesem Zeitpunkt (das beweise Testausgaben vom Destruktor und dem print "1" darüber) ist der Destruktor vom Objekt "sql" schon gerufen und die Verbindung geschlossen worden, und der Query wird mit Standard-Verbindungsdaten aus der php.ini abgesetzt, was natürlich fehlschlägt.

Die MySQL-Klasse ist angehängt.
Angehängte Dateien
Dateityp: txt db-mysql-inc.txt (2,9 KB, 116x aufgerufen)
Mit Zitat antworten
  #2 (permalink)  
Alt 21-12-2004, 18:00
Benutzerbild von Nezzar Nezzar
 wannabe batard
Links : Onlinestatus : Nezzar ist offline
Registriert seit: Mar 2002
Beiträge: 477
Nezzar ist zur Zeit noch ein unbeschriebenes Blatt
Nezzar eine Nachricht über ICQ schicken
Standard

Sorry, aber du übergibst dem Konstruktor überhaupt nichts. Du übergibst der Methode query() etwas (nämlich den String mit der Anfrage).
Mach mal ein var_dump() von $sql direkt bevor und nachdem du bbsession instanziert hast.
__________________
"Ach was soll's? Dann bau ich mir halt meinen eigenen Vergnügungspark mit Blackjack und Nutten." - Bender

Geändert von Nezzar (21-12-2004 um 18:03 Uhr)
Mit Zitat antworten
  #3 (permalink)  
Alt 21-12-2004, 21:07
MaxPayne
 Member
Links : Onlinestatus : MaxPayne ist offline
Registriert seit: Jul 2002
Ort: Stadtilm
Beiträge: 359
MaxPayne ist zur Zeit noch ein unbeschriebenes Blatt
MaxPayne eine Nachricht über ICQ schicken
Standard

Zitat:
Original geschrieben von Nezzar
Sorry, aber du übergibst dem Konstruktor überhaupt nichts.
Das ist richtig. Sieh dir mal die Klasse an. Der Konstruktor ist so aufgebaut, dass er (falls nötig) erstmal ne Verbindung aufbaut, und nen Verbindungs-Handler erzeugt. Wird etwas als Argument übergeben, gibt er das an die Methode query() weiter. Ich instantiiere die Klasse erstmal ohne Query, um nen Verbindungs-Handler zu bekommen, den ich dann mysql_real_escape_string() übergeben kann, das funktioniert natürlich beim Erstellen der Objekt-Instanz noch gar nicht, deswegen muss ich es so machen.

Aber es is so, wie ich es befürchtet hatte. Die Eigenschaft myql::link_handler wird nach der Instantiierung von bbsession in $sess zu einer resource vom Typ "unknown". Vorher kann ich der Methode mysql::query() beliebig viele neue Aufrufe mit Anfragen geben, die ich alle wunderbar behandeln kann. So in etwa:

PHP-Code:
<?php

$sql 
= new mysql;

$sql->query("dsfsdf");

var_dump($sql->result());

$sql->query("bla bla");

var_dump($sql->result());

?>
Nur sobald die Klasse bbsession eine Objektinstanz bekommt spinnt PHP und ruft den Destruktor von mysql auf, der die Verbindung natürlich löscht. Daraufhin hat mysql::query() keinen gültigen Verbindungs-Handler mehr und schlägt auch fehl.

Verstehst du jetzt das Problem?

bbsession benutzt auch die MySQL-Klasse, natürlich nicht mit dem Objekt $sql...aber trotzdem

Geändert von MaxPayne (21-12-2004 um 21:10 Uhr)
Mit Zitat antworten
  #4 (permalink)  
Alt 22-12-2004, 15:20
beebob
 PHP Junior
Links : Onlinestatus : beebob ist offline
Registriert seit: Jul 2002
Ort: Köln
Beiträge: 604
beebob ist zur Zeit noch ein unbeschriebenes Blatt
Standard

hi,

schon mal probiert, deinen code in eine klasse zu packen, in dieser klasse von deiner mysql klasse zu extenden und dann den destructor zu überschreiben?
Mit Zitat antworten
  #5 (permalink)  
Alt 22-12-2004, 17:33
MaxPayne
 Member
Links : Onlinestatus : MaxPayne ist offline
Registriert seit: Jul 2002
Ort: Stadtilm
Beiträge: 359
MaxPayne ist zur Zeit noch ein unbeschriebenes Blatt
MaxPayne eine Nachricht über ICQ schicken
Standard

Nette Idee, das löst aber nicht das Problem. Offensichtlich hab ich hier die Funktionsweise eines Destruktors nicht verstanden oder es handelt sich um einen Bug. Jedenfalls wird der Destruktor von "sql" mit der Instantiierung von "sess" gerufen, und das kann nicht im Sinne des Erfinders sein.
Ich denke ein Destruktor wird gerufen wenn alle Referenzen auf ein Objekt verschwinden oder dieses zerstört wird?
Mit Zitat antworten
  #6 (permalink)  
Alt 24-12-2004, 12:44
MaxPayne
 Member
Links : Onlinestatus : MaxPayne ist offline
Registriert seit: Jul 2002
Ort: Stadtilm
Beiträge: 359
MaxPayne ist zur Zeit noch ein unbeschriebenes Blatt
MaxPayne eine Nachricht über ICQ schicken
Standard Nachtrag

Im Prinzip ist ein Destruktor der mysql_close() ruft auch Quark, wegen dem Garbage-Collector von PHP.
Aber ich meine hat denn niemand ähnliche Erfahrungen oder nutzt OOP kaum einer? Eher letzteres was...
Mit Zitat antworten
  #7 (permalink)  
Alt 25-12-2004, 09:42
beebob
 PHP Junior
Links : Onlinestatus : beebob ist offline
Registriert seit: Jul 2002
Ort: Köln
Beiträge: 604
beebob ist zur Zeit noch ein unbeschriebenes Blatt
Standard

also ich benutzte mittlerweile nur noch php5, aber da ich auch viel mit java mache, hab ich nicht viel mit destruktoren im sinn.

ich verstehe aber nicht ganz, warum bei dir noch ein mysql_close vorkommen soll? solange du kein pconnect verwendest wird die verbindung am ende des skripts von php ohnehin gekappt. und die objekte sind dann auch geschichte.

mich interessiert der konkrete anwendungsfall, für den du den destructor benötigst.

hier ein dblayer, den ich des öfteren verwende und der ziemlich goil ist
http://adodb.sourceforge.net

Geändert von beebob (25-12-2004 um 09:48 Uhr)
Mit Zitat antworten
  #8 (permalink)  
Alt 26-12-2004, 14:30
MaxPayne
 Member
Links : Onlinestatus : MaxPayne ist offline
Registriert seit: Jul 2002
Ort: Stadtilm
Beiträge: 359
MaxPayne ist zur Zeit noch ein unbeschriebenes Blatt
MaxPayne eine Nachricht über ICQ schicken
Standard

Zitat:
Original geschrieben von beebob
ich verstehe aber nicht ganz, warum bei dir noch ein mysql_close vorkommen soll? solange du kein pconnect verwendest wird die verbindung am ende des skripts von php ohnehin gekappt. und die objekte sind dann auch geschichte.
Siehe meinen letzten Post. Trotzdem kann es nicht richtig sein, dass der Destruktor so früh gerufen wird, da brauch ich auch gar keinen...
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

Die RIGID-FLEX-Technologie
Die RIGID-FLEX-TechnologieDie sogenannte "Flexible Elektronik" , oftmals auch als "Flexible Schaltungen" bezeichnet, ist eine zeitgemäße Technologie zum Montieren von elektronischen Schaltungen.

06.12.2018 | Berni

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


 

Aktuelle PHP Scripte

HeidiSQL - kostenloses MySQL front-end Editor für Windows ansehen HeidiSQL - kostenloses MySQL front-end Editor für Windows

HeidiSQL - ist ein Windows-Editor für die bekannt open Source Datenbank mySQL

10.12.2018 Berni | Kategorie: MYSQL/ Management
piwik Open-Source Webanalyse-Software ansehen piwik Open-Source Webanalyse-Software

piwik ist eine gute Alternative zu Google Analytics. Viele Features und ein modernes Erscheinungsbild mit aussagefähigen Statistiken in Echtzeit

10.12.2018 phpler | Kategorie: PHP/ Besucherzaehler
jQuery Mobile ansehen jQuery Mobile

Touch-Optimized Web Framework für Smartphones & Tablets

09.12.2018 phpler | Kategorie: AJAX/ Framework
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 21:16 Uhr.