Php 如何在pdo中计算和自动创建bindParams?

Php 如何在pdo中计算和自动创建bindParams?,php,function,pdo,Php,Function,Pdo,我正在尝试创建一个函数,以便在函数中自动创建bindParams 在这里 注意:我知道如何将函数用于执行,我正在尝试在其中使用绑定 下面是我正在尝试的函数,该函数调用另一个计算并创建bindParams的函数: function insert($sql, $param_types, $args) { $stmt= $this->pdo->prepare($sql); $this->CreateParams($sql, $param_types, $args);

我正在尝试创建一个函数,以便在函数中自动创建bindParams

在这里

注意:我知道如何将函数用于执行,我正在尝试在其中使用绑定

下面是我正在尝试的函数,该函数调用另一个计算并创建bindParams的函数:

function insert($sql, $param_types, $args) {
    $stmt= $this->pdo->prepare($sql);
    $this->CreateParams($sql, $param_types, $args);
    $stmt->execute();
}
下面是第二个函数,它将计算和绑定值:

function CreateParams($sql, $param_types $args) {
    $param_references[] = & $param_types;
    for($i=0; $i<count($args); $i++) {
        $param_references[] = & $args[$i];
    }
    call_user_func_array(array(
        $sql,
        'bindParam'
    ), $param_references);
}
我尝试使用
func_get_args()但完全混淆:(


谢谢

您的功能可以简化为:

function insert($sql, $param_types, $args) {
    $stmt= $this->pdo->prepare($sql);
    $stmt->execute($args);
}
As
execute
可以使用值数组作为参数。这些值将在查询中使用

在这种情况下,
$param_types
参数是无用的

更新:仍然不清楚您期望的是什么,但要开始的代码是:

function insert($sql, $param_types, $args) {
    $stmt= $this->pdo->prepare($sql);
    $this->CreateParams($stmt, $param_types, $args);
    $stmt->execute();
}

function CreateParams($stmt, $param_types, $args) {
    $i = 0;
    foreach ($args as $argument) {
        $stmt->bindValue($i + 1, $argument, $param_types[$i]);
        $i++;
    }
}

// Calling as:

insert(
    'INSERT INTO Auth_tokens (username, password_hash, selector_hash, expiry_date) values (?, ?, ?, ?)', 
    [\PDO::PARAM_STR, \PDO::PARAM_STR, \PDO::PARAM_STR, \PDO::PARAM_STR], 
    [$username, $random_password_hash, $random_selector_hash, $expiry_date]
);

您的功能可以简化为:

function insert($sql, $param_types, $args) {
    $stmt= $this->pdo->prepare($sql);
    $stmt->execute($args);
}
As
execute
可以使用值数组作为参数。这些值将在查询中使用

在这种情况下,
$param_types
参数是无用的

更新:仍然不清楚您期望的是什么,但要开始的代码是:

function insert($sql, $param_types, $args) {
    $stmt= $this->pdo->prepare($sql);
    $this->CreateParams($stmt, $param_types, $args);
    $stmt->execute();
}

function CreateParams($stmt, $param_types, $args) {
    $i = 0;
    foreach ($args as $argument) {
        $stmt->bindValue($i + 1, $argument, $param_types[$i]);
        $i++;
    }
}

// Calling as:

insert(
    'INSERT INTO Auth_tokens (username, password_hash, selector_hash, expiry_date) values (?, ?, ?, ?)', 
    [\PDO::PARAM_STR, \PDO::PARAM_STR, \PDO::PARAM_STR, \PDO::PARAM_STR], 
    [$username, $random_password_hash, $random_selector_hash, $expiry_date]
);

当您可以使用simple
execute($args)
时,使代码复杂化有什么意义呢?PDO将从
$args
中传递的值中提取数据类型。您在这一点上是错的。PDO永远不会猜出数据类型,因为它可能是危险的。相反,它会将所有参数绑定为字符串。@Dilek nope,不是“安全得多”。这样的语句是没有根据的。将所有值绑定为字符串与任何其他方法一样安全。@Dilek我肯定只保留
execute($args)
,而不保留任何
CreateParams()
这是无用的、繁琐的,并且会无缘无故地使代码膨胀。当您可以使用simple
execute($args)时,使代码复杂化有什么意义
?PDO将从传入的值中提取数据类型。
$args
您在这个问题上是错的。PDO永远不会猜测数据类型,因为它可能是危险的。相反,它会将所有参数绑定为字符串。@Dilek nope,不是“更安全”。这样的语句是没有根据的。将所有值绑定为字符串与任何其他方法一样安全。@Dilek我肯定只保留
execute($args)
,而不保留任何
CreateParams()
,这是无用的、繁琐的,而且会无缘无故地使代码膨胀。