You are using an outdated browser. For a faster, safer browsing experience, upgrade for free today.

Ako previesť mysql z PHP 5 na PHP 7

Rozšírenie MySQL je vo verzii PHP 7 odstranené. Webhostingy prestávajú PHP 5 podporovať a tak musíme tento problém riešiť. Ako na to?

PHP 7 už nepodporuje rozšírenie mysql, takže akýkoľvek starší kód používajúci rozšírenie mysql bude potrebné migrovať na PDO alebo mysqli, aby mohol bežať na serveri s PHP 7 alebo vyšším.

V tomto článku nájdete príklady, ako sa pripojiť pomocou nástroja mysqli a ako migrovať metódy mysql na metódy mysqli, ktoré poskytujú príklady kódu pre niektoré z jednoduchých zmien na niektoré z tých náročnejších, dokonca aj na tie, ktoré nemajú náhrada v mysqli vám poskytneme kód, ktorý vám pomôže prevádzkovať mysql, akoby v prostredí mysqli.

Prvá vec, ktorú musíme preskúmať, je, že MySQL je prostriedok a MySQLi je objekt. Aby sme mohli migrovať náš kód, nepotrebujeme pochopiť technické rozdiely, musíme však pochopiť, že sú odlišné.

Prvá vec, ktorú zvyčajne robíme s MySQL, je pripojiť sa k databáze a vybrať ju, takže sa pozrime na mysql_connect a mysql_select_db.

$connection = mysql_connect ('host', 'username', 'password', new_link, flags); 
$database = mysql_select_db ('database', $connection);

$connection je identifikátor odkazu MySQL na zdroj a $database je len booleovská premenná, ktorá bude obsahovať true pri úspechu alebo false pri zlyhaní. Vo väčšine situácií bude váš hostiteľ localhost a zadáte iba svoje používateľské meno a heslo.

Teraz sa pozrime na jeho protipoložku v MySQLi, mysqli_connect.

$connection = mysqli_connect ('host', 'username', 'password', 'database', 'port', 'socket');

$connection je odkaz na objekt MySQLi pre toto pripojenie. Ak vaše pripojenie pomocou mysql používa iba hostiteľa, používateľské meno a heslo, potom je aktualizácia kódu rovnako jednoduchá ako zmena mysql_connect na mysqli_connect.

Mohli by ste tiež pokračovať a pridať databázu na pripojenie priamo tam v parametroch mysqli_connect a odstrániť mysql_select_db. To je v poriadku, ak neexistuje žiadna premenná na uloženie výsledku, avšak ak sa použila premenná, je možné, že niekde hlboko v kóde môže byť logika, ktorá bude túto premennú používať na kontrolu platného pripojenia k databáze. V týchto prípadoch odporúčam použiť mysqli_select_db.

$database = mysqli_select_db ($connection, 'database');

V prípade MySQL, kde ste nevyžadovali poskytnutie odkazu, sa použilo posledné otvorené pripojenie, ak nebol uvedený odkaz. Pri použití MySQLi je potrebné pripojenie a ako vidíte, je to teraz prvý parameter.

Pomocou našich príkladov je toto pripojenie $connection a názov našej databázy by zostal rovnaký. $database je stále boolovská premenná, takže ak sa na ňu odkazuje kdekoľvek inde v kóde, bude fungovať podľa očakávania.

V prípade, že vaše pripojenie nie je jednoduché štandardné pripojenie, ktorým sme práve prešli, musíme sa vrátiť a pozrieť sa znova na mysql_connect. Parameter hostiteľa môže obsahovať číslo portu, localhost: 3307 alebo soket, localhost: /path/to/mysql.sock. Pri ich migrácii na mysqli_connect by ste jednoducho presunuli port alebo soket do parametrov portu a soketu.

Možno máte nastavený príznak new_link, ktorý MySQL umožnil otvoriť nové pripojenie namiesto použitia predtým otvoreného pripojenia. Potom sa použije ktorýkoľvek odkaz, ktorý sa použije ako parameter odkazu. Pri ich migrácii jednoducho vytvoríme nový objekt MySQLi s rovnakým názvom odkazu. Na ilustráciu tohto ...

$connection2 = mysql_connect ('host', 'username', 'password', true);

by bol

$connection2 = mysqli_connect ('host', 'username', 'password');

Môžete mať tiež nastavené príznaky klienta, MySQLi ich nepoužíva a môžu byť bezpečne odstránené pri generovaní pripojenia MySQLi.

Môžete mať variáciu mysql_connect na vytvorenie trvalého spojenia, ktorým je mysql_pconnect. Ak chcete vytvoriť rovnaké trvalé pripojenie v MySQLi, jednoducho pripojte hostiteľa predponou p:, takže localhost sa stáva p: localhost.

