Gå til innhold

Kode-problem som følge av oppgradering fra php_5.6 til php_7.2


Anbefalte innlegg

Jeg har en rekke operative PHP-løsninger (php_5.6), mot MySql database. Men nå opplever jeg problem med å endre eksisterende PHP-kode  slik at systemene også fungerer under PHP v.7.2
PHP 5.6 blir om kort tid dessverre faset ut (av min "provider") - og jeg har ekstrem tidsnød i forhold til å få mine eksisterende PHP-baserte systemer til å fungere - OGSÅ under 7.2:
 

1)
I php 5.6 vil følgende "INC-fil",  som opprette forbindelse til MySql-databasen, fungere:

 

<?php
$dbcnx =@mysql_connect("xxxxx.com.mysql","database_com", "passord");
  mysql_query("SET NAMES utf8");

if  (!$dbcnx)
    {
    echo mysql_errno().":".mysql_error();
    die('<p> Det er for øyeblikket ikke mulig å opprette forbindelse med databaseserveren </br>
      Prøv igjen senere </p>');
    }
?>

 

SPØRSMÅL1:
Hvordan skal en "INC-fil" under PHP 7.2  se ut - for å oppretet kontakt med databasen?



2)
Selve programkodingen kan under php 5.6  f.eks. se ut som følger:
 

  include ("cgi-bin/filnavn.INC");
   $fornavn=ucfirst(strtolower(trim($inndata['fornavn'])));
   $etternavn=ucfirst(strtolower(trim($inndata['etternavn'])));
   $tlf=$inndata['tlf'];
   $mail=$inndata['mail'];

   /*mysql_select_db() er en innebygget funksjon for å kommunisere med MySQL-database  */
   if (! @mysql_select_db('database_com') )
      {
      die ('Unable to locate the database at this time')

      }

      $result=mysql_query("select * from tabell where ((fornavn='$fornavn') and (fornavn !='')) and    etternavn='$etternavn' and mail='$mail'");

      if (mysql_num_rows($result)>0)
         {
         echo("<b>Du har allerede svart</b>");
         exit();
         }

         $query="insert into tabell SET fornavn='$fornavn', etternavn='$etternavn', tlf='$tlf' , mail='$mail' , paameldingsdato=CURDATE()";

         $result=mysql_query($query);
         if($result)
           {

           .

           bla bla bla 

           .

            }
 

SPØRSMÅL2:
Hvordan må ovennevnte lille kodeeksempel pkt2. omskrives
for å fungere under PHP 7.2?

Jeg er takknemlig for tilbakemelding - med konkret kodeeksempel, fra alle PHP-programmerere
med erfaring med php 5.6 / php 7.2  -  kode.

mvh Jarle

Endret av pumpel
Lenke til kommentar
Videoannonse
Annonse

Koden din er usikker, vid åpen for sql injections. Les deg opp på validering, sanitering og database escaping av data, og bruk dette før noe av den data-en kommer i nærheten av en SQL setning, ALDRI stol på data fra en bruker / utenfra. Prepared statements kan også være lurt å se på for bedre beskyttelse mot sql injections.

 

https://en.wikipedia.org/wiki/SQL_injection

https://secure.php.net/manual/en/mysqli.real-escape-string.php

https://secure.php.net/filter_input

https://secure.php.net/manual/en/mysqli.prepare.php

 

 

Ellers er det stort sett bare å bytte ut mysql_* funksjonene med mysqli_*

  • Liker 1
Lenke til kommentar

Takk for nyttig tilbakemelding, som har hjulpet et godt stykke på vei med oppgradering av PHP 5.6-kode til fungerende PHP 7.2-kode.

Ett problem gjenstår. Det gjelder DATAGRID, som jeg ikke er får på lufta.
Følgende INC-fil fungerte under PHP 5.6, men fungerer ikke under PHP 7.2.

<?
ini_set("display_errors", true);

define ("DATAGRID_DIR", "datagrid/");
define ("PEAR_DIR", "datagrid/pear/");

