ebiz-webhosting
- Ad -
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 Bewertung: Bewertung: 1 Stimmen, 5,00 durchschnittlich.
  #1 (permalink)  
Alt 09-02-2016, 14:47
berni15
 Registrierter Benutzer
Links : Onlinestatus : berni15 ist offline
Registriert seit: Feb 2016
Beiträge: 9
berni15 befindet sich auf einem aufstrebenden Ast
Standard mysqli und output buffering

In nachfolgendem Skript ist die globale Variable $db innerhalb der ob-routine "layout" nicht definiert, obwohl sie das meiner Meinung nach sein müsste. Mit anderen Variablen funktioniert es, und auch, wenn ich mysqli_connect durch mysql_connect ersetze. Muss also irgendwie an mysqli liegen, aber ich konnte dazu im Netz nichts finden.

Ausgabe:

Code:
db outside: set
test outside: set
db inside: unset
test inside: set
Und hier der Code:

PHP-Code:
<?php

ob_start
("layout");

$db mysqli_connect('localhost''xxx''xxx''xxx');
$test '123';

error_log('db outside: '.(isset($db)?"set":"unset"));
error_log('test outside: '.(isset($test)?"set":"unset"));

function 
layout($s)
{
    global 
$db,$test;
    
    
error_log('db inside: '.(isset($db)?"set":"unset"));
    
error_log('test inside: '.(isset($test)?"set":"unset"));
    
    return 
$s;
}

?>
Hat jemand eine Idee, woran das liegt? Oder ist es ein Bug in mysqli?

PS: Ich verwende PHP-Version 5.6.17-0+deb8u1

Geändert von berni15 (09-02-2016 um 14:49 Uhr) Grund: PHP-Version hinzugefügt
Mit Zitat antworten
  #2 (permalink)  
Alt 09-02-2016, 16:17
h3ll
 Registrierter Benutzer
Links : Onlinestatus : h3ll ist offline
Registriert seit: Mar 2008
Beiträge: 3.382
h3ll befindet sich auf einem aufstrebenden Ast
Standard

global ist böse und sollte nicht verwendete werden.

Datenbankabfragen haben innerhalb der Ausgabe nichts verloren, bitte beachte das EVA-Prinzip.
Mit Zitat antworten
  #3 (permalink)  
Alt 23-02-2016, 17:55
berni15
 Registrierter Benutzer
Links : Onlinestatus : berni15 ist offline
Registriert seit: Feb 2016
Beiträge: 9
berni15 befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von h3ll Beitrag anzeigen
global ist böse und sollte nicht verwendete werden.
Tja, bei großen, alten Projekten hat man halt nicht die Wahl. Umstellen ist zu aufwendig. Dann muss man halt damit leben. Ohne den obigen Bug würde ich übrigens mit genau der einen globalen Variablen auskommen. Jetzt muss ich die ganzen Daten schon vorab runterladen, selbst wenn sie gar nicht gebraucht werden, und in globale Variablen stecken, damit ich sie dann während der Ausgabe zur Verfügung habe. Ich finde das nicht besser.

Zitat:
Datenbankabfragen haben innerhalb der Ausgabe nichts verloren, bitte beachte das EVA-Prinzip.
Das EVA-Prinzip ist halt ein Prinzip. Da kann man sich dran halten, muss man aber nicht. Ich halte es jedenfalls für einen deutlich größeres Problem, wenn in einer Programmiersprache plötzlich Variablen einfach so den Houdini machen können. Da kann man sich ja auf gar nichts mehr verlassen...
Mit Zitat antworten
  #4 (permalink)  
Alt 23-02-2016, 18:01
h3ll
 Registrierter Benutzer
