紫气东来 | 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预处理语句;一个是数组,里面是要绑定参数的值。 */ ?>