紫气东来 | 2024-10-14 06:42:23 | 编程 | 0

mysql便捷预处理

连接数据库不管是查询还是更新,每次总要写很多类似的代码,太麻烦了。编成一个函数就方便多了,每次只需要把语句传成一个参数给函数就可以了,这样就方便多了。

之前我编的有对应的函数,不过看到一些文章讲,直接把获取的输入还是什么的等等拼接到sql语句中不安全,万一被人恶意传一些攻击指令,容易导致数据库被攻击,推荐使用预处理语句。

当时我就打算用了,不过看到比较麻烦,因为用到数据库的地方太多了,很多地方都要改代码,太麻烦了。当时也想编一个通用的函数,但是构思之后并没想到好方法。

不过昨天加上今天自己构思又加查资料,成功想到了可行的方法。代码分享如下

<?php
function mdb($sql, $cg, $arr) {
    static $db = null;
    if ($db === null) {
        $db = new mysqli('数据库地址', '用户名','密码','db名');
        if ($db->connect_error) {
            die("连接失败: " . $db->connect_error);
        }
        $db -> set_charset("utf8");
    }
    $stmt = $db -> prepare($sql);
    $n = count($arr);
if ($n) {
    $types = type2($arr); 
    $params = [$types];
    foreach ($arr as $key => $value) {
        $params[] = &$arr[$key];
    }
    call_user_func_array([$stmt, 'bind_param'], $params);
}
    if ($cg != 1) {
        $stmt -> execute();
        $ret = $stmt -> get_result();
    } else {
        $ret = $stmt -> execute();
    }
return $ret;
}
function cha($sql, $arr = []) {
    $ret = mdb($sql, 0, $arr);
    if ($ret -> num_rows > 0) {
        $tmp = [];
        while ($row = $ret -> fetch_assoc()) {
            $tmp[] = $row;
        }
        return $tmp;
    }
    return false;
}
function gai($sql, $arr = []) {
    $ret = mdb($sql, 1, $arr);
    return $ret ? '操作成功' : '发生错误';
}
function type2($arr) {
    $types = ''; 
    foreach ($arr as $pa) {
 $p=is_int($pa)?'i':
     (is_string($pa)?'s':
         (is_float($pa)?'d':
             'b'));
             $types.=$p;
    }
    return $types;
}

/*
使用方法

cha函数执行并且返回一个包含查询结果的数组,如果没有结果返回false。gai函数返回执行的结果。
示例:
$sql=sql指令;
$ret=cha($sql,[参数数组]);//查询
$ret=gai($sql,[参数数组]);//更新
它们分别接受两个参数,一个是sql预处理语句;一个是数组,里面是要绑定参数的值。
*/

?>

上一篇:html颜色代码
下一篇:js代码压缩

【最近更新】
免责声明
js生成怪物地图
svg图片链接
js生成游戏世界地图
js禁止加载图片
2024年9月
人生真正的需求
网址收藏
php动态属性赋值