Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/236.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 用参数数组绑定Param_Php_Mysqli_Bind - Fatal编程技术网

Php 用参数数组绑定Param

Php 用参数数组绑定Param,php,mysqli,bind,Php,Mysqli,Bind,我有一个函数可以做到这一点: function registerUser($firstName, $lastName, $address, $postcode, $email, $password) { $params = array($firstName, $lastName, $address, $postcode, $email, $password); $result = $this->db->bind("INSERT INTO Users VALUES (?

我有一个函数可以做到这一点:

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;
}
它发送到我的数据库类,该类执行以下操作:

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\u param
查询阶段打印出来?

“使用参数数组调用回调”

我应该做这项工作

更新:您还必须更改参数数组:

$params = array(&$firstName, &$lastName, &$address, &$postcode, &$email, &$password);
正如
mysqli_stmt::bind_param
所期望的,第二个参数和以下参数是通过引用得到的


编辑:您的查询似乎是错误的。也许你的字段比变量少。做:

"INSERT INTO Users (field1, field2, field3, field4, field5, field6) VALUES (?, ?, ?, ?, ?, ?)"
如果用正确的名称替换字段名称,最简单的方法显然是从mysqli切换到

它可以让您按照自己的方式进行操作,甚至不需要任何附加功能:

function registerUser($firstName, $lastName, $address, $postcode, $email, $password)
{
    $sql  = "INSERT INTO Users VALUES (NULL, ?, ?, ?, ?, ?, ?)";
    $stmt = $this->db->prepare($sql);
    $stmt->execute(func_get_args());
}
很可能会出现错误“调用非对象上的成员函数bind_param()”,因为$this->mysqli->prepare遇到某种错误。 (请参阅-出错时返回FALSE,这里似乎就是这种情况)

解决该问题后,请尝试以下操作,而不是调用$stmt->bind_param:

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

需要注意的是,
mysqli\u stmt\u bind\u param()
要求通过引用传递参数,因此
call\u user\u func\u 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 );

}

}

从PHP5.6开始,您可以使用参数解包作为调用_user_func_数组的替代方法,通常速度会快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
?>

今天,我自己做了一些研究,以创建一个使用prepare语句的较短方法。@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();
    }
使用此线程:

我设法将未知数量的参数传递给类中的bind函数。 然后我使用call_user_func_array(…)和$type变量的数组合并调用bind param函数。。。(必须放置在合并的数组中)

现在我可以使用$email和$password调用此函数:

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

不漂亮,但那是我用的

function _BindParam(&$stmt, &$values){
    $types="";
    foreach($values as $val){
      if(is_string($val)){$types.="s";continue;}
      if(is_int($val)){$types.="i";continue;}
      if(is_float($val) || is_double($val)){$types.="d";continue;}
      throw new Exception('Invalid value type');
    }
   $stmt->bind_param($types,...$values);
}

你的问题显然是错的。在bind_param one
var_dump($this->mysqli->error)之前执行了解出了什么问题。你是对的-缺少一个字段。我已经解决了这个问题,但是在如上所述使用call_user_func_array时,我得到了错误“Warning:array_merge()[function.array merge]:参数#1不是数组警告:call_user_func_array()希望参数2是数组,如果“@DavidG Use then
array_merge(array($type),$params)
,则为null”。但是当您的
$params
未设置时,我无法执行任何操作,因为它应该是正确的。谢谢您的帮助:)它几乎可以正常工作。我得到一个错误:警告:mysqli_stmt::bind_param()的参数2应该是一个引用,给定的值,所以我将尝试找出它是什么about@DavidG嗯,似乎你需要在这里做一些
eval()
。。。除第一个参数外,所有参数均为引用参数(我不知道为什么…)@DavidG:请参阅以了解错误消息。请不要在你的语句之前放“代码> @ /代码> s,它只会抑制错误信息,而不是修复它们的原因。”你的常识是,你认为PDO比MyQuLi更好吗?我也主要使用mysqli,但对PDO知之甚少。@Aris如您所见,PDO需要的代码要少得多。这两条线就是你所需要的。不需要额外的绑定函数。PDO可以开箱即用听起来很棒。我将尝试在将来使用。我意识到这是一个原生php功能?@Aris是的,这就是重点。而且PDO也有错误报告,因此,您不需要手动检查错误。还有很多其他的事情,比如从查询中直接获取标量,还有更多的事情可以使代码更好、更可读