PHP5 ignoriert einfache Anführungszeichen

Mackz

Member of Honour
Hi,

ich bin zur Zeit für einen Server zuständig, bei dem leider folgendes Problem auftritt. Ich habe mich schon tot-gegooglet und verschiedene Leute gefragt aber eigentlich hat niemand so recht eine Idee woran das liegen kann. Vielleicht hat hier ja jemand bereits mit diesem Problem zu tun gehabt und weiß wo der Hund begraben liegt. *hoff* :)

Server:
Root Server bei Strato
Suse 10.2
Apache 2
PHP 5.2.5

PHP.ini:
safe_mode Off
register_globals Off
magic_quotes_gpc Off
magic_quotes_runtime Off
magic_quotes_sybase Off

Problem:
PHP ignoriert scheinbar einfache Anführungszeichen beim Ansprechen von Superglobalen. Superglobalen die mit einfachen Anführungszeichen angesprochen werden, existieren nicht. Werden doppelte Anführungszeichen verwendet, funktioniert alles normal. Dadurch funktioniert eine wichtige Webanwendung auf diesem Server nicht, da dort fast ausschließlich mit einfachen Anführungszeichen gearbeitet wird. Auf anderen Servern lief diese Webanwendung bereits problemlos.

Beispiel:
Es werden verschiedene Variablen per GET und POST übergeben.
$_GET['variable'] liefert keinen Inhalt zurück.
$_GET["variable"] gibt den richtigen Variableninhalt zurück.

Das selbe tritt auf bei $_POST['variable'] und $_REQUEST['variable'].
Es wird keine Fehlermeldung ausgegeben.

isset($_GET['variable']), isset($_POST['variable']) und isset($_REQUEST['variable']) liefert jeweils False
isset($_GET["variable"]), isset($_POST["variable"]) und isset($_REQUEST["variable"]) gibt True zurück

Bei Verwendung von ' werden also die Variablen scheinbar garnicht angesprochen.


Jemand 'ne Idee?
 
das ist in Php so ' ' igrnoriet weiter $ und " zeichen " " nicht
 
Da war doch mal was mit register_globals = Off und den Strings.

Wenn man register_globals = Off setzt, dürfte so eine Schreibweise nicht mehr funktionieren:

PHP:
<?
echo "Dies ist Test Nummer: $_POST['testnummer'].";
?>

Was mitunter ein Grund dafür ist, dass noch viele alte Programme ein Problem mit register_globals=Off haben.

Wenn register_globals ausgeschaltet sind müsste man es so machen:
PHP:
<?
echo "Dies ist Test Nummer: ".$_POST['testnummer'].".\n";
?>

Also, setz register_globals mal auf On und schau ob es dann funktioniert.

Vielleicht hängst du auch mal noch deine php.ini an und postest einen Code-Ausschnitt wo so ne superglobale Variable verwendet wird.

Mehr Ideen hab ich leider spontan auch nicht. :(
 
Hallo,

ein solcher Fehler ist mir bis jetzt auch noch nicht begegnet.

Aber du könntest erstmal versuchen, das error_reporting auf E_ALL & E_NOTICE zu stellen, dann müsstest du wenigstens Hinweismeldungen bekommen, wenn du auf einen nicht existierenden Schlüssel eines Arrays zugreifen willst.

Ansonsten wäre noch interessant, ob das Verhalten auch für andere assoziative Arrays gilt.
Also mal sowas probieren:
PHP:
<?php
$x["String"] = 42; // Doppelte Anführungszeichen
echo $x['String']; // Einfache Anführungszeichen
?>

mfg, metax.
 
globals off ->

Code:
 C:\Users\easteregg>php
<?php
$x["String"] = 42; // Doppelte Anführungszeichen
echo $x['String']; // Einfache Anführungszeichen
?>
^Z
42
 
Hallo,
Original von Knoxx
Also, setz register_globals mal auf On und schau ob es dann funktioniert.
Oh Gott, solch einen katastrophalen 'Tipp' habe ich schon lange nicht mehr gehört. Sei froh, wenn register_globals auf off ist, und wenn nicht, unternimm alles, damit es auf off gestellt wird.

Evt. mal var_dump($_GET['name']); nutzen.
 
An register_globals sollte es auf jeden Fall nicht liegen...
Dabei wird z.B. wenn per GET name=xxx übergeben wird die Variable $name zur Verfügung gestellt, zusätzlich zu $_GET['name'].
Funktioniert das mit den einfachen ' bei allen Arrays nicht? Lass dir einmal Fehler anzeigen.
 
Original von Elderan
Hallo,
Original von Knoxx
Also, setz register_globals mal auf On und schau ob es dann funktioniert.
Oh Gott, solch einen katastrophalen 'Tipp' habe ich schon lange nicht mehr gehört. Sei froh, wenn register_globals auf off ist, und wenn nicht, unternimm alles, damit es auf off gestellt wird.

Evt. mal var_dump($_GET['name']); nutzen.

Mein "Tipp" war einfach ein möglicher Ansatzpunkt. Mackz verliert kein Wort über die verwendete Software. Wie alt ist diese? Welche Anforderungen hat sie? Woher soll man wissen, dass sie für PHP >4.x konzipiert wurde?
Dass man register_globals=On vermeiden sollte wo es nur geht, dürfte mittlerweile jedem klar sein, der sich auch nur etwas länger als 20min mit PHP auseinander gesetzt hat.
Er sollte es auch nur austesten und nicht den Server dauerhaft mit register_globals=On betreiben. Hab ich mich wohl etwas missverständlich ausgedrückt... ^^
 
Mackz du hast ja erwähnt, dass das Problem bei anderen Servern nicht existieren würde. Also könntest du auch wenn die Version der PHP Software der anderen Server auch deiner entspricht, einfach die php.ini von den anderen Server kopieren, Apache neustarten und dann müsste es eigentlich gehen :) Oder irre ich mich da?

