2009-09-07 15 views
35

Na podstawie tego kodu poniżej używam zwykłego mysql, w jaki sposób mogę go przekonwertować na mysqli?Jak zmienić mysql na mysqli?

Czy to tak proste jak zmiana ** mysql _query ($ sql); do mysqli _query ($ sql); ? **

<?PHP 

//in my header file that is included on every page I have this 
$DB["dbName"] = "emails"; 
$DB["host"] = "localhost"; 
$DB["user"] = "root"; 
$DB["pass"] = ""; 
$link = mysql_connect($DB['host'], $DB['user'], $DB['pass']) or die("<center>An Internal Error has Occured. Please report following error to the webmaster.<br><br>".mysql_error()."'</center>"); 
mysql_select_db($DB['dbName']); 
// end header connection part 

// function from a functions file that I run a mysql query through in any page. 
function executeQuery($sql) { 
    $result = mysql_query($sql); 
    if (mysql_error()) { 
     $error = '<BR><center><font size="+1" face="arial" color="red">An Internal Error has Occured.<BR> The error has been recorded for review</font></center><br>'; 
     if ($_SESSION['auto_id'] == 1) { 
      $sql_formatted = highlight_string(stripslashes($sql), true); 
      $error .= '<b>The MySQL Syntax Used</b><br>' . $sql_formatted . '<br><br><b>The MySQL Error Returned</b><br>' . mysql_error(); 
     } 
     die($error); 
    } 
    return $result; 
} 

// example query ran on anypage of the site using executeQuery function 
$sql='SELECT auto_id FROM friend_reg_user WHERE auto_id=' .$info['auto_id']; 
$result_member=executequery($sql); 
if($line_member=mysql_fetch_array($result_member)){ 
    extract($line_member); 
} else { 
    header("location: index.php"); 
    exit; 
} 
?> 

Odpowiedz

59

Pierwszą rzeczą, którą można zrobić, to zastąpić każde wywołanie funkcji mysql_* jego odpowiednikiem mysqli_*, przynajmniej jeśli zechcesz skorzystać z API proceduralnego - co byłoby łatwiejsze, biorąc pod uwagę, że masz już trochę kodu na MySQL API, który jest proceduralny.

Aby to ułatwić, The MySQLi Extension Function Summary jest zdecydowanie czymś, co może okazać się pomocne.

Na przykład:

Zauważ, że w przypadku niektórych funkcji może być konieczne dokładne sprawdzenie parametrów: może istnieją pewne różnice tu i tam - ale nie tak wiele, powiedziałbym: zarówno mysql, jak i mysqli oparte są na tej samej bibliotece (libmysql; przynajmniej dla PHP < = 5,2)

Na przykład:

  • z mysql, trzeba użyć raz podłączony mysql_select_db, aby wskazać, w którym baza danych, którą chcesz zrobić wasze pytania
  • mysqli, po drugiej stronie pozwala określić nazwę bazy danych jako czwarty parametr na mysqli_connect.
  • Mimo to istnieje również funkcja mysqli_select_db, której można użyć, jeśli wolisz.


Gdy skończysz z tym, spróbuj wykonać nową wersję skryptu ... i sprawdzić czy wszystko działa; jeśli nie ... Czas na polowanie na robaki ;-)

+0

Tak długo, jak chcesz zachować kod proceduralny, przełączanie z mysql na mysqli nie powinno być zbyt trudne; ale jeśli twoja baza kodów nie jest zbyt duża (tzn. przechodzenie z jednego API do drugiego nie będzie oznaczało zbyt wiele pracy), możesz użyć interfejsu API zorientowanego obiektowo; będzie to wymagało więcej pracy, ale ... Jeśli zamierzałbym przerobić na OO-API, poszedłbym z PDO zamiast mysqli ... –

+0

Mam na myśli czytanie przez cały dzień przez cały dzień, z czego Rozumiem, że nie jest to główna różnica w stosunku do PDO, że PDO pozwala korzystać z różnych systemów DB. JEŚLI to jedyna korzyść, to nie byłoby to zbyt pomocne w moim przypadku, ponieważ nigdy nie będę potrzebował innej dla tej aplikacji. – JasonDavis

+0

W tym przypadku mysqli będzie prawdopodobnie w porządku :-) zwłaszcza, że ​​masz już jakiś kod zbudowany na mysql. –

3

Wstępnie zalecam użycie PDO dla twojego dostępu SQL.

Jest to tylko przypadek zmiany sterownika i zapewnienia, że ​​SQL działa na nowym serwerze. W teorii. Migracja danych to inna kwestia.

Dostęp do bazy danych jest doskonały.

25

(Rozumiem, że to jest stare, ale wciąż pojawia się ...)

Jeśli zastąpisz mysql_* z mysqli_*, to pamiętaj, że cały ładunek funkcji mysqli_* wymaga przekazania łącza do bazy danych.

Np .:

mysql_query($query) 

staje

mysqli_query($link, $query) 

To znaczy, wiele wymaga kontroli.

0

Short Version konwersji mysql do mysqli

mysql_connect ---> mysqli_connect 
mysql_select_db ---> mysqli_select_db 
mysql_error ---> mysqli_connect_error() 
mysql_query ---> mysqli_query 
mysql_fetch_assoc ---> mysqli_fetch_assoc 
6

Najłatwiej zawsze obsłużyć to