V MySQL by sme mohli použiť mysql_error a mysql_errno na zistenie, či došlo k chybe pri pripojení. Pretože náhrady MySQLi pre tieto používajú odkaz na objekt, a aj keď sa vyskytol problém s pripojením objektu, je vrátené, musíme použiť mysqli_connect_error a mysql_connect_errno.

Pri obidvoch týchto údajoch neposkytujete odkaz, ktorý by im umožnil skontrolovať posledný pokus o pripojenie.

Teraz, keď sme dostali správne pripojenie MySQLi, máme najťažšiu časť z cesty za sebou.

Mnoho metód v MySQL má veľmi podobné procedurálne metódy v MySQLi a migrácia je rovnako jednoduchá ako pridanie "i" do mysql a pridanie alebo presunutie odkazu alebo výsledku k prvému parametru. Pamätajte, že MySQLi vyžaduje pripojenie pre metódy, ktoré odkazujú na objekt. V nasledujúcom zozname je za príkazom MySQL nahradená procedurálna metóda MySQLi.

mysql_affected_rows -> mysqli_affected_rows($connection)
mysql_close -> mysqli_close($connection)
mysql_data_seek -> mysqli_data_seek( $result, $offset)
mysql_errno -> mysqli_errno( $connection)
mysql_error -> mysqli_error( $connection)
mysql_fetch_array -> mysqli_fetch_array( $result, $type)
mysql_fetch_assoc -> mysqli_fetch_assoc( $result)
mysql_fetch_lengths -> mysqli_fetch_lengths( $result )
mysql_fetch_object -> mysqli_fetch_object( $result, $class, $params)
mysql_fetch_row -> mysqli_fetch_row( $result)
mysql_field_seek -> mysqli_field_seek( $result, $number)
mysql_free_result -> mysqli_free_result(result)
mysql_get_client_info -> mysqli_get_client_info( $connection)
mysql_get_host_info -> mysqli_get_host_info( $connection)
mysql_get_proto_info -> mysqli_get_proto_info( $connection)
mysql_get_server_info -> mysqli_get_server_info( $connection)
mysql_info -> mysqli_info( $connection)
mysql_insert_id -> mysqli_insert_id( $connection)
mysql_num_rows ->  mysqli_num_rows( $result)
mysql_ping -> mysqli_ping( $connection)
mysql_query -> mysqli_query( $connection, $query)
mysql_real_escape_string -> mysqli_real_escape_string( $connection)
mysql_select_db - > mysqli_select_db( $connection, $database)
mysql_set_charset -> mysqli_set_charset( $connection, $charset)
mysql_stat -> mysqli_stat( $connection)
mysql_thread_id -> mysqli_thread_id( $connection)

Nie všetky metódy sa dajú ľahko migrovať ako metódy uvedené vyššie. Dobrá správa je, že tieto metódy nie sú také bežné, takže sa s nimi nemusíte vyrovnávať. Tieto zložitejšie metódy si budú vyžadovať určitú diskusiu, takže ich prejdeme po jednej.

mysql_client_encoding -> mysqli_character_set_name ($connection)

Toto je jednoduchá zmena názvu.

mysql_create_db

Tento príkaz je nahradený metódou mysqli_query s použitím CREATE DATABASE sql ...

$result = mysqli_query ($connection, 'CREATE DATABASE database_name');

mysql_db_name

Tento príkaz sa používa v spojení s príkazom mysql_list_dbs na získanie požadovaného riadku od daného výsledku. Aby sme ju mohli migrovať do MySQLi, musíme nájsť metódu mysqli_data_seek na nájdenie požadovaného riadku a potom mysqli_fetch_row na vrátenie požadovaného riadku.

$data = mysql_db_name ($result, $row);

bude

mysqli_data_seek ($result, $row); 
$fetch = mysql_fetch_row ($result);
$data = $načítať[0];

mysql_db_query

V MySQL tento príkaz vyberie databázu a spustí dotaz. Pri migrácii do MySQLi používame metódu mysqli_select_db na výber databázy a potom metódu mysqli_query na spustenie dotazu a vrátenie výsledku.

$result = mysql_db_query ('database', 'query');

bude

mysqli_select_db ('database'); 
$result = mysqli_query ('query');

mysql_drop_db

Toto vyhlásenie je nahradené metódou mysqli_query pomocou DROP DATABASE sql ...

$result = mysqli_query ($connection, 'DROP DATABASE database_name');

mysql_escape_string -> mysql_real_escape_string ($connection, 'string')

Toto je jednoduchá zmena názvu.

mysql_fetch_field -> mysqli_fetch_field ($result)

Ak tento príkaz neobsahuje voliteľný parameter offset, potom je to migrácia jednoduchého nahradenia názvu. Ak je zahrnutý parameter offset, potom musíme výsledok prebehnúť, kým nenájdeme požadovaný offset.

