数据库便捷预处理
连接数据库不管是查询还是更新,每次总要写很多类似的代码,太麻烦了。编成一个函数就方便多了,每次只需要把语句传成一个参数给函数就可以了,这样就方便多了。
之前我编的有对应的函数,不过看到一些文章讲,直接把获取的输入还是什么的等等拼接到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预处理语句;一个是数组,里面是要绑定参数的值。
*/
?>