PHP - Probleme lösen
Probleme mit Sessions[Bearbeiten]
Warnung (Fehlermeldung)
Warning: Unknown: Your script possibly relies on a session side-effect which existed until PHP 4.2.3. Please be advised that the session extension does not consider global variables as a source of data, unless register_globals is enabled. You can disable this functionality and this warning by setting session.bug_compat_42 or session.bug_compat_warn to off, respectively. in Unknown on line 0
Alte Skripte verlassen sich oft darauf dass Session Variablen global verfügbar sind. Das war früher auch in der Standardeinstellung der Fall (register_globals = on)
Um Skripte upzudaten sollte man nach der Registrierung von Session Variablen suchen (früher hat man das meist mit session_register gemacht) Anstatt session_register schreibt man dann einfach
$_SESSION["meineVar"] = "meinWert";
Damit die Variablen dann später zur verfügung stehen muß man sie wieder aus dem Array rausholen. Z.B.
$meineVar = $_SESSION["meineVar"];
Probleme mit dem Zeichensatz[Bearbeiten]
Vor allem im Zusammenspiel Datenbank -> PHP -> Browser kann es zu Problemen kommen. Wenn dann noch importierte Daten aus Excel oder Textdateien dazukommen...
Es gibt verschiedene Stellschrauben:
Datenbank: Kollation der Datenbank / Tabelle / Tabellenfeld Zeichensatz der Datenbank - Verbindung PHP:
setlocale(LC_ALL, 'de_DE'); header("Content-Type: text/html; charset=utf-8"); // Nutzt der Browser zum einstellen des ZS
Probleme kann es geben wenn einige Funktionen in PHP (i.d.R. String Funktionen) nicht mit utf-8 zurechtkommen.
Hilfen:
http://dev.mysql.com/doc/refman/5.0/en/charset-connection.ht ml
Datenbank - Verbindung auf einen Zeichensatz einstellen[Bearbeiten]
Symptom: Manche Umlaute gehen manche nicht
Es kann vorkommen das das PHP-Skript in utf-8 vorliegt und dementsprechend auch auf utf-8 ausgaben der Datenbank wartet. Das führt dazu, daß z.B. Umlaute aus der Datei im Browser richtig dargestellt werden, Umlaute aus der DB aber falsch. Der Browser stellt automatisch utf-8 ein weil das im Header der Datei gesendet wird. Die Standardeinstellung für dei Verbindung von mySQL ist aber in den meisten Fällen latin-1 (auch wenn die Tabellen in utf-8 vorliegen). In diesem Fall kann man direkt nach der Verbindung mit der DB im Skript die Anweisung für den zu Benutzenden Zeichensatz an die DB senden.
Eine passende Funktion in php könnte z.B. so aussehen:
function dbConnect($server, $user, $pass) {
$conn = @mysql_connect($server, $user, $pass);
if (!$conn) {
echo "Die Verbindung zu ", $server, " konnte nicht hergestellt werden";
exit;
}
mysql_query("set names 'utf8'",$conn); // Verbindung auf utf-8 setzen
return $conn;
}
Formulare funktionieren nicht mehr[Bearbeiten]
Wenn früher auf POST / GET Variablen direkt zugegriffen wurde funktioniert das nach abschalten von von register_globals nicht mehr.
Eine schnelle (aber nicht sicherer) Methode um alle POST Variablen schnell mal zu initialisieren ist folgende Funktion:
while (list($key,$val) = each($HTTP_POST_VARS)) {
$$key = $val;
}
allerdings wird hier alles was über POST kommt ohne Validierung übernommen. Je nachdem was für Daten erwartet wird könnte man vielleicht noch ein htmlspecialchar, intval o.ä. einbauen.
E-Mail Versand funktioniert nicht mehr[Bearbeiten]
Sicherheit bei E-Mails -f Parameter[Bearbeiten]
Skripte die vorher funktioniert haben funktionieren nicht mehr.
Eventuell hat sich die Sicherheitsrichtlinie des Servers verändert. Er erwartet eine gültige absender Domain. => Mail Funktion anpassen mit -f Parameter.
Beispiel:
$admin_mail="schlegel@geo-bit.de"; $headers='From: NARDA-STS GmbH <service@narda-sts.de>'."\n"; $headers.='Reply-To: service@narda-sts.de'."\n"; $headers.='X-Mailer: PHP/'.phpversion()."\n"; $headers.="Content-Type: text/html\n"; $addParams = '-fservice@narda-sts.de'; mail($to, $subject, $mail_form, $headers,$addParams);