$fetch = mysql_fetch_field ($result, 5);

bude

pre (x = 0; x <5; x ++) { 
  mysqli_fetch_field ($result);
}
$fetch = mysqli_fetch_field ($result);

mysql_field_len
mysql_field_name
mysql_field_table

V MySQL tieto príkazy vracajú dĺžku, názov alebo tabuľku určeného poľa. Pri migrácii používame metódu MySQLi mysqli_fetch_field_direct na vrátenie objektu obsahujúceho údaje poľa a potom z tohto objektu vrátime dĺžku poľa, meno alebo tabuľku.

$length = mysql_field_len ($result, 5); 
$name = mysql_field_name ($result, 5);
$table = mysql_field_table ($result, 5)

bude

$fieldInfo = mysqli_fetch_field_direct ($result, 5); 
$length = $fieldInfo-> length;
$name = $fieldInfo-> name;
$table = $fieldInfo-> table;

mysql_list_dbs

Tento príkaz je nahradený metódou mysqli_query pomocou príkazu SHOW DATABASES sql ...

$result = mysqli_query ($connection, 'SHOW DATABASES');

mysql_list_fields

Toto vyhlásenie je nahradené metódou mysqli_query pomocou SHOW COLUMNS FROM sql ...

$result = mysqli_query ($connection, 'SHOW COLUMNS FROM table_name');

mysql_list_processes -> mysqli_thread_id ($connection)

Toto je jednoduchá zmena názvu.

mysql_list_tables

Toto vyhlásenie je nahradené metódou mysqli_query pomocou SHOW TABLES FROM sql ...

$result = mysqli_query ($connection, 'SHOW TABLES FROM database_name');

mysql_num_fields -> mysqli_field_count ($connection)

Tento príkaz odkazuje na výsledok v MySQL a je nahradený metódou mysql_field_count, ktorá odkazuje na odkaz.

mysql_result

V MySQL tento príkaz vyvolá zadaný riadok a voliteľné pole z daného výsledku. Na migráciu použijeme mysqli_data_seek na nájdenie riadku a slučky cez polia pomocou mysqli_fetch_field na vrátenie poľa.

$fetch = mysql_result ($result, 3, 'field');

bude

mysql_data_seek ($result, 3); 
if (!empty ($field)) {
  while ($finfo = mysqli_fetch_field ($result)) {
    if ($field == $finfo-> name) {
      $f = mysqli_fetch_assoc ($result);
      $fetch = $f[$field];
    }
  }
} else {
  $f = mysqli_fetch_array ($result);
  $fetch = $f[0];
}

mysql_tablename

V MySQL tento príkaz vráti názov tabuľky v riadku určeného výsledku. Na jeho migráciu použijeme metódu mysqli_data_seek na nájdenie určeného riadku a získanie názvu pomocou metódy mysqli_fetch_array.

$name = mysql_tablename ($result, 3);

bude

mysqli_data_seek ($result, 3); 
$f = mysql_fetch_array ($result);
$fetch = $f[0];

mysql_unbuffered_query

Tento príkaz je nahradený metódou mysqli_query a režim výsledku je nastavený na MYSQLI_USE_RESULT ...

$result = mysqli_query ($connection, 'query', MYSQLI_USE_RESULT);

Existujú 2 príkazy MySQL, s ktorými sa musíme vyrovnať, pretože používajú príznaky a typy, ktoré nie sú podporované v MySQLi, rovnako ako v MySQL. Aby tieto fungovali, musíme si vytvoriť vlastné.

mysql_field_flags

$resultFlags = mysql_field_flags ($result, 3);

bude

$flags = array();
$constants = get_defined_constants( true );
foreach ($constants['mysqli'] as $c => $n)
{
 if (preg_match('/MYSQLI_(.*)_FLAG$/', $c, $m))
  if (!array_key_exists($n, $flags))
   $flags[$n] = $m[1];
  $flags_num = mysqli_fetch_field_direct( $result, $field_offset )->flags;
  $result = array();
  foreach ($flags as $n => $t)
   if ($flags_num & $n)
    $result[] = $t;
  $returnFlags = implode(' ', $result);
  $returnFlags = str_replace( 'PRI_KEY', 'PRIMARY_KEY', $returnFlags);
  $returnFlags = strtolower($returnFlags);
}

mysql_field_type

$resultType = mysql_field_type ($result, 4);

bude

$type_id = mysqli_fetch_field_direct( $result, $field_offset)->type;
$types = array();
$constants = get_defined_constants(true);
foreach ($constants['mysqli'] as $c => $n)
 if (preg_match('/^MYSQLI_TYPE_(.*)/', $c, $m))
  $types[$n] = $m[1];
$resultType = array_key_exists( $type_id, $types ) ? $types[$type_id] : NULL;