Verze PHP 7 již nepodporuje rozšíření MySQL. Webhostingy přestávají PHP 5 podporovat a tak musíme tento problém řešit. Jak na to?

PHP 7 již nepodporuje rozšíření mysql, takže jakýkoliv starší kód používající rozšíření mysql bude nutné migrovat na PDO nebo mysqli, aby mohl kód běžet na serveru s PHP 7 nebo vyšším.

V tomto článku najdete příklady, jak se připojit pomocí funkce mysqli a jak migrovat metody mysql na metody mysqli, které poskytují příklady kódu pro některé z jednoduchých změn na některé z těch náročnějších, dokonce i na ty, které nemají náhradu v mysqli vám poskytneme kód , který vám pomůže mysql, jakoby v prostředí mysqli.

První věc, kterou musíme prozkoumat, je, že MySQL je prostředek a MySQLi je objekt. Abychom mohli migrovat náš kód, nepotřebujeme pochopit technické rozdíly, musíme však pochopit, že jsou odlišné.

První věc, kterou obvykle děláme s MySQL, je připojit se k databázi a vybrat ji, takže se podívejme 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 jen logická proměnná, která bude obsahovat true při úspěchu nebo false při selhání. Ve většině situací bude váš hostitel localhost a zadáte pouze své uživatelské jméno a heslo.

Nyní se podívejme na jeho protipoložku v MySQLi, mysqli_connect.

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

$connection je odkaz na objekt MySQLi pro toto připojení. Pokud vaše připojení pomocí mysql používá pouze hostitele, uživatelské jméno a heslo, pak je aktualizace kódu stejně jednoduchá jako změna mysql_connect na mysqli_connect.

Mohli byste také pokračovat a přidat databázi pro připojení přímo tam v parametrech mysqli_connect a odstranit mysql_select_db. To je v pořádku, pokud neexistuje žádná proměnná pro uložení výsledku, avšak pokud se použila proměnná, je možné, že někde hluboko v kódu může být logika, která bude tuto proměnnou používat ke kontrole platného připojení k databázi. V těchto případech doporučuji použít mysqli_select_db.

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

V případě MySQL, kde jste nevyžadovaly poskytnutí odkazu, se použilo poslední otevřené připojení, pokud nebyl uveden odkaz. Při použití MySQLi je třeba připojení a jak vidíte, je to nyní první parametr.

Pomocí našich příkladů je toto připojení $connection a název naší databáze by zůstal stejný. $database je stále logická proměnná, takže pokud se na ni odkazuje kdekoli jinde v kódu, bude fungovat podle očekávání.

V případě, že vaše připojení není jednoduché standardní připojení, kterým jsme právě prošli, musíme se vrátit a podívat se znovu na mysql_connect. Parametr hostitele může obsahovat číslo portu, localhost: 3307 nebo soket, localhost: /path/to/mysql.sock. Při jejich migraci na mysqli_connect byste jednoduše přesunuli port nebo soket do parametrů portu a soketu.

Možná máte nastaven příznak new_link, který MySQL umožnil otevřít nové připojení namísto použití předtím otevřeného připojení. Pak se použije kterýkoli odkaz, který se použije jako parametr odkazu. Při jejich migraci jednoduše vytvoříme nový objekt MySQLi se stejným názvem odkazu. Na ilustraci tohoto ...

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

by byl

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

Můžete mít také nastaveny příznaky klienta, MySQLi je nepoužívá a mohou být bezpečně odstraněny při generování připojení MySQLi.

Můžete mít variaci mysql_connect na vytvoření trvalého spojení, kterým je mysql_pconnect. Chcete-li vytvořit stejné trvalé připojení v MySQLi, jednoduše připojte hostitele předponou p:, takže localhost se stává p: localhost.

V MySQL bychom mohli použít mysql_error a mysql_errno na zjištění, zda došlo k chybě při připojení. Protože náhrady MySQLi pro tyto používají odkaz na objekt, a i když se vyskytl problém s připojením objektu, je vráceno, musíme použít mysqli_connect_error a mysql_connect_errno.

Při obou těchto údajích neposkytujete odkaz, který by jim umožnil zkontrolovat poslední pokus o připojení.