require_once(DATAGRID_DIR.'datagrid.class.php');
require_once(PEAR_DIR.'PEAR.php');
require_once(PEAR_DIR.'DB.php');
$DB_USER='xxxxx_com';            /* usually like this: prefix_name             */
$DB_PASS='xxxxxxx';         /*   must be already enscrypted (recommended)   */
$DB_HOST='xxxx.mysql';     /*        usually localhost                          */
$DB_NAME='xxxxxx_com';      /*    usually like this: prefix_dbName           */

$db_conn = DB::factory('mysql');
$db_conn -> connect(DB::parseDSN('mysql://'.$DB_USER.':'.$DB_PASS.'@'.$DB_HOST.'/'.$DB_NAME));
 
  ?>

Følgende feilmelding kommer som følge av ovennevnte:
"Parse error: syntax error, unexpected 'new' (T_NEW) in /customers/9/b/8/xxxx.com/httpd.www/xxxx/datagrid/pear/DB.php on line 387
"


SPØRSMÅL:
Hvordan må koden over konkret se ut for at datagrid skal få connection til mysqldatabasen, og/eller
slik at variabelen $db_conn får det innhold DATAGRID forlanger at den skal ha?   

Er takknemlig for forslag til konkret kode.

Endret av pumpel
Lenke til kommentar

379  $classname = "DB_${type}";
380        if (!class_exists($classname)) {
381            $tmp = PEAR::raiseError(null, DB_ERROR_NOT_FOUND, null, null,
382                                    "Unable to include the DB/{$type}.php file for `$dsn'",
383                                    'DB_Error', true);
384            return $tmp;
385        }
386
387        @$obj =& new $classname;
388
389        foreach ($options as $option => $value) {
390            $test = $obj->setOption($option, $value);
391            if (DB::isError($test)) {
392                return $test;
393            }
394        }

Lenke til kommentar

Det er fortsatt et PROBLEM å få oppkoblet DATAGRID til en MYSQL-database etter at PHP 5.6

ble prompte byttet ut. 

Siden PHP7.2 derfor MÅ benyttes, skaper dette store problemer for de mange systemer som kjører DATAGRID.

SPØRSMÅL:
Kjenner noen til et domene/web-hotell som er villig til å IKKE slå av PHP 5.6?

Dette ville i såfall løse problemet 

Endret av pumpel
Lenke til kommentar

Kjenner noen til et domene/web-hotell som er villig til å IKKE slå av PHP 5.6?

Det er fordi 5.6 ikke lenger er vedlikeholdt (ingen sikkerhets patcher osv) etter 31.12.2018. Så jeg tviler på at du vil finne noen (seriøse) aktører som vil tilby en usikker php versjon.

Php 7 er vesentlig raskere enn 5.x, i tillegg til en del andre hyggelig forbedringer. Er ingen grunn til å bli værende på 5.6.

 

@$obj =& new $classname;
Å bruke @ for å ikke vise evt (feil)meldinger er sløv koding. Skriv god kode som ikke generer eller håndterer slik ting på en skikkelig måte.

Alle ny klasser blir henvist til med en referanse uansett, dropp &.

 

Til info: PHP 7 er en del strengere på en del ting enn PHP 5, se på det som en mulighet til å forbedre koden og lære.

Endret av Crowly
Lenke til kommentar

Det er fordi 5.6 ikke lenger er vedlikeholdt (ingen sikkerhets patcher osv) etter 31.12.2018. Så jeg tviler på at du vil finne noen (seriøse) aktører som vil tilby en usikker php versjon.

Php 7 er vesentlig raskere enn 5.x, i tillegg til en del andre hyggelig forbedringer. Er ingen grunn til å bli værende på 5.6.

Uten at jeg vil spore av tråden helt her, men dette er totalt feil. RHEL 7 kommer med PHP 5.4 og støttes til ut i 2024. Selv RHEL 7.5 som ble sluppet ut tidligere i år leveres med PHP 5.4 på tross av at EOL for PHP 5.4 var i 2015 en gang. Det betyr selvsagt ikke at PHP levert i RHEL 7 er utrygt, men skyldes noe så banalt som at Red Hat tar ansvar for å fikse opp PHP-versjonen de leverer. Det er fordelen med åpen kildekode :)

 

Selvsagt ikke uenig i at det er fordeler å få hvis man hopper over på PHP 7, men å fortsatt leve i PHP 5.x-verden er altså på ingen måte useriøst eller usikkert.

