Как изменить mysql на mysqli?

на основе этого кода ниже я использую для обычного mysql, как я могу преобразовать его в использование mysqli?

это так же просто, как изменение * * mysql _query ($sql); to 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;
}
?>

9 ответов


первое, что нужно сделать, вероятно, будет заменить все mysql_* вызов функции с эквивалентной mysqli_*, по крайней мере, если вы готовы использовать процедурный API-который был бы более простым способом, учитывая, что у вас уже есть некоторый код, основанный на MySQL API, который является процедурным.

для этого Сводка Функции Расширения MySQLi - это наверняка то, что окажется полезным.

для пример:

обратите внимание, что для некоторых функций вам может потребоваться тщательно проверить параметры: возможно, есть некоторые различия здесь и там, но не так много, я бы сказал: mysql и mysqli основаны на одной и той же библиотеке (libmysql, по крайней мере для PHP

например:

  • С MySQL, вы должны использовать mysql_select_db после подключения, чтобы указать, на какой базе данных вы хотите сделать ваши запросы
  • mysqli, с другой стороны, позволяет указать это имя базы данных в качестве четвертого параметра mysqli_connect.
  • тем не менее, там также mysqli_select_db функция, которую вы можете использовать, если хотите.


Как только вы закончите с этим, попробуйте выполнить новую версию своего скрипта... И проверьте, все ли работает, если нет... Время для охоты на жуков; -)


(Я понимаю, что это старый,но он все еще появляется...)

если вы замените mysql_* С mysqli_* тогда имейте в виду, что целый груз mysqli_* функции нуждаются в передаче ссылки на базу данных.

например:

mysql_query($query)

становится

mysqli_query($link, $query)

И. Е., много проверки не требуется.


самый простой способ, которым я всегда справляюсь с этим

где $con = mysqli_connect($serverName,$dbusername,$dbpassword);

3 шага замены в следующем порядке

  1. все "mysql_select_db (" С "mysqli_select_db($con,"
  2. все "mysql_query (" С "mysqli_query($con," и
  3. все "mysql_" С "mysqli_".

Это работает для меня каждый раз


Я бы предварительно рекомендовал использовать PDO для SQL-доступа.

тогда это только случай изменения драйвера и обеспечения работы SQL на новом бэкэнде. В теории. Миграция данных-это другая проблема.

абстрактный доступ к базе данных велик.


в случае больших проектов, много файлов для изменения, а также если предыдущая версия проекта PHP была 5.6, а новая-7.1, вы можете создать новый файл sql.php и включить его в заголовок или где-то вы используете его все время и требует подключения sql. Например:

//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;
    }
}

вот полный учебник, как сделать это правильно и быстро. Я использовал его после обновления хостинга для моих клиентов с 5.4 (OMG!!!) в 7.х версии PHP.

1. Определение соединения

прежде всего, вам нужно установить соединение с новой переменной $link или $con, или что вы хотите.

пример

изменить в связи с :

@mysql_connect($host, $username, $password) or die("Error message...");
@mysql_select_db($db);

или

@mysql_connect($host, $username, $password, $db) or die("Error message...");

в:

$con = mysqli_connect($host, $username, $password, $db) or die("Error message...");

2. mysql_* модификации

С Notepad++ я использую " найти в файлах "(Ctrl + Shift + f):

Search and replace notepad++ box

в следующем порядке Я выбираю "заменить в файлах" :

  1. mysql_query (- >mysqli_query ($con,

  2. mysql_error () - > mysqli_error ($con)

  3. mysql_close () - > mysqli_close ($con)

  4. mysql_ - > mysqli_

3. корректировки

если вы получаете ошибки, возможно, потому, что ваш $con недоступен из ваших функций.

вам нужно добавить global $con; во всех ваших функций, например :

function my_function(...) {
    global $con;
    ...
}

надеюсь, что это помогает.


Если у вас есть много файлов для изменения в ваших проектах, вы можете создавать функции с теми же именами, что и функции mysql, и в функциях сделать преобразование, как этот код:

$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;
       }
}

короткая версия преобразования mysql в 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

вы можете сделать массовый поиск и замену с помощью notepad++ для следующего, это сработало для меня:

найти: mysql_

заменить: mysqli_

найти: _query(

заменить: _query($conn,

следующие потребности меняются, но это зависит от того, как вы подключаетесь...

обновить строку подключения в файле config.php для следующих:

$conn = mysqli_connect($db_host, $db_username, $db_password, $db_name) or die("Unable to Connect");

надеюсь, что это помогает.