Gruß
Keci
 
Hallo,
an der php.ini sollte es normalerweise nicht liegen. Evt. PHP nochmal neu kompilieren (dann kann man gleich 5.2.6 aufspielen)?
 
Erstmal danke für Eure Antworten.
Einige der Tipps werde ich morgen mal ausprobieren.


Original von Knoxx
Mein "Tipp" war einfach ein möglicher Ansatzpunkt. Mackz verliert kein Wort über die verwendete Software. Wie alt ist diese? Welche Anforderungen hat sie? Woher soll man wissen, dass sie für PHP >4.x konzipiert wurde?
Sie wurde für PHP >4.x bzw. "Register_Globals Off" konzipiert, sonst hätte ich ja das Problem mit den superglobalen Variablen nicht ;)
Sie lief/läuft auch auf PHP 4.x mit register_globals off problemlos.

Original von Keci
Mackz du hast ja erwähnt, dass das Problem bei anderen Servern nicht existieren würde. Also könntest du auch wenn die Version der PHP Software der anderen Server auch deiner entspricht, einfach die php.ini von den anderen Server kopieren, Apache neustarten und dann müsste es eigentlich gehen :) Oder irre ich mich da?
Geht leider nicht, da laufen überall andere Versionen :(

Original von Elderan
an der php.ini sollte es normalerweise nicht liegen.
Hm, das wäre schlecht ... *g* ;)
 
Original von metax.
Ansonsten wäre noch interessant, ob das Verhalten auch für andere assoziative Arrays gilt.
Also mal sowas probieren:
PHP:
<?php
$x["String"] = 42; // Doppelte Anführungszeichen
echo $x['String']; // Einfache Anführungszeichen
?>
Geht ohne Probleme.

Scheint also wirklich nur die Superglobalen $_GET, $_POST und $_REQUEST zu betreffen.

Original von Elderan
Evt. mal var_dump($_GET['name']); nutzen.
Gibt NULL zurück.
print_r() gibt garnichts zurück.

Ansonsten hab hier noch einen Auszug aus phpinfo, vielleicht findet ja jemand was.
Code:
Configure Command	
'../configure' '--prefix=/usr' '--datadir=/usr/share/php5' '--mandir=/usr/share/man' '--bindir=/usr/bin' '--with-libdir=lib' '--includedir=/usr/include' '--sysconfdir=/etc/php5/apache2' '--with-config-file-path=/etc/php5/apache2' '--with-config-file-scan-dir=/etc/php5/conf.d' '--enable-libxml' '--enable-session' '--with-mm' '--with-pcre-regex=/usr' '--enable-xml' '--enable-simplexml' '--enable-spl' '--enable-filter' '--disable-debug' '--enable-inline-optimization' '--disable-rpath' '--disable-static' '--enable-shared' '--program-suffix=5' '--with-pic' '--with-apxs2=/usr/sbin/apxs2' '--disable-all' '--disable-cli' 

additional .ini files parsed
/etc/php5/conf.d/bz2.ini, /etc/php5/conf.d/ctype.ini, /etc/php5/conf.d/dom.ini, /etc/php5/conf.d/gd.ini, /etc/php5/conf.d/hash.ini, /etc/php5/conf.d/iconv.ini, /etc/php5/conf.d/json.ini, /etc/php5/conf.d/mbstring.ini, /etc/php5/conf.d/mcrypt.ini, /etc/php5/conf.d/mysql.ini, /etc/php5/conf.d/mysqli.ini, /etc/php5/conf.d/pdo.ini, /etc/php5/conf.d/pdo_mysql.ini, /etc/php5/conf.d/pdo_sqlite.ini, /etc/php5/conf.d/sqlite.ini, /etc/php5/conf.d/tokenizer.ini, /etc/php5/conf.d/xmlreader.ini, /etc/php5/conf.d/xmlwriter.ini, /etc/php5/conf.d/zlib.ini 

