绑定参数数组的参数

我有一个这样的function:

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

call_user_func_array()

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

应该做这个工作

更新 :你也必须改变你的params数组:

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

因为mysqli_stmt::bind_param需要引用第二个和以下参数。


编辑:您的查询似乎是错的。 也许你有更less的领域比你有变数那里。 做:

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

在那里用正确的名称replace字段的名称

从PHP 5.6开始,您可以使用参数解包作为call_user_func_array的替代方法,而且通常快3到4倍。

 $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; } 

你得到你的错误“调用一个非对象的成员函数bind_param()”很可能是因为你的$ this-> mysqli-> prepare会遇到某种错误。 (请参阅http://php.net/manual/de/mysqli.prepare.php – 错误返回FALSE,这似乎是这里的情况)

解决了这个问题之后,试试这个,而不是$ stmt-> bind_param的调用:

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

最简单的方法显然是从mysqli切换到PDO

它会让你以你想要的方式去做,甚至没有任何额外的function:

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

需要注意的是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 ); } }