所以我有一个创建帐户方法,在其中有一个名为userInfo
的关联数组。这是数组:
$userInfo = array(
'username' => $username,
'salt' => $this->passwordHash('Extra Protection is a good thing'),
'password' => $this->passwordHash($password)
);
现在我是"尝试"使用预先准备好的声明进行内爆。我试图绑定参数时似乎遇到No data supplied for parameters in prepared statement
错误。
以下是声明:
if ( ! ($stmt = $this->Connection()->prepare("INSERT INTO " . $this->_info['Prefix'] . "users
(`".implode("`, `", array_keys($userInfo))."`) VALUES (?, ?, ?)")))
{
echo 'Prepare Failed: ' . $stmt->error . '<br />';
}
if ( ! $stmt->bind_param('sss', implode("', '", $userInfo)))
{
echo 'Bind Failed: ' . $stmt->error . '<br />';
}
if ( ! $stmt->execute())
{
echo 'Execute Failed: ' . $stmt->error . '<br />';
}
我最初使用real_escape_string
并且查询确实正确执行。它只是它不喜欢的准备好的声明。
它出了什么问题?
答案 0 :(得分:2)
您没有正确理解准备好的陈述。每个插入的值将根据它的表字段定义来准备。 这是您的查询,例如:
INSERT
INTO users (`username`, `salt`, `password`)
VALUES ('john', 'somesalt', 'somepassword');
根据jonh
字段设置,username
- 根据somesalt
等,将根据salt
等准备值implode
那么你的错误是什么(我跳过$stmt = $this->Connection()->prepare("INSERT INTO "
. $this->_info['Prefix']
. "users (`user`, `salt`, `password`) values (?, ?, ?)");
$stmt->bind_param('sss', implode("', '", $userInfo))
等):
当你这样做时:
s
这是错误的,因为查询需要3个字符串( $stmt = $this->Connection()->prepare("INSERT INTO "
. $this->_info['Prefix']
. "users (`user`, `salt`, `password`) values (?)");
$stmt->bind_param('s', implode("', '", $userInfo))
),每个字符串都会根据字段设置进行准备,并且您只提供一个字符串。
当你改为:
$stmt = $this->Connection()->prepare("INSERT INTO "
. $this->_info['Prefix']
. "users (`user`, `salt`, `password`) values (?, ?, ?)");
$stmt->bind_param('sss', $userInfo['username'], $userInfo['salt'], $userInfo['password']);
它也是错的,因为这里出现了查询错误。您想插入三个字段,但仅为一个字段赋值。
所以你真正应该做的是:
implode
所以,最后在mysqli中使用bind_param
bind_param
是不可能的(我希望它是mysqli),如果你想知道使用热点{{}带有数组值的{1}} - 您应该在php.net上阅读此评论 - http://ru2.php.net/manual/ru/mysqli-stmt.bind-param.php#104073