当前位置:首页 > php > 正文内容

php项目中从MYSQL更新到MYSQLI

phpmianshi5个月前 (05-07)php362

背景


因为MYSQL已被弃用,原有一些老的项目大量用到原生mysql_xxx相关的函数,不能预处理和参数绑定,很多拼接的sql有注入风险,如何升级到mysqli或pdo呢


因为mysqli是mysql的增强版本,MySQLi 的 i 代表 Improvement,更稳定更高效更安全,所以升级到mysqli是成本最低,风险最小,效果最好的解决方案

现在我们就总结一下如何升级到mysqli,前面是对应的mysql库相关的函数,后面是对应的mysqli相关函数,有些参数不一致,需要调整下


区别和联系


MySQL 每次链接都会打开一个连接的进程。

MySQLi 多次运行将使用同一连接进程,减少了服务器的开销。


详细改动对比

mysql_connect   mysqli_connect  参数不一致

mysql_connect(server,user,pwd,newlink,clientflag)

mysqli_connect(host,username,password,dbname,port,socket);

mysql_select_db   mysqli_select_db  参数不一致

mysql_select_db(database,connection)

mysqli_select_db(connection,dbname)

mysql_query   mysqli_query   需要一个链接参数,mysql_query原来的后面可能会有链接参数,需要删除

mysql_query(query,connection)

mysqli_query(connection,query,resultmode);

可以直接替换的

mysql_fetch_assoc   mysqli_fetch_assoc

mysql_num_rows   mysqli_num_rows

mysql_num_fields  mysqli_num_fields

mysql_fetch_object   mysqli_fetch_object

mysql_free_result  mysqli_free_result


需要适当调整的

mysql_fetch_array  mysqli_fetch_array  

其中第二个参数常量可能需要替换

mysql_fetch_array(data,array_type)

MYSQL_ASSOC    MYSQLI_ASSOC

MYSQL_NUM    MYSQLI_NUM

MYSQL_BOTH    MYSQLI_BOTH


可以直接替换或者加上链接参数

mysql_affected_rows   mysqli_affected_rows
mysql_affected_rows(link_identifier)

mysqli_affected_rows(connection)

mysql_insert_id   mysqli_insert_id

mysql_insert_id(connection)

mysqli_insert_id(connection);

mysql_fetch_field   mysqli_fetch_field

mysql_fetch_field(data,field_offset)

mysqli_fetch_field(result);

mysql_close   mysqli_close

mysql_close(link_identifier)

mysqli_close(connection);

mysql_escape_string mysql_real_escape_string   替换 mysqli_escape_string mysqli_real_escape_string

mysql_escape_string(link_identifier)
mysql_real_escape_string(link_identifier)

mysqli_escape_string(connection,escapestring);
mysqli_real_escape_string(connection,escapestring);


其他的再补充...


更多参考:

mysql :https://www.w3school.com.cn/php/php_ref_mysql.asp

mysqli : https://www.runoob.com/php/php-ref-mysqli.html


防注入代码

<?php
    //定义配置文件
    $config = [
        //地址
        "host" => "127.0.0.1",
        //数据库名称
        "dbname" => "xxxx",
        //用户名
        "user" => "xxxx",
        //密码
        "pass" => "xxx"
    ];
    //连接数据库
    $link = mysqli_connect($config["host"],$config["user"],$config["pass"],$config["dbname"]);
    //获取用户id    使用intval防注入  $user_id = intval($_GET["id"]);
    $user_id = $_GET["id"];
    $user_name = $_GET["name"];
    //写sql语句
    $sql = "select * from p_users where user_id=? and user_name=?";
    echo "<br>".var_dump($sql);
    //预处理
    $stmt = mysqli_prepare($link,$sql);
    //绑定函数  这里的ss为 后面第一个参数为字符串 第二个参数也为字符串
    mysqli_stmt_bind_param($stmt,"ss",$user_id,$user_name);
    //执行
    mysqli_stmt_execute($stmt);
    //获取结果
    $res = mysqli_stmt_get_result($stmt);
    //结果转换为二维数组
    $res = mysqli_fetch_all($res,1);
    echo "<pre>";print_r($res); echo "<pre>";


2个工具辅助

您可以从这里下载一个转换器工具:https://github.com/philip/MySQLConverterTool

它生成的代码是非常大的,主要是因为它使用$GLOBAL变量实现默认数据库链接参数的方式. (这也使得很容易识别什么时候有人正在使用通过转换器的代码.)


还有一个MySQL Shim库位于这里:

https://github.com/dshafik/php7-mysql-shim

版权声明:本文由PHP面试资料网发布,如需转载请注明出处。
分享给朋友:

相关文章

php中Warning: Declaration of … should be compatible with …

背景今天sentry收到报警:Declaration of (类方法1) should be compatible with (类方法2); 详情如下:Declaration of ...

composer autoload自动加载性能优化指南

简介composer 提供的 autoload 机制使得我们组织代码和引入新类库非常方便,但是也使项目的性能下降了不少 。composer autoload 慢的主要原因在于来自对 PSR-0 和 P...

php中的system方法偶尔会出现unable to fork

背景php代码中调用了system方法,执行了shell脚本,一开始运行正常,过一段时间偶尔会出现unable to fork的报错问题原因system调用会fork新的进程,因为每个用户有最大进程数...

php中如何合并多个pdf并压缩

背景市面上常见的pdf处理软件,大部分都是收费的,经常功能不全,有时我们需要合并多个pdf文件,有时甚至还需要压缩一下大小,我怎么能用PHP做到这一点呢?解决方案(一)利用linux命令gs、pdf2...

Laravel神奇的服务容器

IoC 容器, laravel 的核心Laravel 的核心就是一个 IoC 容器,根据文档,称其为“服务容器”通过举例来让读者去理解什么是 IoC(控制反转) 和&nb...

PHP7 数组的底层实现

PHP7 数组的底层实现

PHP 数组具有的特性PHP 的数组是一种非常强大灵活的数据类型,在讲它的底层实现之前,先看一下 PHP 的数组都具有哪些特性。可以使用数字或字符串作为数组健值$arr = [1&...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。