如何在bind_param上使用implode?

时间:2014-09-28 18:05:23

标签: php mysqli

所以我有一个创建帐户方法,在其中有一个名为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并且查询确实正确执行。它只是它不喜欢的准​​备好的声明。

它出了什么问题?

1 个答案:

答案 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