Teď, když jsme dostali správné připojení MySQLi, máme nejtěžší část z cesty za sebou.

Mnoho metod v MySQL má velmi podobné procedurální metody v MySQLi a migrace je stejně jednoduchá jako přidání i do mysql a přidání nebo přesunutí odkazu nebo výsledku k prvnímu parametru. Pamatujte, že MySQLi vyžaduje propojení pro metody, které odkazují na odkaz. V následujícím seznamu je za příkazem MySQL nahrazena procedurální metoda 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)

Ne všechny metody se dají snadno migrovat jak metody uvedené výše. Dobrá zpráva je, že tyto metody nejsou tak běžné, takže se s nimi nemusíte vyrovnávat. Tyto složitější metody budou vyžadovat určitou diskusi, takže jejich přejdeme po jedné.

mysql_client_encoding  -> mysqli_character_set_name ($connection)

Toto je jednoduchá změna názvu.

mysql_create_db

Tento příkaz je nahrazen metodou mysqli_query s použitím CREATE DATABASE sql ...

$result = mysqli_query ($connection, 'CREATE DATABASE název_databáze');

mysql_db_name

Tento příkaz se používá ve spojení s příkazem mysql_list_dbs na získání požadovaného řádku od daného výsledku. Abychom ji mohli migrovat do MySQLi, musíme najít metodu mysqli_data_seek k nalezení požadovaného řádku a potom mysqli_fetch_row na vrácení požadovaného řádku.

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

bude

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

mysql_db_query

V MySQL tento příkaz vybere databázi a spustí dotaz. Při migraci do MySQLi používáme metodu mysqli_select_db na výběr databáze a potom metodu mysqli_query ke spuštění dotazu a vrácení výsledku.

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

bude

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

mysql_drop_db

Toto prohlášení je nahrazeno metodou mysqli_query pomocí DROP DATABASE sql ...

$result = mysqli_query ($connection, 'DROP DATABASE název_databáze');

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

Toto je jednoduchá změna názvu.

mysql_fetch_field  -> mysqli_fetch_field ($result)

Pokud tento příkaz neobsahuje volitelný parametr offset, pak je to migrace jednoduchého nahrazení názvu. Pokud je zahrnut parametr offset, pak musíme výsledek proběhnout, dokud nenajdeme požadovaný offset.

$Fetch = mysql_fetch_field ($result, 5);

bude

pro (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 tyto příkazy vracejí délku, název nebo tabulku určeného pole. Při migraci používáme metodu MySQLi mysqli_fetch_field_direct na vrácení objektu obsahujícího údaje pole a pak z tohoto objektu vrátíme délku pole, jméno nebo tabulku.

$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 příkaz je nahrazen metodou mysqli_query pomocí příkazu SHOW Databases sql ...

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

mysql_list_fields

Toto prohlášení je nahrazeno metodou mysqli_query pomocí SHOW COLUMNS FROM sql ...

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

mysql_list_processes  -> mysqli_thread_id ($connection)

Toto je jednoduchá změna názvu.

mysql_list_tables

Toto prohlášení je nahrazeno metodou mysqli_query pomocí SHOW TABLES FROM sql ...

$result = mysqli_query ($connection, 'SHOW TABLES FROM název_databáze');

mysql_num_fields  -> mysqli_field_count ($connection)

Tento příkaz odkazuje na výsledek v MySQL a je nahrazen metodou mysql_field_count, která odkazuje na odkaz.

mysql_result

V MySQL tento příkaz vyvolá zadaný řádek a volitelné pole z daného výsledku. Na migraci použijeme mysqli_data_seek k nalezení řádku a smyčky přes pole pomocí mysqli_fetch_field na vrácení pole.

$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 příkaz vrátí název tabulky v řádku určeného výsledku. Na jeho migraci použijeme metodu mysqli_data_seek na nalezení určeného řádku a získání názvu pomocí metody 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 příkaz je nahrazen metodou mysqli_query a režim výsledku je nastaven na MYSQLI_USE_RESULT ...

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

Existují 2 příkazy MySQL, se kterými se musíme vyrovnat, protože používají příznaky a typy, které nejsou podporovány v MySQLi, stejně jako v MySQL. Aby tyto fungovaly, musíme si vytvořit 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;