Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   [PHP] $HTTP_SERVER_VARS nicht gefunden (https://www.delphipraxis.net/112758-%5Bphp%5D-%24http_server_vars-nicht-gefunden.html)

MrSpock 26. Apr 2008 14:14


[PHP] $HTTP_SERVER_VARS nicht gefunden
 
Hallo PHP Spezialisten,

im Gästebuch meiner Homepage greife ich in PHP auf den Array HTTP_SERVER_VARS zu. Das hat bisher auch problemlos funktioniert, aber jetzt bekomme ich die Fehlermeldung:

Zitat:

Notice: Undefined variable: HTTP_SERVER_VARS in ...
Hat jemand eine Idee, woher das kommen kann?

Nuclear-Ping 26. Apr 2008 14:17

Re: [PHP] $HTTP_SERVER_VARS nicht gefunden
 
Unterschiedliche PHP-Version vlt.? Mal $_SERVER probiert?

Daniel 26. Apr 2008 14:37

Re: [PHP] $HTTP_SERVER_VARS nicht gefunden
 
Ja, je nach PHP-Konfiguration könnte es sein, dass die alten, "langen" Array-Namen nicht mehr unterstützt werden. Aus $HTTP_POST_VARS wurde $_POST, aus $HTTP_GET_VARS wurde $_GET und bei den Server-Vars ist es nicht anders. Du kannst diese Einstellung ermitteln, indem Du Dir mal phpinfo() anzeigen lässt und dort im Abschnitt "Configuration" nach "register_long_arrays" schaust.

Nuclear-Ping 26. Apr 2008 14:46

Re: [PHP] $HTTP_SERVER_VARS nicht gefunden
 
Hatte da mal was gelesen (wenn ich mich jetzt nicht arg täusche), dass $HTTP_X_VARS eh als deprecated galten und bald rausfliegen sollten. Vielleicht hat dein Host ja die PHP-Version aktualisiert, wo das eben der Fall ist.

MrSpock 26. Apr 2008 15:29

Re: [PHP] $HTTP_SERVER_VARS nicht gefunden
 
Hallo,

danke erstmal, das hat mir schon weitergeholfen. Ich habe jetzt $HTTP_SERVER_VARS durch $_SERVER ersetzt und das funktioniert. Zusätzlich kann ich aber auch nicht mehr auf die Formularvariablen zugreifen. So kennt der PHP Parser offensichtlich $name, $submit und ähnliches nicht mehr. Ich habe dazu gelesen, dass man, wiederum abhängig von den Einstellungen in der php.ini nicht direkt auf die Variablen zugreifen kann, und stattdessen mit (in der Kurzform) $_GET darauf zugreifen soll.

Delphi-Quellcode:
$_GET["name"]
funktioniert aber nicht. Der Parser kennt den Index "name" nicht. :gruebel:

Daniel 26. Apr 2008 15:35

Re: [PHP] $HTTP_SERVER_VARS nicht gefunden
 
:shock:
Hui, das heißt, bei Deiner bisherigen PHP-Installation war das Flag "register_globals" auf 'on' gesetzt? Das gilt als großes Sicherheitsrisiko und wurde in neueren PHP-Installationen per Standard deaktiviert.

Deine Formulardaten kommen vermutlich via HTTP-POST, das heißt, Du wirst Deine Daten wohl unter $_POST['name'] finden. Sollte es Dir egal sein, ob POST oder GET, dann kannst Du auch einfach $_REQUEST nehmen, da ist alles drin (... wie in Opas alter Cordhose *g*).

Wenn ich eine Variable suche, dann lasse ich mir die Daten gern mit

Code:
echo "<pre>", print_r($_POST), "</pre>";
ausgeben. Irgendwo finden sie sich dann immer wieder an. :-)

BenjaminH 26. Apr 2008 15:36

Re: [PHP] $HTTP_SERVER_VARS nicht gefunden
 
Wenn die Daten per Post übetragen werden, muss es
Code:
$_POST["name"]
heißen
alternativ funktioniert sowohl für per POST als auch per GET übertragene Variablen
Code:
$_REQUEST["name"]

DeddyH 26. Apr 2008 15:36

Re: [PHP] $HTTP_SERVER_VARS nicht gefunden
 
Übergibst Du auch mit get oder vielleicht doch mit post?

[edit] Mist, zu langsam :? [/edit]

MrSpock 26. Apr 2008 16:14

Re: [PHP] $HTTP_SERVER_VARS nicht gefunden
 
Hhhm. Also ich übergebe die Daten mit POST.

ABER das Script ist so aufgebaut, dass zunächst die PHP Routinen kommen, die das Formular auswerten.

Dann kommt das Formular. Also etwa so:

