绑定参数数组的参数
我有一个这样的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 ); } }