如何转换使用mysql_函数使用mysqli_功能的脚本?(How do I convert a s

2019-07-20 11:21发布

编辑:是否使用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);
?>

Answer 1:

注意:从转换mysql_mysqli_可能不是最优的。 考虑PDO如果你准备好所有的代码转换为OOP 。

它可以是很有诱惑力的尝试更换的所有实例mysql_mysqli_祈祷它的工作原理。 你会很接近,但不点又比较。

连接到数据库:

幸运的是, mysqli_connect密切合作,足以mysql_query ,你可以只换出它们的功能名。

mysql_:

$con = mysql_connect($host, $username, $password);

mysqli_:

$con = mysqli_connect($host, $username, $password);

选择数据库

现在,大部分的其他功能mysqli_库,您还需要通过mysqli_select_db数据库连接作为第一个参数。 大多数mysqli_功能首先需要连接对象。

对于这个功能,你可以切换的,你传递给函数参数的顺序。 如果您之前没有传入一个连接对象, 你必须现在添加作为第一个参数。

mysql_:

mysql_select_db($dbname, $con);

mysqli_:

mysqli_select_db($con, $dbname);

作为奖励,你也可以通过数据库名称作为第四个参数mysqli_connect -绕过需要调用mysqli_select_db

$con = mysqli_connect($host, $username, $password, $dbname);

清理用户输入

使用mysqli_real_escape_string是非常相似的mysql_real_escape_string 。 你只需要通过连接对象作为第一个参数。

mysql_:

$value1 = mysql_real_escape_string($input_string);

mysqli_:

$value1 = mysqli_real_escape_string($con, $input_string);

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

原因之一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 />';
}

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

显示错误

显示错误的工作原理有点不同与mysqli_mysqli_error需要连接对象的第一个参数。 但是,如果连接失败是什么? mysqli_介绍了一小部分的不需要的连接对象的功能: mysqli_connect_*功能。

mysql_:

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

if (!$result) {
    die('SQL Error: ' . mysql_error());
}

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


Answer 2:

例。

这是您的DBC类

<?php

class dbc {

    public $dbserver = 'server';
    public $dbusername = 'user';
    public $dbpassword = 'pass';
    public $dbname = 'db';

    function openDb() {    
        try {
            $db = new PDO('mysql:host=' . $this->dbserver . ';dbname=' . $this->dbname . ';charset=utf8', '' . $this->dbusername . '', '' . $this->dbpassword . '');
        } catch (PDOException $e) {
            die("error, please try again");
        }        
        return $db;
    }

    function getAllData($qty) {
        //prepared query to prevent SQL injections
        $query = "select * from TABLE where qty = ?";
        $stmt = $this->openDb()->prepare($query);
        $stmt->bindValue(1, $qty, PDO::PARAM_INT);
        $stmt->execute();
        $rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
        return $rows;
    }    
?>

你的PHP页面:

<?php 
require "dbc.php";

$getList = $db->getAllData(25);

foreach ($getList as $key=> $row) {
         echo $row['columnName'] .' key: '. $key;
    }


Answer 3:

不要转换mysql_职能mysqli_。 期。

没有一个单一的原因这样做。

首先,有没有理由这样做,只是机械地,只改变函数名离开的算法相同:

如果没有执行参数化查询这样的举动让人很没有意义。
如果你唯一担心的是“过时”的错误 - 你可以把它们赶走

error_reporting(E_ALL & ~E_DEPRECATED);

并继续愉快地使用旧mysql_ *
请注意,您将需要仅在2 - 3年内,在PHP 5.5将达到共享hostings。
所以,没有必要急着为好。

其次,你真正需要的是消除所有从代码裸API调用

在某种抽象库的封装它们。 这应该是你的主要关注,而不是在这个库中使用特定的API,它可以在一个眼色改变。

最后,从切换的唯一真正原因mysql_*mysqli_*是参数化查询。

和mysqli的是与他们完全无法使用。

随着准备语句PDO是你唯一的选择。

让我告诉你我是什么意思。
试想一下,我们从HTML表单复选框阵列添加到查询动态。
随着PDO我们可以有一些相对理智和相当简洁(但仍然无益复杂和污染)的代码:

$in  = str_repeat('?,', count($_GET['cat']) - 1) . '?';
$sql = "SELECT * FROM table WHERE category IN ($in)";
$stm = $db->prepare($sql);
$stm->execute($_GET['cat']);
$data = $stm->fetchAll();

随着mysqli的这样一个平凡的情况下将带您编写和调试的极其复杂的代码几页小时。

只是尝试一下,看看。

然而,即使PDO需要一些模糊的和无用的代码来创建特定的查询部分。 所以,最好的办法是使用一些更智能库,如safemysql ,这将在内部完成所有的工作,从绑定到取, 使所有的代码为一行

$data = $db->getALL("SELECT * FROM table WHERE category IN (?a)", $_GET['cat']);


文章来源: How do I convert a script using mysql_ functions to use mysqli_ functions?