第一次使用prepare函数时,我得到了部分工作。基本上,我是将用户密码从一个数据库复制到另一个数据库(我正在制作用于转移用户的WordPress插件的一部分)。该代码可以运行并完全满足我的要求,但是仅针对在wp_users表中找到的第一个用户。我需要它继续为该表中的所有用户运行,以便他们都可以转移密码。这是我在下面编写的代码:

为了从原始数据库中获取用户密码(基本上,这会找到所有用户的密码,并将它们放入一个数组中。我仅出于上下文发布此代码。此代码工作得很好):

$i = 0;
//set $user_count-1 because $i needs to start at 0 to represent the indexes and it also prevents the statement from being looped an extra time.
while($i <= $user_count-1) {
if($result = $conn->query("SELECT * FROM wp_users")) {
    if($count = $result->num_rows) {
        //echo $count . ' users found.';

        while($row = $result->fetch_object()) {
            $user_password[] = $row->user_pass;
        }
    }
$i++;
}


检索索引值(这是我用来实际检索这些索引值并将其放入sql查询中的代码。就像我说的那样,它对第一个用户有效,但对其余用户无效):

$stmt = $conn->prepare("UPDATE `wp_plugin_development`.`wp_users` SET `user_pass` = ? WHERE `wp_users`.`user_login` = ?");
$stmt->bind_param('ss', $user_password[$i], $user_login[$i]);
$stmt->execute();


我在想语法是否错误?我不知道。我希望我的问题已经足够清楚了。谢谢你的帮助!

最佳答案

我想到了!

最初,我将代码用于准备语句,并将代码执行在一起。 preparebind_param需要放在$ i自动递增之前。 execute需要放在$ i自动递增之后。这是有效的代码:

$i = 0;
//using $user_count-1 because $i needs to start at 0 to represent the indexes and it also prevents the statement from being looped an extra time.
while($i <= $user_count-1) {
if($result = $conn->query("SELECT * FROM wp_users")) {
    if($count = $result->num_rows) {
        //echo $count . ' users found.';

        while($row = $result->fetch_object()) {
            $user_password[] = $row->user_pass;
$stmt = $conn->prepare("UPDATE `wp_plugin_development`.`wp_users` SET `user_pass` = ? WHERE `user_login` = ?");
$stmt->bind_param('ss', $user_password[$i], $user_login[$i]);
        }
    }
$i++;
if(!$stmt->execute()){trigger_error("there was an error....".$conn->error, E_USER_WARNING);}
}


谢谢大家的投入!

关于php - 我做错了什么? (PHP准备语句),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30905082/

10-10 22:29