Code:
<?php
$fehler= 0;
echo "<pre>", print_r($_REQUEST), "</pre>";
$fehlermeldungStart = '<table width="600" border="0" bgcolor="#000000" cellpadding="5" cellspacing="1" align="center">'."\n";
$fehlermeldung = "<tr>\n<td bgcolor=\"#227CAC\" colspan=\"2\" align=\"center\"><span class=\"header\">Oooops! Es traten Fehler auf!</span></td>\n</tr>\n";
$fehlermeldungEnde = "<tr>\n<td bgcolor=\"#227CAC\" colspan=\"2\" align=\"center\">Klicke bitte auf <a href=\"javascript:history.back()\">Zur&uuml;ck</a> und &auml;ndere Deine Angaben!</td>\n</tr>\n";
$fehlermeldungEnde .= "</table>\n";
if($_REQUEST["name"] == "") {
   $fehler = 1;
   $fehlermeldung .= "<tr>\n<td width=\"190\" bgcolor=\"#227CAC\">Dein Name:</td>\n";
   $fehlermeldung .= "<td width=\"410\" bgcolor=\"#dedede\"><span class=\"fehler\">Du hast noch keinen Namen eingegeben!</span></td>\n</tr>\n";
}
...
Das print_r habe ich mal wie von Daniel empfohlen eingefügt und es gibt mir einen leeren Array zurück. Ist ja uch irgendwie klar, weil das Formular ja noch gar nicht erstellt wurde..

Denn erst danach kommt:

Code:
<?php
if(!$_REQUEST["submit"]) {
?>

<form action="eintragen.php" method="post">
<table width="700" border="0" bgcolor="#000000" cellpadding="5" cellspacing="1" align="center">
   <tr>
...
vorher hieß es nur

if (!$submit)

aber die Variable findet er auch nicht.

Nuclear-Ping 26. Apr 2008 16:17

Re: [PHP] $HTTP_SERVER_VARS nicht gefunden
 
Lass dir doch mal $_REQUEST ausgeben.
Code:
echo "<pre>"; print_r ($_REQUEST); echo "</pre>";

MrSpock 26. Apr 2008 16:19

Re: [PHP] $HTTP_SERVER_VARS nicht gefunden
 
Hallo Mario,

hab ich doch oben geschrieben. Der Array ist leer! (Der Code steht in meinem Post, der über deinem steht.)

Nuclear-Ping 26. Apr 2008 16:21

Re: [PHP] $HTTP_SERVER_VARS nicht gefunden
 
Stimmt. Sicher, dass er dir nicht nur ein leeres Array wegen den Syntaxfehlern anzeigt? ;)
Code:
echo "<pre>", print_r($_REQUEST),
Komma statt Semikolon. Normal ist $_REQUEST nicht leer, wenn du ein Formular abgeschickt hast.

Matze 26. Apr 2008 16:25

Re: [PHP] $HTTP_SERVER_VARS nicht gefunden
 
Hallo Albert

Zitat:

Zitat von MrSpock
und es gibt mir einen leeren Array zurück. Ist ja uch irgendwie klar, weil das Formular ja noch gar nicht erstellt wurde..

Nach dem Absenden des Formulars kannst du in der eintragen.php auf die Servervariablen/-arrays zugreifen - eintragen.php deshalb, weil diese Datei als Ziel im <form>-Tag angegeben ist.

Vor dem Absenden ist, wie du sagst, natürlich noch nichts in den Arrays.

Oder was ist genau das Problem?

Grüße

Edit: Also das muss so aussehen:

Code:
if (isset($_POST['submit']))
{
    // hier stehen dir die gefüllten Arrays zur Verfügung
}

MrSpock 26. Apr 2008 16:31

Re: [PHP] $HTTP_SERVER_VARS nicht gefunden
 
Hallo Mario,

das Ergebnis bleibt gleich.

Was ich nicht verstehe ist die Reihenfolge:

Zunächst wird das Script index.php angezeigt. Wenn man dort anklickt, dass man sich eintragen möchte, wird das Script eintragen.php ausgeführt.

Dort kommt jetzt wie in meinem obigen Beitrag gezeigt zunächst die Abfrage of $name und $email usw. leer sind und es werden entsprechende Fehlermeldungen vorbereitet. DANN kommt die Formulardefinition, mit einem Button:

Code:
<form action="eintragen.php" method="post">
...
und weiter unten:

Code:
<tr>
      <td width="190" bgcolor="#227CAC"></td>
      <td bgcolor="#dedede" colspan="2" align="center">
      <input type="reset" name="reset" value="Angaben l&ouml;schen">
      <input type="submit" name="submit" value="Eintragen">
      </td>
   </tr>
Ich verstehe das so, dass erst wenn das Formular dann abgeschickt wird, ruft sich eintragen.php selbst wieder auf und erst jetzt ist der Array $_REQUEST gefüllt. In der bisherigen Version wurde ja direkt auf die Variablen $name, $email usw. zugegriffen, die ja nicht existieren mussten. Das fordert PHP ja nicht.

Oder verstehe ich da etwas falsch? :stupid:

Matze 26. Apr 2008 16:35

Re: [PHP] $HTTP_SERVER_VARS nicht gefunden
 
Hi,

schau dir mal meinen (rechtzeitig abgesendeten) Nachtrag an. ;)

Grüße

MrSpock 26. Apr 2008 16:59

