Naše kontakty
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');
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')
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);
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)
$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)
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');
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);
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);
$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);
$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;