Zur Navigation

Probleme mit PHP 5.2

1 Peter

Hallo Forum,

habe seit heute PHP 5.2 auf meinen Server bekommen.
Scheinbar kommt PHP 5.2 nicht mit folgendes klar.

Die Fehlermeldung beziehen sich immer auf :
on line 157
    $$var = $_POST[$var];
on line 159
    printf("Die Daten wurden von %s aus verschickt.",
on line 166
    $pg = substr($_POST['dessin'], 4, 1);
on line 204
   $hochpg = $hoch + substr($_POST['dessin'], 4, 1);



Hier ein Link:
http://www.windeko.de/shop/xaranshop_k007001001s001_1.php
Hier der Codeabschnitt:
<?php
  // lokale Variablen setzen
  $vars = array("EinB", "breite", "EinH", "hoch", "pg", "bild", "preis", "dess", "dessin", "sf", "klemm", "bedien", "vs", "variante1_1", "variante2_1", "variante3_1");
    //Array fuer dessin setzen
    $dessins = array('20000 weiss hellgrau Profile Farbgleich', '01501 weis perforiert Profile Farbgleich', '09000 weiss  Profile Farbgleich', '01060 grauweiss Profile Farbgleich', '80120 lichtgrau Profile in 05110', '05110 seidengrau Profile Farbgleich', '73441 alu geb&uuml;rstet Profile in 01680', '90601 silber gemustertProfile in 01680', '90801 grau mamoriert Profile in  05110', '70101 alu perforiert Profile Farbgleich', '01690 alu blank Profile in 01680', '73281 alu geb&uuml;rstet Profile in 01680', '01670 weissaluminium Profile in 01680', '01680 graualuminium Profile Farbgleich', '05761 alu weis gefleckt Profile in 02110', '01580 achatgrau Profile in 05110', '02110 glitzer silber Profile Farbgleich', '01990 goldmetallic Profile in 02100', '19260 pastell gelb Profile Farbgleich', '05180 zinkgelb Profile Farbgleich', '01940 ginstergelb Profile Farbgleich', '00430 maisgelb Profile Farbgleich', '01790 hellrotorange Profile Farbgleich', '05781 alu orange gefleckt Profile in 02110', '73321 kupfer geb&uuml;rstet Profile in 02120', '01820 beigerot terracotta hell Profile Farbgleich', '92941 terra rot gemustert Profile in 01860', '01860 rotorange Profile Farbgleich', '02000 verkehrsrot Profile Farbgleich', '04750 signalrot Profile Farbgleich', '01870 bordeaux violett Profile Farbgleich', '02050 hellrosa Profile Farbgleich', '73361 Profile in 02050', '04900 glitzer violett Profile Farbgleich', '10370 hellrosa metallic Profile Farbgleich', '05670 helltaubenblau Profile in 05920', '71440 hellviolett metallic Profile Farbgleich', '05920 lila Profile Farbgleich', '02040 signalviolett Profile Farbgleich', '05791 alu gl&auml;nzend gr&uuml;n gefleckt Profile in 02110', '73461 alu hellblau geb&uuml;rstet Profile in 04910', '08840 alu hellblau metallic Profile in 04910', '04910 glitzer blau Profile Farbgleich', '07600 titan gl&auml;nzent Profile in 04910', '92911 gr&uuml;n blau gemustert Profile in 05170', '05170 signalblau Profile Farbgleich', '05710 dunkelblau Profile Farbgleich', '36781 dunkelblau perforiert Profile Farbgleich', '01780 nachtblau Profile Farbgleich', '07760 t&uuml;rkis metallic Profile Farbgleich', '19230 pastellt&uuml;rkis Profile in 66030', '71620 gr&uuml;n metallic Profile Farbgleich', '66030 pastellgr&uuml;n Profile Farbgleich', '92881 hellgr&uuml;n gemustert Profile in 01950', '01950 hellgr&uuml;n Profile Farbgleich', '20070 gelbgr&uuml;n Profile Farbgleich', '92921 gr&uuml;n bedruckt Profile in 01950', '07050 verkehrsgr&uuml;n Profile Farbgleich', '20110 mintgr&uuml;n Profile in 07100', '07100 opalgr&uuml;n Profile Farbgleich', '05380 elfenbein Profile Farbgleich', '20830 perlweiss Profile Farbgleich', '48061 beige perforiert Profile Farbgleich', '73251 geb&uuml;rstet Profile in 01060', '20050 beige Profile Farbgleich', '90811 beige mamoriert Profile in 20050', '02100 glitzer gold Profile Farbgleich', '02120 glitzer kupfer Profile Farbgleich', '01170  braun Profile Farbgleich', '01640 schwarz Profile Farbgleich');
  foreach ($vars as $var)
    $$var = $_POST[$var];
  if ($sender)
    printf("Die Daten wurden von %s aus verschickt.",
           htmlentities($sender));
   if (!isset($breite))
     $breite = '60'; 
   if (!isset($hoch))
     $hoch = '80'; 
  //Preisgruppe----------------------------------
    $pg = substr($_POST['dessin'], 4, 1);
   if (!isset($preis))
     $preis = '69';  
  //varianten------------------------------------
   if (!isset($variante1_1))
     $variante1_1 = $EinB;    
   if (!isset($variante2_1))
     $variante2_1 = $EinB;  
  //seitenfuehrung--------------------------------
   if (!isset($sf))
    $sf = 'nein';
  //stanzung--------------------------------------
   if (!isset($vs))
    $vs = 'nein';
  //klemmtraeger----------------------------------
   if (!isset($klemm))
    $klemm = 'nein';
  //bedienung-------------------------------------
   if (!isset($bedien))
    $bedien = 'links';  
  //bilder----------------------------------------
   if (!isset($_POST['dessin'])) {
    $dess = '20000';
  } else {
    $dess = $_POST['dessin'];
  }
   if (!isset($_POST['dessin'])) {
    $dessinimage = '20000';
  } else {
    $dessinimage = substr($_POST['dessin'], 0, 5);
  }
  //Warenkorbbild---------------------------------
 if (!isset($_POST['dessin'])) {
    $bild = '20000';
  } else {
    $bild = substr($_POST['dessin'], 0, 5);
  }
  // Datenbankabfrage-----------------------------
   $hochpg = $hoch + substr($_POST['dessin'], 4, 1);
   $gp = "h" . $hochpg;

   $sqlab= "select breite, $gp from jalou";  
   $sqlab .= " where breite like '" . $breite . "%'";

   $res = mysql_query($sqlab) OR die(mysql_error());
   $num = mysql_num_rows($res);
   if ($num==0) echo "keine passenden Datensätze gefunden". "<br>";

   while ($dsatz = mysql_fetch_assoc($res))
   {
      $preis = $dsatz["$gp"];
         }
?>

Provider habe ich schon informiert.

Für eure Hilfe schon mal Dank im voraus
Viele Grüße
Peter

04.06.2008 23:08 | geändert: 04.06.2008 23:15

2 Rudy

Meinst Du die Meldung: Notice: Undefined Index? Die kommt, weil Du eine Variable zuweist an ein Array-Element, das nicht existiert.

Anstatt
$$var = $_POST[$var];

solltest Du prüfen, ob das Element im Array überhaupt existiert, ansonsten einen Standardwert, z.B. NULL, zuweisen:
$$var =  isset($_POST[$var]) ? $_POST[$var] : NULL;

oder in Langform wäre das:
 if (isset($_POST[$var])) { 
  $$var = $_POST[$var];
} else {
  $$var = NULL;
}

Und "Undefined Variable" sagt aus, Du verwendest eine Variable, welche du nicht initialisiert hast. Initialisiere die Variablen, die Du verwendest, indem Du ihnen auf jeden Fall einen Wert, z.B. NULL, zuweist.

$variable1 = $variable2 = $variable3 = NULL;

Das ist alles kein Problem, welches mit PHP5 zusammenhängt, sondern viel mehr von dem voreingestellten Error-Reporting. Ich finde es gut so MIT Notices, habe ich auf unseren Servern auch gemacht. Das fördert einen besseren Programmierstil und erhöht so die Sicherheit der Skripts, die all die User täglich hochladen. Und mehr Sicherheit senkt die Supportkosten.

04.06.2008 23:34 | geändert: 04.06.2008 23:38

3 Peter

Hallo Rudy,

Danke für die schnelle Antwort,
werde es gleich durchtesten.

Merkwürdig finde ich nur, das vor der Umstellung auf Fedora Core 8 und PHP 5.2. keine Probleme vorhanden waren. Daher mein Denkansatz, dass PHP 5.2 dies nicht umsetzen kann.

Viele Grüße
Peter

05.06.2008 00:01

4 Peter

Habe jetzt bis auf zwei Fehler alle weg.
 Notice: Undefined index: dessin in /var/www/vhosts/windeko.de/httpdocs/shop/xaranshop_k007001001s001_1.php on line 202

Notice: Undefined index: dessin in /var/www/vhosts/windeko.de/httpdocs/shop/xaranshop_k007001001s001_1.php on line 206

line 202 und folg.

   if (!isset($_POST['dessin'])) {
    $dessin = '20000 weiss hellgrau Profile Farbgleich';
  } else {
    $dessin = $_POST['dessin'];
  }
line 206
   $hochpg = $hoch + substr($_POST['dessin'], 4, 1);


Ich habe "dessin" doch schon definiert

05.06.2008 00:50

5 Jörg Kruse

Das nützt dir aber nichts, wenn du doch wieder auf $_POST zurückgreifst - probier's mal so:

$hochpg = $hoch + substr($dessin, 4, 1);

05.06.2008 07:32 | geändert: 05.06.2008 07:45

6 Peter

Hallo Jörg,

Danke, haut soweit hin, kleiner Schönheitsfehler:

<?php
foreach ($dessins as $dessin) {
    echo '<option value="' . $dessin . '"';
    if ($dessin == $dessin) {
        echo ' selected';
    }
    echo '>' . $dessin . '</option>';
}
?>

Leider wird hier jetzt der letzte Eintrag, also "01640 schwarz Profile Farbgleich" und nicht der erste Eintrage "20000 weiss hellgrau Profile Farbgleich" angezeigt beim laden der Seite.


Wenn ich die erste Verion lasse
    if ($dessin == $_POST['dessin']) {
wird diese Zeile als Fehler "undefiened index" angezeigt.

05.06.2008 21:14 | geändert: 05.06.2008 21:28

7 Jörg Kruse

Diese Bedingung ist immer wahr:

if ($dessin == $dessin) {

Demnach werden alle Optionsfelder ausgewählt - wobei das letzte angezeigt wird.

Du musst die Variabeln aus $_POST und $dessins unterschiedlich benennen, z.B.:

<?php
foreach ($dessins as $dessin_x) {
    echo '<option value="' . $dessin_x . '"';
    if ($dessin_x == $dessin) {
        echo ' selected';
    }
    echo '>' . $dessin_x . '</option>';
}
?>

05.06.2008 21:31

8 Peter

Bahnhof?

Wenn ich
<?php
foreach ($dessins as $muster) {
    echo '<option value="' . $muster . '"';
    if ($muster == $_POST['dessin']) {
        echo ' selected';
    }
    echo '>' . $muster . '</option>';
}
?>

Oben
 // lokale Variablen setzen
  $vars = array("EinB", "breite", "EinH", "hoch", "pg", "bild", "preis", "dess", "muster",  "dessin", "sf", "klemm", "bedien", "vs", "variante1_1", "variante2_1", "variante3_1");
    //Array fuer dessin setzen
    $dessins = array('20000 weiss hellgrau Profile Farbgleich', '01501 weis perfor

Und
  foreach ($vars as $var)
$$var =  isset($_POST[$var]) ? $_POST[$var] : NULL;
   if (!isset($muster))
     $muster = '20000 weiss hellgrau Profile Farbgleich';

bekomme ich:
die Fehlermeldung "dessin" ist nicht defeniert.


05.06.2008 22:31

9 Jörg Kruse

Ja, weil du wieder auf die nicht übertragene POST-Variable zugreifst ;):

if ($muster == $_POST['dessin']) {

So sollte die Notice nicht mehr erscheinen:

if ($muster == $dessin) {

05.06.2008 22:35 | geändert: 05.06.2008 22:36

10 Peter

Stimmt, aber sobald ich den Grundpreis berechne, schreibt er/sie/es, wieder den Standardwert "20000 weiss hellgrau Profile Farbgleich" ins Feld.

05.06.2008 22:45 | geändert: 05.06.2008 22:46