如何使用mysql_函数转换脚本以使用mysqli_函数?

Nic*_*ing 7 php mysql mysqli pdo

编辑:是否使用mysqli_超出了本问题的范围.考虑使用PDO.


将脚本转换为使用已弃用的mysql_函数需要采取哪些步骤mysqli_

是否有任何需要使用时,以不同的方式进行mysqli_,而不是mysql

这是一个使用mysql_函数的基本脚本:

<?php

//define host, username and password

$con = mysql_connect($host,$username,$password);
if (!$con) {
    die('Could not connect: ' . mysql_error());
}

$db_name ="db1";
mysql_select_db($dbname, $con);

$value1 = mysql_real_escape_string($input_string);

$query = 'SELECT * FROM table1 WHERE table1.col1=' . $value1 . '';
$result = mysql_query($query, $con);

while($row = mysql_fetch_assoc*$result)
{
    $col1 = $row['col1'];
    $col2 = $row['col2'];

    echo $col1 . ' ' . $col2 . '<br />';
}

mysql_close($con);
?>
Run Code Online (Sandbox Code Playgroud)

Nic*_*ing 17

注意:转换mysql_mysqli_可能不是最佳的.如果您准备将所有代码转换为OOP,请考虑使用PDO.

它可以是很有诱惑力的尝试更换的所有实例mysql_mysqli_祈祷它的工作原理.你会很接近,但不是很重要.

连接数据库:

幸运的是,mysqli_connect它足够紧密mysql_query,你只需要换掉它们的函数名.

mysql_:

$con = mysql_connect($host, $username, $password);
Run Code Online (Sandbox Code Playgroud)

mysqli_:

$con = mysqli_connect($host, $username, $password);
Run Code Online (Sandbox Code Playgroud)

选择数据库

现在,对于mysqli_库中的大多数其他函数,您需要mysqli_select_db将数据库连接作为其第一个参数传递.大多数mysqli_函数首先需要连接对象.

对于此函数,您只需切换传递给函数的参数的顺序即可.如果您之前没有将连接对象传递给它,则必须立即将其添加为第一个参数.

mysql_:

mysql_select_db($dbname, $con);
Run Code Online (Sandbox Code Playgroud)

mysqli_:

mysqli_select_db($con, $dbname);
Run Code Online (Sandbox Code Playgroud)

作为奖励,您还可以将数据库名称作为第四个参数传递给mysqli_connect- 绕过需要调用mysqli_select_db.

$con = mysqli_connect($host, $username, $password, $dbname);
Run Code Online (Sandbox Code Playgroud)

消除用户输入

使用mysqli_real_escape_string非常相似mysql_real_escape_string.您只需要将连接对象作为第一个参数传递.

mysql_:

$value1 = mysql_real_escape_string($input_string);
Run Code Online (Sandbox Code Playgroud)

mysqli_:

$value1 = mysqli_real_escape_string($con, $input_string);
Run Code Online (Sandbox Code Playgroud)

非常重要:准备和运行查询

这些mysql_函数开始被弃用的一个原因是它们无法处理准备好的语句.如果您只是将代码转换为mysqli_不执行此重要步骤,则会遇到mysql_函数的一些最大缺点.

值得阅读有关准备好的陈述及其好处的这些文章:

维基百科 - 准备好的陈述

PHP.net - MySQLi准备语句

注意:使用预准备语句时,最好明确列出您尝试查询的每个列,而不是使用*表示法查询所有列.这样,您就可以确保已经考虑了呼叫中的所有列mysqli_stmt_bind_result.

mysql_:

$query = 'SELECT * FROM table1 WHERE table1.col1=' . $value1 . '';
$result = mysql_query($query, $con);
while($row = mysql_fetch_assoc*$result)
{
    $col1 = $row['col1'];
    $col2 = $row['col2'];

    echo $col1 . ' ' . $col2 . '<br />';
}
Run Code Online (Sandbox Code Playgroud)

mysqli_:

$query = 'SELECT col1,col2 FROM table1 WHERE table1.col1=?';
if ($stmt = mysqli_prepare($link, $query)) {

    /* pass parameters to query */
    mysqli_stmt_bind_param($stmt, "s", $value1);

    /* run the query on the database */
    mysqli_stmt_execute($stmt);

    /* assign variable for each column to store results in */
    mysqli_stmt_bind_result($stmt, $col1, $col2);

    /* fetch values */
    while (mysqli_stmt_fetch($stmt)) {
        /*
            on each fetch, the values for each column 
            in the results are automatically stored in 
            the variables we assigned using 
            "mysqli_stmt_bind_result"
        */
        echo $col1 . ' ' . $col2 . '<br />';
    }

    /* close statement */
    mysqli_stmt_close($stmt);
}
Run Code Online (Sandbox Code Playgroud)

显示错误

显示错误的工作方式略有不同mysqli_.mysqli_error需要连接对象作为其第一个参数.但如果连接失败怎么办?mysqli_介绍了一小组不需要连接对象的mysqli_connect_*函数:函数.

mysql_:

if (!$con) {
    die('Could not connect: ' . mysql_error());
}

if (!$result) {
    die('SQL Error: ' . mysql_error());
}
Run Code Online (Sandbox Code Playgroud)

mysqli_:

/* check connection error*/
if (mysqli_connect_errno()) {
    die( 'Could not connect: ' . mysqli_connect_error() );
}

/* check query error */
if ($stmt = mysqli_prepare($link, $query)) {

    // ... execute query

    if (mysqli_stmt_error($stmt)) {
        echo 'SQL Error: ' . mysqli_stmt_error($stmt);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 如果仍然使用字符串插值而不是预处理语句,则转换为"mysqli_"(弃用警告除外)是没有意义的.人们应该远离字符串插值. (5认同)
  • 字符串插值的需要是"mysql_"被弃用的确切原因. (5认同)