结合帕拉姆用的参数阵列(Bind Param with array of parameters)

2019-09-01 05:04发布

我有一个做了这样的功能:

function registerUser($firstName, $lastName, $address, $postcode, $email, $password)
    {
        $params = array($firstName, $lastName, $address, $postcode, $email, $password);
        $result = $this->db->bind("INSERT INTO Users VALUES (?, ?, ?, ?, ?, ?)", 'ssssss', $params);
    }

它发送回我的数据库类,做到这一点:

public function bind($query, $type, $params)
        {

            $this->query = $query;
            $stmt = $this->mysqli->prepare($this->query);
            $stmt->bind_param($type, $param);
            $stmt->execute;
        }

问题是,这并不工作。

我希望做的,就是把$params列表并使其在之后一一列举了$type ,以便查询将类似于:

$stmt->bind_param('ssssss', $firstName, $lastName, $address, $postcode, $email, $password);

但很明显,我会约了错误的方式。

有没有办法让数组...变换,因为它是,在进到打印出来的清单bind_param ,查询阶段?

Answer 1:

call_user_func_array()

call_user_func_array(array($stmt, "bind_param"), array_merge(array($type), $params));

应该做的工作

更新 :你也改变你的参数数组:

$params = array(&$firstName, &$lastName, &$address, &$postcode, &$email, &$password);

作为mysqli_stmt::bind_param预计第二和通过参考以下参数。


编辑:您的查询似乎是错误的。 也许你有较少的领域比你有变数存在。 做:

"INSERT INTO Users (field1, field2, field3, field4, field5, field6) VALUES (?, ?, ?, ?, ?, ?)"

在那里你通过正确的名称替换字段的名称



Answer 2:

作为PHP 5.6的可以利用参数拆包作为替代call_user_func_array,也常快3到4倍。

<?php
function foo ($a, $b) {
     return $a + $b;
}

$func = 'foo';
$values = array(1, 2);
call_user_func_array($func, $values);
//returns 3

$func(...$values);
//returns 3
?>

来自这里 。

所以,你的代码应该是这个样子:

public function bind($query, $type, $params)
        {

            $this->query = $query;
            $stmt = $this->mysqli->prepare($this->query);
            $stmt->bind_param($type, ...$params);
            $stmt->execute;
        }


Answer 3:

你得到你的错误“调用一个非对象的成员函数bind_param()”最有可能的,因为你的$这个 - > mysqli->准备遇到某种错误。 (见http://php.net/manual/de/mysqli.prepare.php -它在错误返回FALSE,这似乎是这里的情况)

你已经解决了这个问题后,尝试,而不是你的stmt- $> bind_param通话这样的:

call_user_func_array(array($stmt, 'bind_param'), array_merge($type, $params));


Answer 4:

最简单的方法将明显从切换到mysqli的PDO

它可以让你做你想要的方式,甚至没有任何附加功能:

function registerUser($firstName, $lastName, $address, $postcode, $email, $password)
{
    $sql  = "INSERT INTO Users VALUES (NULL, ?, ?, ?, ?, ?, ?)";
    $stmt = $this->db->prepare($sql);
    $stmt->execute(func_get_args());
}


Answer 5:

今天,我做了一些研究自己,以创建一个使用准备语句简短的表达方式。 答案@bwoebi是非常有帮助的,但对于参数未知量不工作,所以这是一个除了他的回答。

例如:

public function bind($query, $type, &...$params)
    {

        $this->query = $query;
        $stmt = $this->mysqli->prepare($this->query);
        call_user_func_array(array($stmt, "bind_param"), array_merge([$type], $params));
        $stmt->execute();
    }

使用这个线程: PHP:可变长度参数列表供参考?

我设法完成对的参数未知量传递给类内部绑定函数。 我然后使用call_user_func_array(...)与$类型变量的数组合并在所述绑定PARAM函数调用...(必须放在内阵列用于合并)

现在我可以在与$ email和$密码现在是引用调用此函数:

$myClass->bind($query, "ss", $email, $password);


Answer 6:

需要注意的是很重要的mysqli_stmt_bind_param()要求的参数按引用传递,这样的参数call_user_func_array()必须是引用。 从类背景下采取的示例:

function execute( string $query, string $type, array $params )
{
    if ( !$stmt = $this->mysqli->prepare( $query ) ) 
        throw new \Exception( 'Prepare failed: ' . $query . PHP_EOL . $this->mysqli->error );

    // call stmt->bind_param() with variables to bind passed as a reference 
    call_user_func_array( 
        array( $stmt, 'bind_param' ), 
        array_merge( 
            array( $type ), 
            array_map( function( &$item ) { return $item; }, $params ) 
        ) 
    );

    if ( !$stmt->execute() ) 
        throw new \Exception( 'Execute failed: ' . PHP_EOL . $stmt->error );

}

}


文章来源: Bind Param with array of parameters
标签: php mysqli bind