我有一些较长的MySQL表,其设计尚未完全固定。因此,有时候,我需要添加/删除一些列。但是,每次更改表时,都必须重新编写所有处理bind_result()的行。我正在寻找一种解决方案,使更改变得容易。
假设我当前有一个表,其中包含col_a,col_b,col_c,...,col_z等列。因此,如手册所述,我使用bind_result()存储结果值。
$res = $stmt->bind_result($a, $b, $c,..., $z);
但是,如果更改表设计,则必须更改处理此bind_result()的所有行的参数,以匹配新的MySQL表。
有没有类似下面的技术?
// Some php file defining constants
define("_SQL_ALL_COLUMNS", "\$a, \$b, \$c, \$d, ... \$z");
// Some SQL process in in other php files
stmt->execute();
$res = $stmt->bind_result(_SQL_ALL_COLUMNS);
因此,只要我在某个地方正确定义了参数,我就不必担心其他文件中参数数量的变化。当然,我已经发现我在上一个示例中的尝试不是正确的方法。
对于这种情况有什么好的解决方案?
最佳答案
使用call_user_func_array()
动态设置参数数量:
function execSQL($con, $sql, $params = null)
$statement = $con->prepare($sql);
if (!$statement){
// throw error
die("SQL ERROR: $sql\n $con->error");
}
$type = "";
$arg = array();
if ($params && is_array($params)){
foreach($params as $param){
if (is_numeric($param)){
$type .= 'd';
continue;
}
$type .= 's';
}
$arg[] = $type;
foreach($params as $param){
$arg[] = $param;
}
call_user_func_array(array($statement,'bind_param'), refValues($arg)); // php 7
}
$res = $statement->execute();
if (!$res){
die("Looks like the Execute Query failed.\n\nError:\n{$statement->error}\n\nQuery:\n{$sql}\n\nParams:\n{".implode(",", $arg)."}");
}
return $con->insert_id;
}
function refValues($arr){
if (strnatcmp(phpversion(),'5.3') >= 0) { //Reference is required for PHP 5.3+
$refs = array();
foreach($arr as $key => $value){
$refs[$key] = &$arr[$key];
}
return $refs;
}
return $arr;
}
您可以通过使用带有参数数组的函数execSQL来使用它:
$result = execSQL($connection,$sql,["a","b","c","..."]);
这样做是检查参数的数据类型并将其附加到
$type
变量,然后将其作为第一个参数传递给bind方法。