Gdzie con $ = mysqli_connect ($ ServerName, $ dbusername, $ hasło_bazy_danych);

3 kroki wymiana w następującej kolejności

  1. All "mysql_select_db (" z "mysqli_select_db ($ con,"
  2. All "mysql_query (" z "mysqli_query ($ con, "i
  3. Wszystkie" mysql_ "z" mysqli_ ".

To działa na mnie za każdym

+0

Dodałbym wyszukiwanie wszystkich łańcuchów 'function' i umieszczenie' global $ con; 'nad zawartością funkcji, ponieważ' $ con' zdefiniowany poza funkcją nie będzie dostępne domyślnie ze względu na zasięg zmiennej w PHP. –

1

Jeśli masz pliki wiele do zmiany w projektach można tworzyć funkcje o tych samych nazwach jak funkcje MySQL, oraz w funkcjach dokonać nawróconego jak ten kod:

$sql_host =  "your host";  
$sql_username = "username";  
$sql_password = "password";  
$sql_database = "database";  



$mysqli = new mysqli($sql_host , $sql_username , $sql_password , $sql_database); 


/* check connection */ 
if ($mysqli->connect_errno) { 
    printf("Connect failed: %s\n", $mysqli->connect_error); 
    exit(); 
} 


function mysql_query($query){ 
    $result = $mysqli->query($query); 
    return $result; 

} 

function mysql_fetch_array($result){ 
    if($result){ 
     $row = $result->fetch_assoc(); 
     return $row; 
     } 
} 

function mysql_num_rows($result){ 
    if($result){ 
     $row_cnt = $result->num_rows;; 
     return $row_cnt; 
     } 
} 
0

w przypadku dużych projektów, wiele plików do zmiany, a także wtedy, gdy poprzednia wersja projektu była PHP 5.6 i 7.1 jest nowa, można utworzyć nowy plik sql.php i umieścić go w nagłówku lub gdzieś używasz go cały czas i potrzebuje połączenia sql. Na przykład:

//local 
$sql_host =  "localhost";  
$sql_username = "root";  
$sql_password = "";  
$sql_database = "db"; 


$mysqli = new mysqli($sql_host , $sql_username , $sql_password , $sql_database); 

/* check connection */ 
if ($mysqli->connect_errno) { 
    printf("Connect failed: %s\n", $mysqli->connect_error); 
    exit(); 
} 

// /* change character set to utf8 */ 
if (!$mysqli->set_charset("utf8")) { 
    printf("Error loading character set utf8: %s\n", $mysqli->error); 
    exit(); 
} else { 
    // printf("Current character set: %s\n", $mysqli->character_set_name()); 
} 
if (!function_exists('mysql_real_escape_string')) { 
    function mysql_real_escape_string($string){ 
     global $mysqli; 
     if($string){ 
      // $mysqli = new mysqli($sql_host , $sql_username , $sql_password , $sql_database);    
      $newString = $mysqli->real_escape_string($string); 
      return $newString; 
     } 
    } 
} 
// $mysqli->close(); 
$conn = null; 
if (!function_exists('mysql_query')) { 
    function mysql_query($query) { 
     global $mysqli; 
     // echo "DAAAAA"; 
     if($query) { 
      $result = $mysqli->query($query); 
      return $result; 
     } 
    } 
} 
else { 
    $conn=mysql_connect($sql_host,$sql_username, $sql_password); 
    mysql_set_charset("utf8", $conn); 
    mysql_select_db($sql_database); 
} 

if (!function_exists('mysql_fetch_array')) { 
    function mysql_fetch_array($result){ 
     if($result){ 
      $row = $result->fetch_assoc(); 
      return $row; 
     } 
    } 
} 

if (!function_exists('mysql_num_rows')) { 
    function mysql_num_rows($result){ 
     if($result){ 
      $row_cnt = $result->num_rows;; 
      return $row_cnt; 
     } 
    } 
} 

if (!function_exists('mysql_free_result')) { 
    function mysql_free_result($result){ 
     if($result){ 
      global $mysqli; 
      $result->free(); 

     } 
    } 
} 

if (!function_exists('mysql_data_seek')) { 
    function mysql_data_seek($result, $offset){ 
     if($result){ 
      global $mysqli; 
      return $result->data_seek($offset); 

     } 
    } 
} 

if (!function_exists('mysql_close')) { 
    function mysql_close(){ 
     global $mysqli; 
     return $mysqli->close(); 
    } 
} 

if (!function_exists('mysql_insert_id')) { 
    function mysql_insert_id(){ 
      global $mysqli; 
      $lastInsertId = $mysqli->insert_id; 
      return $lastInsertId; 
    } 
} 

if (!function_exists('mysql_error')) { 
    function mysql_error(){ 
     global $mysqli; 
     $error = $mysqli->error; 
     return $error; 
    } 
} 
+0

i jak mam tego użyć do przetestowania funkcji mysqli? Na przykład Twój plik sprawdza najpierw, jeśli mysql_query zakończy działanie, jeśli tak, użyj dla 5.6, ale jak wykonać test, jeśli działa mysqli_query? – alex

+0

Jak mogę wyjaśnić test mysqli_query (???, $ q); – alex

+0

i używać go:

 $id_cat = (int)'4'; $sql = "DELETE FROM categories WHERE id='$id_cat' OR parent_id ='$id_cat'"; mysql_query($sql) or die('Error SQL !
'.$sql.'
'.mysql_error());
Svetoslav