我有一个做了这样的功能:
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