Single post

PHP změna 5 na 7

Jak připravit aplikaci na PHP 7

Převod aplikace z PHP 5 na PHP 7 se může zdát jako složitý úkol, u většiny jednoduchých aplikací jde ale zvládnout několika jednoduchými kroky.

Pozor: Návod vyžaduje jistou úroveň znalostí PHP, není samospásný a hlavně: NIKDY NEPŘEVÁDĚJTE APLIKACI NA OSTRÉM SERVERU, vždy si kódy zkopírujte na testovací server, nebo localhost a vždy si udělejte zálohu původní aplikace, ať se k ní můžete kdykoli vrátit.

Zapnutí chybových hlášek

PHP vám samo řekne, které funkce již nepodporuje. Zapnutím chybových hlášek zjistíte které funkce to jsou a kde se nachází.

<?php
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

Více o nastavení výpisu chyb v samostatném článku: jak zapnout výpis chyb v PHP.

Databáze

Nejzákladnější změnou, se kterou se setkáte v téměř každé starší aplikaci je ukončená podpora mysql, které nahrazuje mysqli. Naštěstí změna je většinou velmi jednoduchá.

mysql_connect

Otevřete si zdrojové kódy v nějaké aplikaci, která umí hromadné nahrazení kódu, například Netbeans, PhpStorm a jiné. Dejte si vyhledat řetězec „mysql_connect“.

Všechny výskyty pak nahraďte mysqli připojením, podle toho, zda je vaše aplikace psaná procedurálně, nebo objektově.

Procedurálně

$database = mysqli_connect("host","jmeno","heslo","název databáze");

Objektově

$this->database = mysqli_connect("host","jmeno","heslo","název databáze");

mysql_query

Pak jsou na řadě dotazy do databáze. Hlavní změnou mezi mysql a mysqli je, že mysqli vyžaduje jako první parametr připojení do databáze. To je výsledek funkce mysli_connect.

Jelikož dotazů do databáze bývá v aplikaci opravdu hodně, použijeme funkci hromadně nahradit. Všechna vývojářská IDE takovou funkcí disponují. Pokud ne, najděte si jiné.

Nyní v celé aplikaci nahraďte procedurálně nebo objektově:

Procedurálně
"mysql_query(" -> "mysqli_query($database, "

Objektově
"mysql_query(" -> "mysqli_query($this->database, "

Zachovejte na konci čárku a mezeru, kód pak bude lépe čitelný. Pozor na to, že v některých aplikacích může být mezi názvem funkce a závorkou mezera „mysql_query („. Takové případy je potřeba ošetřit také. Ověřte si, jaký styl vaše aplikace používá.

mysql_error a mysql_insert_id

Funkce mysqli_error a mysqli_insert_id také vyžadují připojení do databáze, proto znovu hromadně nahradíme:

Procedurálně
"mysql_error(" -> "mysqli_error($database"
"mysql_insert_id(" -> "mysqli_insert_id($database"

Objektově
"mysql_error(" -> "mysqli_error($this->database"
"mysql_insert_id(" -> "mysqli_insert_id($this->database"

Ostatní mysql funkce

Ostatní mysqli funkce již připojení k databázi nevyžadují, proto můžeme hromadně nahradit už jen předponu:

"mysql_" -> "mysqli_"

mysql_result

V některých aplikacích se vyskytuje i funkce mysql_result, která se ale bohužel nedočkala nástupce v podobě mysqli_result. Bylo by ale složité ji všude nahrazovat jinou funkcí, proto si ji prostě napíšeme.

Funkci mysqli_result je potřeba dát někam na začátek aplikace. Tak, aby se definovala ještě před prvním použitím. Obyčejně k tomu slouží nějaký soubor s názvem functions.php, func.php, nebo podobně, který se includuje na začátek scriptu a ve kterém jsou různé funkce, včetně naší nové. Pokud takový soubor nemáte a nemáte možnost ho jednoduše vytvořit a includovat do všech scriptů, pak můžete funkci přidat i do konfiguračního, nebo databázového souboru: config.php, conf.php, db.php, database.php. Není to nejčistší řešení, ale mělo by fungovat.

<?php
function mysqli_result($res,$row=0,$col=0){
    $numrows = mysqli_num_rows($res);
    if ($numrows && $row <= ($numrows-1) && $row >=0){
        mysqli_data_seek($res,$row);
        $resrow = (is_numeric($col)) ? mysqli_fetch_row($res) : mysqli_fetch_assoc($res);
        if (isset($resrow[$col])){
        return $resrow[$col];
        }
    }
    return false;
}

PEAR

Pokud vaše aplikace používá knihovnu PEAR, bude většinou potřeba ji nejdříve aktualizovat. Alespoň knihovnu db. Po aktualizaci pak bude potřeba změnit universal connection string ze stringu na array.

Původní string vypadá nějak takto:

$dsn = 'mysql://'.
DATABASE_NAME . ':' .
DATABASE_PASSWORD . '@' .
DATABASE_HOST . '/' .
DATABASE;

Nebo
$dsn = 'mysql://uzivatel:heslo@host/nazevdatabaze';

Ten je potřeba nahradit polem (dosaďte své proměnné/hodnoty):

$dsn = array(
'phptype' => 'mysqli',
'username' => DATABASE_NAME,
'password' => DATABASE_PASSWORD,
'hostspec' => DATABASE_HOST,
'database' => DATABASE,
);

Eval

Funkce eval existuje i v PHP 7, ale rozdíl je ve vracení hodnoty v případě chyby v cílovém souboru. Zatímco PHP 5 vrací při chybě FALSE a normálně pokračuje dále, PHP 7 vyhodí ParseError exception, což bez ošetření zastaví běh scriptu. Nově se vám tedy mohou objevovat chyby i tam, kde bylo dříve jen prázdné místo.

Ereg a Eregi

Funkce ereg a eregi již v PHP 7 nejsou. Je potřeba je nahradit funkcí preg_match a uzavřít regulární výraz do lomítek. V případě eregi pak ještě za druhé lomítko přidat písmeno i. Příklad:

$result = ereg("^([0-9]{4})$" , $filename);
Odpovídá
$result = preg_match("/^([0-9]{4})$/" , $filename);

A

$result = eregi("^([0-9]{4})$" , $filename);
Odpovídá
$result = preg_match("/^([0-9]{4})$/i" , $filename);

Split

Split je na tom podobně jako ereg. Je potřeba uzavřít regulární výraz do lomítek a odescapovat speciální znaky jako lomítka a tečky zpětným lomítkem.

$result = split ('[/.-]', $date)
Odpovídá
$result = preg_split ('/[\/\.-]/', $date)

Závěr

Toto jsou všechny funkce, na které jsem při převodu do PHP 7 zatím narazil. Návod určitě není samospásný a občas se bude potřeba probrat kódem více, ale u většiny jednoduchých aplikací si vystačíte klidně jen s nahrazením mysql za mysqli.

Write a Comment

Your email address will not be published. Required fields are marked *