PHP Core
allow_call_time_pass_reference	Off	
allow_url_fopen	On	
allow_url_include	Off	
always_populate_raw_post_data	Off	
arg_separator.input	&	
arg_separator.output	&	
asp_tags	Off	
auto_append_file	no value	
auto_globals_jit	On	
auto_prepend_file	no value	
browscap	no value	
default_charset	no value	
default_mimetype	text/html	
define_syslog_variables	Off	
disable_classes	no value	
disable_functions	no value	
display_errors	Off	
display_startup_errors	Off	
doc_root	no value	
docref_ext	no value	
docref_root	no value	
enable_dl	Off	
error_append_string	no value	
error_log	no value	
error_prepend_string	no value	
error_reporting	6135	
expose_php	On	
file_uploads	On	
html_errors	Off	
ignore_repeated_errors	Off	
ignore_repeated_source	Off	
ignore_user_abort	Off	
implicit_flush	Off	
log_errors	On	
log_errors_max_len	1024	
magic_quotes_gpc	Off	
magic_quotes_runtime	Off	
magic_quotes_sybase	Off	
mail.force_extra_parameters	no value	
max_execution_time	0	
max_input_nesting_level	64	
max_input_time	60	
memory_limit	128M	
open_basedir	no value	
output_buffering	4096	
output_handler	no value	
post_max_size	8M	
precision	14	
register_argc_argv	Off	
register_globals	Off	
register_long_arrays	Off	
report_memleaks	On	
report_zend_debug	On	
safe_mode	Off	
safe_mode_exec_dir	no value	
safe_mode_gid	Off	
safe_mode_include_dir	no value	
sendmail_from	no value	
serialize_precision	100	100
short_open_tag	Off	
sql.safe_mode	Off	
suhosin.log.phpscript	0	
suhosin.log.phpscript.is_safe	Off	
suhosin.log.phpscript.name	no value	
suhosin.log.sapi	no value	
suhosin.log.script	no value	
suhosin.log.script.name	no value	
suhosin.log.syslog	no value	
suhosin.log.syslog.facility	no value	
suhosin.log.syslog.priority	no value	
suhosin.log.use-x-forwarded-for	Off	
track_errors	Off	
unserialize_callback_func	no value	
upload_max_filesize	2M	2M
variables_order	GPCS	
xmlrpc_error_number	0	
xmlrpc_errors	Off	
y2k_compliance	On	
zend.ze1_compatibility_mode	Off	

Apache
Loaded Modules 	
core prefork http_core mod_so mod_authz_host mod_actions mod_alias mod_auth_basic mod_authz_groupfile mod_authn_file mod_authz_user mod_autoindex mod_cgi mod_dir mod_include mod_log_config mod_mime mod_negotiation mod_setenvif mod_status mod_userdir mod_asis mod_imagemap mod_php5 mod_authz_default 

HTTP_ACCEPT_LANGUAGE 	de-de,de;q=0.8,en-us;q=0.5,en;q=0.3 
HTTP_ACCEPT_ENCODING 	gzip,deflate 
HTTP_ACCEPT_CHARSET 	ISO-8859-1,utf-8;q=0.7,*;q=0.7 
Accept 	application/x-shockwave-flash,text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
 
Woran das liegt kann ich dir leider auch nicht sagen. Allerdings hab ich vor langer Zeit mal n kleines Tool geschrieben, um 2 phpinfo files zu vergleichen.

Vielleicht findest du so schneller die entsprechenden Unterschiede in deiner Configuration.

good luck :)
 
Ich habe mal nach der INI-Option "auto_globals_jit" gegooglet, weil ich die nicht kannte.
Offenbar werden mit auto_globals_jit=on die Autoglobalen erst erzeugt, wenn sie gebraucht werden. Anscheinend hatten einige Leute Probleme mit leeren Autoglobalen, wenn die Option aktiviert war.
Probier doch mal, auto_globals_jit auf OFF zu stellen.

mfg, metax.
 
Die Lösung war register_long_arrays auf On zu setzen.
Fragt mich bitte nicht wieso, aber es geht, auch wenn es eigentlich unlogisch ist denn die Superglobalen wurden ja eigentlich eingeführt um die HTTP_VARS zu ersetzen.

(Hatte vorher noch auf PHP 5.2.6 upgedated)
 
Zurück
Oben