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

php项目中从MYSQL更新到MYSQLI

phpmianshi7个月前 (05-07)php534

背景


因为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中的system方法偶尔会出现unable to fork

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

php中global与$GLOBAL由引用产生的区别

很多人都认为global和$GLOBALS[]只是写法上面的差别,其实不然。根据官方的解释是$GLOBALS['var'] 是外部的全局变量$var本身。global $var 是外部...

lumen中用swoole实现RPC服务

背景因老项目众多,既有原生PHP也有TP3.2还有其他一些乱七八糟的项目,导致维护困难,经常同一份代码要写到好几个项目中,copy来copy去,也经常发生改了一个地方,其他地方没改全的问题,因为我们决...

PHP中max_execution_time设置不生效

问题描述:max_execution_time设置了1秒,但是发现超过3秒的脚本还是跑。于是深入研究下max_execution_time不生效的原因。官网描述:https://www.php.net...

php中使用swoole加速lumen项目-laravelS实战

背景公司项目严重依赖lumen系列,代码众多,重构困难,虽然访问量变大,性能问题越来越严重,急需要提升性能,于是找到了这个项目https://github.com/hhxsv5/laravel-s下面...

php-fpm backlog参数优化

php-fpm backlog参数优化

一、问题分析       1、分析php-fpm.slow.log发现没有执行慢的地方,然后把目光放到了nginx 与php建立连接的阶段上,使用tcpdump...

发表评论

访客

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