Lenke til kommentar

Sitter på mobilen, så får ikke testet det selv, men referanse til et objekt du lager? Det høres utrolig ulogisk ut. Hva skjer om du fjerner & i den linja?

Har testet dette lokalt nå, og selvsagt fungerer ikke den linjen du refererer til. Hva er det egentlig du prøver på i den linja? Referanse til et temporært objekt går jo på ingen måter. Hva er det egentlig du forventer å få en referanse til?

Lenke til kommentar

Hei
Jeg prøver å få den siste versjonen DATAGRID 8.2.7 til å fungere sammen emd PHP 7.2.

Det er oppstått et nytt problem som ikke var der tidligere, som har med PHP 7.2 og "include_path" å gjøre.
I nedenstående feilmeling går det frem at include_path er standard satt til følgende
"(include_path='.:/usr/share/php')".
Og dette har vel med hvordan include_path i  PHP 7.2  er satt på server, eller?

Problemet er (i å få PHP 7.2) å definere en variabel  'DATAGRID_DIR'  til å peke på katalogen "DATAGRID", som altså ligger (må ligge) rett under katalogen der scriptet ligger eller kjøres fra.

Følgende kode lar seg altså ikke vellykket utføre:
<?
define('DATAGRID_DIR', "..datagrid/");    
    require_once(DATAGRID_DIR.'datagrid.class.php');
?>

Følgende feilmeling gir en pekepinn på hva som er problemet:
"
Warning: require_once(..datagrid/datagrid.class.php): failed to open stream: No such file or directory in /customers/9/b/8/tromsoo.com/httpd.www/baattur/test.php on line 23
Fatal error: require_once(): Failed opening required '..datagrid/datagrid.class.php' (include_path='.:/usr/share/php') in /customers/9/b/8/tromsoo.com/httpd.www/baattur/test.php on line 23  
"

Kan dere antyde løsning på dette problemet i PHP 7.2 ?

 

Lenke til kommentar

Problemet er (i å få PHP 7.2) å definere en variabel 'DATAGRID_DIR' til å peke på katalogen "DATAGRID", som altså ligger (må ligge) rett under katalogen der scriptet ligger eller kjøres fra

Nei den må ikke ligge rett under den katalogen. Alt du trenge å gjøre er å sette rett path i DATAGRID_DIR definen. Hvor det er en feil i koden, det mangler en slash

define('DATAGRID_DIR', "../datagrid/");

// ligger datagrid ett annet sted kan man gjøre
define('DATAGRID_DIR', "/en/eller/annen/path/til/datagrid/");
En enda bedre løsning er å ta i bruk en autoloader. Composer sin autoloader er bransje standard (så vidt jeg vet).
Lenke til kommentar

Jeg har testet ulike plasseriner av datagrid-katalogen og endret setningen deretter.
 

Har testet både

define('DATAGRID_DIR', "../datagrid/");  

og       
define('DATAGRID_DIR', "datagrid/");


Syntaksen jeg bruker -  f.eks.
define('DATAGRID_DIR', "../datagrid/"); 
er rett, MEN den gir feilmelding - som tidligere antydet.
Feilmeldingen er som følger:

"
Fatal error: Uncaught Error: Call to a member function DataSource() on null in /customers/9/b/8/tromsoo.com/httpd.www/baattur/test2.php:79 Stack trace: #0 {main} thrown in /customers/9/b/8/tromsoo.com/httpd.www/baattur/test2.php on line 79
"

 

Nei, sikkert ikke noe feil med selve PHP 7.2, MEN PHP 7.2 må jo f.eks.være riktig satt opp på providerens server...
Lurer på at det kan være problemet?
.

Endret av pumpel
Lenke til kommentar

Tviler på at PHP ikke er "riktig" satt opp. Du får jo i klartekst hva som er feil.

 

No such file or directory in /customers/9/b/8/tromsoo.com/httpd.www/xxx/xxx.php on line 51

 

Finnes den eksakte stien /customers/9/b/8/tromsoo.com/httpd.www/datagrid/datagrid.class.php? Er den lesbar for HTTP-serveren?

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...