在PHP中使用Mysql的时候觉得sql中有参数需要绑定的时候觉得比较麻烦,于是自己上网看资料做成了一个多参数传入绑定的方法,暂时可以使用了,后面会继续针对这个机制进行修缮。这个查询的时候回绑定数据库里面的字段名,查询出来的时候会是键值对的形式,作为一个后台服务,查询数据做成JSON的时候是比较好用的。
/**
* 执行SQL语句
*
* @param 数据库连接 $dbLink
* @param SQL语句 $sql
* @param SQL语句绑定参数 $bindParams
* array("参数类型","绑定参数"...)
* @return 执行结果
*/
function _runSql ($dbLink, $sql, $bindParams = null)
{
// SQL语句预处理
if ($stmt = mysqli_prepare($dbLink, $sql)) {
// 有限定参数
if ($bindParams) {
$bindParamsMethod = new ReflectionMethod("mysqli_stmt", "bind_param");
$bindParamsReferences = array();
// 限定参数类型
$typeDefinitionString = array_shift($bindParams);
foreach ($bindParams as $key => $value) {
$bindParamsReferences[$key] = &$bindParams[$key];
}
array_unshift($bindParamsReferences, $typeDefinitionString);
$bindParamsMethod->invokeArgs($stmt, $bindParamsReferences);
}
if (mysqli_stmt_execute($stmt)) {
$resultMetaData = mysqli_stmt_result_metadata($stmt);
if ($resultMetaData) {
$stmtRow = array();
$rowReferences = array();
while ($field = mysqli_fetch_field($resultMetaData)) {
$rowReferences[] = &$stmtRow[$field->name];
}
mysqli_free_result($resultMetaData);
$bindResultMethod = new ReflectionMethod("mysqli_stmt",
"bind_result");
$bindResultMethod->invokeArgs($stmt, $rowReferences);
$result = array();
while (mysqli_stmt_fetch($stmt)) {
foreach ($stmtRow as $key => $value) {
$row[$key] = $value;
}
$result[] = $row;
}
mysqli_stmt_free_result($stmt);
} else {
$result = mysqli_stmt_affected_rows($stmt);
}
mysqli_stmt_close($stmt);
} else {
$result = FALSE;
}
} else {
$result = FALSE;
}
return $result;
}