Stieler: Problem mit Sessions nach Umstellung von PHP 4 auf PHP 5

Hallo zusammen,

ich habe ein kleines Problem. Nachdem ich einen neuen Server habe, auf dem jetzt PHP 5 und MYSQL 5.026 laufen statt zuvor PHP 4.4 und MYSQL 4.1, laufen viele meiner alten Skripte nicht mehr fehlerfrei.

Auf diesen Seiten werden eigentlich große Datenmengen mit einzelnen Textfeldern und Checkboxen(mindestens jeweils 250)eingetragen und in die Datenbank eingetragen. Seit der Umstellung ist jedoch nur noch möglich jeweils max. 80 (zusammen also 160) Datenfelder zur Datenbank zu übertragen.

Hat jemand eine Idee, was ich auf dem neuen Server bzw. in der PHP.ini oder so ändern müsste, damit die Skripte wieder einwandfrei laufen?

mfg
Simon

  1. Hallo

    ich habe ein kleines Problem. Nachdem ich einen neuen Server habe, auf dem jetzt PHP 5 und MYSQL 5.026 laufen statt zuvor PHP 4.4 und MYSQL 4.1, laufen viele meiner alten Skripte nicht mehr fehlerfrei.

    vielleicht sind diese Skripte ja auch alles andere als fehlerfrei.

    Hat jemand eine Idee, was ich auf dem neuen Server bzw. in der PHP.ini oder so ändern müsste, damit die Skripte wieder einwandfrei laufen?

    Weder PHP5 noch MySQL 5.0.26 haben prinzipiell Probleme mit solch kleinen Datenmengen. Allerdings gab es eine Reihe von Änderungen - auch inkompatible Änderungen zwischen den von Dir angegebenen Versionen.

    Ohne Codeausschnitte kann man Dir nicht weiterhelfen.
    Welche Fehlermeldungen erhältst Du überhaupt?

    Freundliche Grüße

    Vinzenz

    1. Hallo

      ich habe ein kleines Problem. Nachdem ich einen neuen Server habe, auf dem jetzt PHP 5 und MYSQL 5.026 laufen statt zuvor PHP 4.4 und MYSQL 4.1, laufen viele meiner alten Skripte nicht mehr fehlerfrei.

      vielleicht sind diese Skripte ja auch alles andere als fehlerfrei.

      Hat jemand eine Idee, was ich auf dem neuen Server bzw. in der PHP.ini oder so ändern müsste, damit die Skripte wieder einwandfrei laufen?

      Weder PHP5 noch MySQL 5.0.26 haben prinzipiell Probleme mit solch kleinen Datenmengen. Allerdings gab es eine Reihe von Änderungen - auch inkompatible Änderungen zwischen den von Dir angegebenen Versionen.

      Ohne Codeausschnitte kann man Dir nicht weiterhelfen. Welche Fehlermeldungen erhältst Du überhaupt?

      Freundliche Grüße

      Vinzenz

      Hi Vinzenz,

      hier ist einmal ein Skript. Und leider erhalte ich keine Fehlermeldungen sondern es werden einfach nur die 80 Einheiten übertragen und die anderen nicht.

      require('includes/application_top.php'); if($_SESSION['zugriff']==2) tep_redirect(tep_href_link('index.php'));

      /***************************************************************************************  Variablen für das Skript  $_GET   - bestellung  Id der Bestellung ***************************************************************************************/   $unset_backgroundcolor = 1;   if(!isset($_GET['bestellung']) || !is_numeric($_GET['bestellung'])){    tep_redirect(tep_href_link('index.php'));   }

      /*************************************************************************************** SELECT-Abfrage definieren ***************************************************************************************/

      /*************************************************************************************** Aktions-Handling ***************************************************************************************/   if(isset($_GET['doit'])) {    $our_key = 'linke_ordner';    foreach($POST as $key => $value)if(substr($key,0,3)=='bt'){     $our_key = substr($key, 3);     if(($p = strrpos($our_key, '#'))!==false){      $id = substr($our_key, $p+1);      $our_key = substr($our_key, 0, $p);     }    }

      switch($our_key){     case 'delete':         //Bestellposition         $positionen_query = tep_db_query('select bp.* from products_entity pe, bestellpositionen bp                                           where pe.entity_id='.$id.' and pe.bestellposition=bp.position_id');         $positionen = tep_db_fetch_array($positionen_query);

      //Löschen         $entity_query = tep_db_query('select * from products_entity where entity_id='.$id);         $entity = tep_db_fetch_array($entity_query);         if(is_null($entity['seriennummer']) && $entity['status']=='1')          tep_db_query('delete from products_entity where entity_id='.$id.' limit 1');

      //Status         $anzahl_entities_query = tep_db_query('select count(*)as anzahl from products_entity where bestellposition='.$positionen['position_id']);         $anzahl_entities = tep_db_fetch_array($anzahl_entities_query);         $status = '1';         if($anzahl_entities['anzahl']<$positionen['anzahl'])$status='4'; //Teillieferung         if($anzahl_entities['anzahl']>=$positionen['anzahl'])$status='2';  //komplett         if($anzahl_entities['anzahl']=='0')$status='1';  //offen         tep_db_query('update bestellpositionen set bestellstatus='.$status.' where position_id='.$positionen['position_id']);

      $positionen_query = tep_db_query('select * from bestellpositionen where position_id='.$positionen['position_id']);         while($positionen = tep_db_fetch_array($positionen_query)){          tep_update_products_attribute($positionen['attributes_id']);         }      break;

      case 'save':          foreach($POST['cf_seriennummer'] as $id){           $seriennummer = array(array('seriennummer', $POST['tf_seriennummer'.$id], 'string', '', 'NULL', '', ''));           $endung = substr($id, -1);           if($endung=='1'){ //schon vorhandene Entities            $entity_id = substr($id, 0, -2);            //passende Bestellposition ermitteln            $positionen_query = tep_db_query('select bp.* from products_entity pe, bestellpositionen bp                                              where pe.entity_id='.$entity_id.' and pe.bestellposition=bp.position_id');            $positionen = tep_db_fetch_array($positionen_query);            tep_db_query(tep_db_perform('products_entity', 'update', $seriennummer, ' where entity_id='.$entity_id));           } else { //neu eingescannte            $position_id = substr($id, 0, strpos($id, ''));            $positionen_query = tep_db_query('select bp.* from bestellpositionen bp                                              where bp.position_id='.$position_id);            $positionen = tep_db_fetch_array($positionen_query);            $seriennummer[]= array('attributes_id', $positionen['attributes_id'], 'int', '', '', '', '');            $seriennummer[]= array('name', $positionen['products_name'], 'string', '', 'NULL', '', '');            $seriennummer[]= array('bestellposition', $positionen['position_id'], 'int', '', '', '', '');            tep_db_query(tep_db_perform('products_entity', 'insert', $seriennummer, ''));

      //            //            //runterzählen des potentiellen Lagerbestands            //            tep_db_query(tep_db_perform('products_attributes',             'update',             array(array('potentiell', '(potentiell-1)', 'int', '', 'NULL', '', '')),             'where potentiell>0 and attributes_id='.$positionen['attributes_id']));

      }

      //Status der Position           $anzahl_entities_query = tep_db_query('select count(*)as anzahl from products_entity where bestellposition='.$positionen['position_id']);           $anzahl_entities = tep_db_fetch_array($anzahl_entities_query);           $status = '1';           if($anzahl_entities['anzahl']<$positionen['anzahl'])$status='4'; //Teillieferung           if($anzahl_entities['anzahl']>=$positionen['anzahl'])$status='2';  //komplett           if($anzahl_entities['anzahl']=='0')$status='1';  //offen           tep_db_query('update bestellpositionen set bestellstatus='.$status.' where position_id='.$positionen['position_id']);          }

      $positionen_query = tep_db_query('select * from bestellpositionen where bestell_id='.$_GET['bestellung']);          while($positionen = tep_db_fetch_array($positionen_query)){           tep_update_products_attribute($positionen['attributes_id']);          }

      break;    }    tep_redirect(tep_href_link(FILENAME, tep_get_parameter('', 'doit')));   }   $pos = 0; ?> <!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN"> <html <?php echo HTML_PARAMS; ?>> <head> <meta http-equiv="Content-Type" content="text/html; charset=<?php echo CHARSET; ?>"> <title>ecpon-Wareneingang</title> <link rel="stylesheet" type="text/css" href="includes/stylesheet.css"> </head> <Script language="JavaScript"> var automatisch = true; var jump = true; var klick = false; var theid = '';

      function auto_weiter(){     if(document.getElementsByName('cf_automatisch')[0].checked == true){      automatisch = true;     } else {      automatisch = false;     }   }

      function weiter_springen(id){    if(automatisch==true)if(jump==true){     theid = id;     document.getElementById(id).focus;     window.setTimeout("do_jump()",1500);     jump = false;    }   }

      function do_jump(){    jump = true;    document.getElementById(theid).focus();   } </Script> <body marginwidth="0" marginheight="0" topmargin="0" bottommargin="0" leftmargin="0" rightmargin="0" bgcolor="#FFFFFF"> <!-- header //--> <?php require(DIR_WS_INCLUDES . 'header.php'); ?> <!-- header_eof //-->

      <!-- body //--> <?php echo tep_draw_form('party', FILENAME, tep_get_parameter('doit=save')); ?> <table border="0" width="100%" cellspacing="2" cellpadding="2">   <tr> <!-- left_navigation //--> <!-- left_navigation_eof //-->

      <!-- body_text //-->    <td width="100%" valign="top"> <?php /*************************************************************************************** Kopfzeile ***************************************************************************************/ ?>     <table width="100%" border="0" cellspacing="0" cellpadding="0" class="header">      <tr align="center" height="35">       <td style="border-bottom: 1px solid #C0C0C0; padding-left: 3px;" width="70%" valign="middle">        <font size="3"><b>         Wareneingang für die Bestellung <?php echo $_GET['bestellung']; ?>        </b></font>        &nbsp;&nbsp;<?php echo tep_draw_checkbox_field('cf_automatisch', $value['id'], true, '', 'onClick="auto_weiter();"'); ?>         automatisch weiter       </td>      </tr>     </table>     <table width="100%" border="0" cellspacing="0" cellpadding="0">     <?php      $positionen_query = tep_db_query('select * from bestellpositionen where bestell_id='.$GET['bestellung']);      while($positionen = tep_db_fetch_array($positionen_query)){     ?>       <tr height="30" bgcolor="#CACAD6">        <th>         <?php echo $positionen['products_name']; ?>        </th>        <th style="border-left: 1px solid #AEAEAE; padding-left: 3px;">         <?php echo 'Anzahl: '.$positionen['anzahl']; ?>        </th>       </tr>      <?php      //schon vorhandene Entities aus der db holen      $product = array();      $entity_query = tep_db_query('select * from products_entity where                                    bestellposition='.$positionen['position_id'].' and attributes_id='.$positionen['attributes_id'].'                                    order by entity_id');      while($entity = tep_db_fetch_array($entity_query)){       $product[]= array('id' => $entity['entity_id'].'#1', 'seriennummer' => $entity['seriennummer'], 'indb' => '1');      }      //ist die Anzahl in der Bestellposition größer als die Anzahl der entities in der db      $x = 0;      while(count($product)<$positionen['anzahl']){       $x++;       $product[]= array('id' => $positionen['position_id'].''.$x.'#0',                         'seriennummer' => '', 'indb' => '0');      }

      //Ausgabe      foreach($product as $id => $value){      $pos++;      ?>      <tr height="1" bgcolor="#AEAEAE"><td colspan="2"></td></tr>      <tr class="boxLight" height="30">       <td align="left" width="45%">        <?php echo tep_draw_checkbox_field('cf_seriennummer[]', $value['id'], true); ?>        <?php echo $positionen['products_name']; ?>       </td>       <td align="left" style="border-left: 1px solid #AEAEAE; padding-left: 3px;">        <?php echo tep_draw_input_field('tf_seriennummer_'.$value['id'], $value['seriennummer'], 'size="50" style="font-size: 12pt" onkeyup="weiter_springen('pos_'.($pos+1).'')" id="pos_'.$pos.'"'); ?>        &nbsp;        <?php if($value['indb']=='1'){         echo tep_image(DIR_WS_ICONS.'1.gif', 'Stück bereits in der Datenbank').'&nbsp;';         echo tep_draw_input_field('bt_delete#'.substr($value['id'], 0, -2), 'Löschen', 'onmousedown="klick=true;" onClick="return klick;"', false, 'submit');        }  ?>       </td>      </tr>      <?php } } ?>      <tr height="40" class="navigationDark">       <td width="30%" align="center">        <?php echo tep_draw_input_field('bt_save', 'in Datenbank speichern', 'onmousedown="klick=true;" onClick="return klick;"', false, 'submit'); ?>       </td>       <td width="70%">        <?php echo tep_draw_input_field('bt_cancel', 'Abbrechen', 'onmousedown="klick=true;" onClick="return klick;"', false, 'submit'); ?>       </td>      </tr>     </table>    </td>   </tr>

      </table> </form> <!-- body_eof //-->

      <!-- footer //--> <?php require(DIR_WS_INCLUDES . 'footer.php'); ?> <!-- footer_eof //--> <br> </body> </html> <?php require(DIR_WS_INCLUDES . 'application_bottom.php'); ?>

      1. Hallo Simon,

        Welche Fehlermeldungen erhältst Du überhaupt?

        hier ist einmal ein Skript. Und leider erhalte ich keine Fehlermeldungen sondern es werden einfach nur die 80 Einheiten übertragen und die anderen nicht.

        Allgemeine Debuggingstrategien:

        Setze error_reporting auf E_ALL (und display_errors auf on).

          
        
        >   if(isset($_GET['doit'])) {  
        >       $our_key = 'linke_ordner';  
        >       foreach($_POST as $key => $value)  
        
        

        Lass Dir die Inhalte Deiner Variablen der superglobalen Arrays anzeigen.
        Für Debug-Ausgaben eignen sich z.B: echo, print_r, var_dump.

        Freundliche Grüße

        Vinzenz

      2. echo $begrüßung;

        Hat jemand eine Idee, was ich auf dem neuen Server bzw. in der PHP.ini oder so ändern müsste, damit die Skripte wieder einwandfrei laufen?

        Es ist keine gute Idee, die alten PHP-4-Einstellungen wiederherzustellen. Sie sind nicht ohne Grund umgestellt worden. Ab PHP 6 werden sogar einige dieser umstrittenen Features ganz entfallen. Wenn du trotzdem nachlesen möchtest, welche Default-Werte geändert wurden, findest du entsprechende Hinweise in der Liste der php.ini-Direktiven. Allerdings helfen die dir auch nicht viel, wenn die Werte im Server explizit geändert wurden. Dann hilft nur ein phpinfo()-Vergleich beider Systeme weiter.

        hier ist einmal ein Skript.

        Das ist zu wenig dokumentiert, beinhaltet zudem noch jede Menge unbekannte Funktionen und ist außerdem (für meine derzeitige Stimmung) viel zu lang zum Durchlesen, ohne es an einem Testsystem nachvollziehen zu können.

        Und leider erhalte ich keine Fehlermeldungen sondern es werden einfach nur die 80 Einheiten übertragen und die anderen nicht.

        Steht das error_reporting auf E_ALL (und display_errors auf on), damit dir wirklich alle Hinweise PHPs angezeigt werden? Welche Unterschiede gibt es zwischen den Fällen "80 Einheiten" und "die anderen"? Lass dir dazu bitte die Inhalte der beteiligten Variablen ausgeben. Wenn du sie durch diese Kontrollausgaben nicht siehst, versuche das Problem mit dem kleinstmöglichen Code nachzubauen, allen für das Problem nicht benötigen HTML- und PHP-Code zu entfernen, und es somit überschaubarer zu machen. Das erleichtert auch die Fehlersuche. Manchmal verschwindet der Fehler auch dabei, dann ist er vermutlich im Zusammenspiel mit scheinbar unwichtigen und deshalb nicht beachteten Code-Teilen zu suchen.

        echo "$verabschiedung $name";

    2. Moin!

      ich habe ein kleines Problem. Nachdem ich einen neuen Server habe, auf dem jetzt PHP 5 und MYSQL 5.026 laufen statt zuvor PHP 4.4 und MYSQL 4.1, laufen viele meiner alten Skripte nicht mehr fehlerfrei.

      vielleicht sind diese Skripte ja auch alles andere als fehlerfrei.

      Kann man so nicht immer sagen. Ich bin über die in PHP bis dato absolut zulässige Verwendung der Variable $this gestolpert und bekam mit PHP5 plötzlich die Fehlermeldung in Zeile X könne eine Variable nicht redeklariert werden.

      1.) Alle Fehler und Notizen anzeigen lassen (der kam schon...)
      2.) Alle SQL-Statements, die sonst via PHP an die Datenbank gesendet werden, ausgeben lassen und mal im von MySQL mitgelieferten Client auf die Datenbank loslassen. Dort sollte es Fehlermeldungen geben.
      3.) Ausgaben von phpinfo() aufmerksam lesen. Möglicherweise sind da irgendwelche Grenzen gesetzt. (der kam schon)

      MFFG (Mit freundlich- friedfertigem Grinsen)

      fastix®

      --
      Als Freiberufler bin ich immer auf der Suche nach Aufträgen: Schulungen, Seminare, Training, Development
  2. Hello,

    ich habe ein kleines Problem.

    Wenn ich mir den Code anschaue, dann ist es schon ein größeres Problem.
    Dieser Code ist für Fremde nahezu unwartbar!

    Nachdem ich einen neuen Server habe, auf dem jetzt PHP 5 und MYSQL 5.026 laufen statt zuvor PHP 4.4 und MYSQL 4.1, laufen viele meiner alten Skripte nicht mehr fehlerfrei.

    Ich konnte Datenbanqueries in Schleifen entdecken.
    Wurden denn die Resultsets auch mal irgendwo wieder freigegeben?
    Das kann ich so nicht feststellen, vermut aber, dass dies versäumt wurde.

    Eine Fehlerauswertung nach den Queries kann ich auch nicht erkennen.

    das beides zusammen wäre für mich schon Hinweis genug, zu überprüfen, ob das DBMS sich nicht im Hintergrund ganz laut beschwert, dass es keine Ressourcen mehr hat, aber keiner hört zu!

    Und dann natürlich diese Mängel abstellen, also Fehlerbehandlung und Resultsets wieder freigeben!

    Harzliche Grüße aus
    Sankt Andreasberg
    und Frohes Neues Jahr

    Tom

    --
    Nur selber lernen macht schlau