Links : Onlinestatus : h3ll ist offline
Registriert seit: Mar 2008
Beiträge: 3.382
h3ll befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von berni15 Beitrag anzeigen
Das EVA-Prinzip ist halt ein Prinzip. Da kann man sich dran halten, muss man aber nicht. Ich halte es jedenfalls für einen deutlich größeres Problem, wenn in einer Programmiersprache plötzlich Variablen einfach so den Houdini machen können. Da kann man sich ja auf gar nichts mehr verlassen...
Das erfordert eben größere Selbstdisziplin. Wenn man sich auf die Programmiersprache nicht verlassen kann, muss man sich eben auf den Programmierer verlassen. Und da ist es nicht förderlich, wenn man schlampig arbeitet und alle Prinzipien über Bord wirft, weil man meint, dass sie für einen selber nicht gelten.
Mit Zitat antworten
  #5 (permalink)  
Alt 24-02-2016, 13:04
mermshaus
 Registrierter Benutzer
Links : Onlinestatus : mermshaus ist offline
Registriert seit: Jun 2009
Beiträge: 386
mermshaus wird schon bald berühmt werden
Standard

Die Sache ist, dass diese „passiert am Ende des Scripts automatisch“-Geschichten in PHP nicht unbedingt in der Reihenfolge ablaufen, die man „erwarten“ würde.

Hier scheint es der Fall zu sein, dass die Garbage Collection zuerst läuft oder dass zumindest zuerst die Objekte aus dem Speicher freigegeben werden, bevor das Callback ausgeführt wird. (Das liegt nicht speziell an mysqli. Das liegt daran, dass mysqli-Instanzen Objekte sind, während mysql-„Instanzen“ Ressourcen sind.)

Lösungen:

- Beende den Output Buffer manuell am Scriptende via ob_get_clean und Co.
- Sichere die benötigten Variablen in einer Closure. (Das ist dann allerdings der Inhalt der Variablen zu dem Zeitpunkt der Erstellung der Closure.)

PHP-Code:
<?php

$db 
mysqli_connect('localhost''root''root''fiddle');
$test '123';

$cb = function ($s) use ($db$test) {

    
error_log('db inside: '.(isset($db)?"set":"unset"));
    
error_log('test inside: '.(isset($test)?"set":"unset"));

    return 
$s;
};

ob_start($cb);

error_log('db outside: '.(isset($db)?"set":"unset"));
error_log('test outside: '.(isset($test)?"set":"unset"));

Geändert von mermshaus (24-02-2016 um 13:08 Uhr)
Mit Zitat antworten
  #6 (permalink)  
Alt 24-02-2016, 16:08
berni15
 Registrierter Benutzer
Links : Onlinestatus : berni15 ist offline
Registriert seit: Feb 2016
Beiträge: 9
berni15 befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von mermshaus Beitrag anzeigen
Hier scheint es der Fall zu sein, dass die Garbage Collection zuerst läuft oder dass zumindest zuerst die Objekte aus dem Speicher freigegeben werden, bevor das Callback ausgeführt wird. (Das liegt nicht speziell an mysqli. Das liegt daran, dass mysqli-Instanzen Objekte sind, während mysql-„Instanzen“ Ressourcen sind.)
Das erklärt's.

Zitat:
Lösungen:

- Beende den Output Buffer manuell am Scriptende via ob_get_clean und Co.
- Sichere die benötigten Variablen in einer Closure. (Das ist dann allerdings der Inhalt der Variablen zu dem Zeitpunkt der Erstellung der Closure.)
Ersteres ist für mich keine sinnvolle Lösung, weil ich OB ja gerade dafür verwende, damit ich nicht am Ende jedes Skripts manuell nochmal eine Funktion aufrufen muss, sondern das einmal zentral verwalten kann. - Gibt's da eigentlich eine Alternativen, also einen Hook, der ausgeführt wird, denn das PHP-Skript ansonsten zu Ende ist? Das wäre dann vielleicht eine bessere Lösung als OB.

Zweiteres tut, aber es fühlt sich für mich irgendwie nicht gut an. Wer weiß, ob da nicht doch irgendwann noch irgendwas anderes von der GC abgeholt wird, bevor es verwendet wird.