Re: [PHP] $HTTP_SERVER_VARS nicht gefunden
 
Hallo Matze,

das isset hat mir geholfen. Jetzt bin ich soweit, dass es funktioniert bis zum Eintrag in die Datenbank.

Dort wird ein sql String zusammengebaut:

Code:
$sql = "INSERT INTO gbook VALUES ('','$datum','$zeit','$_REQUEST["name"]','$_REQUEST["email"]','$_REQUEST["www"]','$_REQUEST["eintrag"]','$_REQUEST["ip"]')";
Problem hier ist, dass durch das Ersetzen der Variablen durch den Array Zugriff (also anstatt $name jetzt $_REQUEST["name"]) der String nicht mehr passt, weil beim ersten " in der eckigen Klammer natürlich das Ende des String erkannt wird. Wie mache ich das in PHP? Gilt hier auch wie in Pascal, das ein in Anführungszeichen eingeschlossener Apastroph durch einen doppelten ersetzt werden muss?

Thorben77 26. Apr 2008 18:18

Re: [PHP] $HTTP_SERVER_VARS nicht gefunden
 
In einem String in doppelten Anführungszeichen kann man entweder so "$array[key]" oder so "{$array['key']}" auf ein Array zugreifen. Wenn key eine Konstante ist, gehts so: "{$array[key]}".

Oder aber du nimmst den Verknüpfungsoperator:
Code:
$str = "bla bla $var" . $_POST['foo'] . "bla bla $bar";
PHP: Strings: Variable parsing

Matze 26. Apr 2008 18:22

Re: [PHP] $HTTP_SERVER_VARS nicht gefunden
 
Hi Albert,

du kannst die Zeichen ' und " (je nach dem, in deinem Fall ") einfach escapen, also einen Backslash davor schreiben. Dadurch wird dieses Zeichen nicht als Stringanfang/-Ende erkannt. Ich bin mir auch nicht ganz sicher, ob es gehen würde, da ich es nie so mache. Normalerweise ist das nicht nötig, wenn du die Strings verknüpfst. Was in Delphi das "+" ist, ist in PHP der ".".

Ich würde aber auf alle Fälle alle (!) Array-Werte je in ein mysql_real_escape_string() setzen. Sonst sind MySQL-Injections möglich und das ist alles andere als vorteilhaft.

Grüße

Edit: Zu langsam, aber der Sicherheitshinweis ist wichtig.

omata 26. Apr 2008 18:33

Re: [PHP] $HTTP_SERVER_VARS nicht gefunden
 
Zitat:

Zitat von MrSpock
Dort wird ein sql String zusammengebaut:

Code:
$sql = "INSERT INTO gbook VALUES ('','$datum','$zeit','$_REQUEST["name"]','$_REQUEST["email"]','$_REQUEST["www"]','$_REQUEST["eintrag"]','$_REQUEST["ip"]')";

Grausamer gehts wohl nicht...

Vorschlag:
Code:
function SQLReplace($sql, $params) {
  foreach($params as $name => $value){
    $sql = str_replace(':' . $name, $value, $sql);
  }
  return $sql;
}

$sql =
  "INSERT INTO gbook
   VALUES (:leer, :datum, :zeit, :name, :email, :www, :eintrag, :ip)";

$params['leer']   = "''";
$params['datum']  = "'" . $datum . "'";
$params['zeit']   = "'" . $zeit . "'";
$params['name']   = "'" . $_REQUEST["name"] . "'";
$params['email']  = "'" . $_REQUEST["email"] . "'";
$params['www']    = "'" . $_REQUEST["www"] . "'";
$params['eintrag'] = "'" . $_REQUEST["eintrag"] . "'";
$params['ip']     = "'" . $_REQUEST["ip"] . "'";
$sql = SQLReplace($sql, $params);
Wobei ich da sowieso immer für eine OOP-Lösung wäre, also gleich alles mit Klassen realisieren. Das ist wesentlich übersichtlicher und wartbarer.
Man kann auch mit PHP ordentliche Software produzieren. Stichwort: E_All | E_Strict !

Gruss
Thorsten

MrSpock 26. Apr 2008 20:40

Re: [PHP] $HTTP_SERVER_VARS nicht gefunden
 
Danke Omata für die Aufmunterung :mrgreen:

Zitat:

Grausamer gehts wohl nicht...
Habe es jetzt geändert, weil mir Matze gezeigt hat, dass es nicht nur grottenschlecht, sondern auch unsicher war.

Jetzt sollte es besser sein.

Danke Euch allen für die Hilfe. Muss mich unbedingt etwas mehr in PHP einarbeiten. :stupid:

generic 26. Apr 2008 20:43

Re: [PHP] $HTTP_SERVER_VARS nicht gefunden
 
wenn ihr eine db klasse verwendet, ist der zugriff auf die db viel leichter.
wie wäre es mit pear:db oder pear:mdb2.

bei ^denen gibt es dann auch weniger probleme mit injections.

ansonsten gibt es noch orm's z.B. : http://www.phpdoctrine.org/


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:06 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz