【问题标题】:How to count and auto create bindParams in pdo?如何在 pdo 中计算和自动创建 bindParams?
【发布时间】:2020-01-07 21:09:21
【问题描述】:

我正在尝试创建一个函数以在来自Your Common Sence 的函数上自动创建 bindParams

这里PDO helper functions

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

这是我正在尝试的函数,该函数调用另一个计算并创建 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);
}

这是 usaqe:

$sql = "INSERT INTO Auth_tokens (username, password_hash, selector_hash, expiry_date) values (?, ?, ?,?)";  
insert($sql, 'param_types', array($username, $random_password_hash, $random_selector_hash, $expiry_date));

我尝试在参数中使用func_get_args();,但完全混淆了:(

谢谢

【问题讨论】:

    标签: php function pdo


    【解决方案1】:

    你的功能可以简化为:

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

    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]
    );
    

    【讨论】:

    • 当您可以使用简单的execute($args) 时,将代码复杂化有什么意义?
    • PDO 将从$args传递的值中提取数据类型
    • 你在这个帐户上错了。 PDO 永远不会猜测数据类型,因为它可能很危险。相反,它将所有参数绑定为字符串。
    • @Dilek 不,不是“更安全”。这种说法是没有根据的。将所有值绑定为字符串与任何其他方法一样安全。
    • @Dilek 我会肯定只保留execute($args) 而没有任何CreateParams(),这是无用的、繁琐的并且会无缘无故地使您的代码膨胀。
    猜你喜欢
    • 2021-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多