Danke dir jedenfalls für die Antwort.

PS: Eigentlich ist der Thread ja nun im falschen Forum gelandet, weil es mit Datenbanken gar nichts zu tun hat. Sollte man ihn verschieben?!?
Mit Zitat antworten
  #7 (permalink)  
Alt 24-02-2016, 17:47
mermshaus
 Registrierter Benutzer
Links : Onlinestatus : mermshaus ist offline
Registriert seit: Jun 2009
Beiträge: 386
mermshaus wird schon bald berühmt werden
Standard

Zitat:
Gibt's da eigentlich eine Alternativen, also einen Hook, der ausgeführt wird, denn das PHP-Skript ansonsten zu Ende ist?
Es gäbe noch register_shutdown_function und auto_append_file. Ob es dabei ähnliche Probleme gibt, weiß ich nicht.
Mit Zitat antworten
  #8 (permalink)  
Alt 24-02-2016, 20:29
berni15
 Registrierter Benutzer
Links : Onlinestatus : berni15 ist offline
Registriert seit: Feb 2016
Beiträge: 9
berni15 befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von mermshaus Beitrag anzeigen
Es gäbe noch register_shutdown_function und auto_append_file. Ob es dabei ähnliche Probleme gibt, weiß ich nicht.
Beim Testen waren bei register_shutdown_function noch alle Variablen da. Zusammen mit ob_get_clean ist das für mich die perfekte Lösung - besser als voher! Danke dir nochmal.
Mit Zitat antworten
Antwort

Lesezeichen

Stichworte
mysqli, output buffering


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

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
PHP Version und Mysqli Hauser Provider / Domains 11 07-02-2010 23:25
[gelöst] Stored Procedure, MSSQL und Output streuner PHP Developer Forum 4 29-10-2009 10:59
mysqli::commit() und ::rollback() tim-gt SQL / Datenbanken 5 21-07-2009 19:40
Buffering, Flush, Sleep = Problem progman06 PHP Developer Forum 15 07-07-2006 13:11
MySQL und MySQLi unter PHP5? oklink Fragen zu Installation & Konfiguration (LAMP, WAMP & Co.) 5 10-01-2005 00:14

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

Zeit ist Geld, PC einfach selbst reparieren!
Zeit ist Geld, PC einfach selbst reparieren!Wenn der PC nicht richtig läuft, wirft sie das in Ihrem Arbeitsalltag meist zurück. Dabei können Sie einige Probleme mit relativ wenig Aufwand und ohne intime Kenntnisse Ihres Rechners selbst lösene

18.04.2016 | Berni

Die wichtigsten Rahmenbedingungen für das Hosting
Die wichtigsten Rahmenbedingungen für das HostingGuter Webspace wird in der heutigen Zeit immer wichtiger. Die Scripte werden moderner und fordern höhere Leistung, der allgemeine Traffic im Internet nimmt zu.

17.08.2015 | Berni


 

Aktuelle PHP Scripte

Onlineshop mit CSV Artikel import

Wir erstellen nach Ihren Wünschen Ihren Onlineshop.

11.07.2016 ISD-Genthin | Kategorie: PHP/ Shops
Newsletter PRO SQL V4

Nutzen Sie unser Newsletter-System und halten Sie Ihre Kunden mit neuen Informationen stets auf dem Laufenden. Die benutzerfreundliche Oberfläche bietet sowohl Anfängern als auch Profis, die Erstellung von eleganten bis frechen Newslettern ...

11.07.2016 virtualsystem | Kategorie: PHP/ News
LEPTON CMS ansehen LEPTON CMS

LEPTON CMS ist eine weiterentwickelte Ableitung (Fork) des CMS „WebsiteBaker“ der Version 2.8.1. Das Entwicklerteam hat den ursprünglichen „Geist” erhalten, der dieses Content Management System und seine damalige Community unter Leitung des Gründers Ryan

27.06.2016 erpe | Kategorie: PHP/ CMS
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 10:22 Uhr.