gpt4 book ai didi

php - 如何更灵活地将许多列传递给bind_result()?

转载 作者:行者123 更新时间:2023-11-29 10:00:45 24 4
gpt4 key购买 nike

我有一些很长的 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)方法。

关于php - 如何更灵活地将许多列传递给bind_result()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53016650/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com