注意:使用Foreach时,数组到字符串转换

时间:2014-11-22 10:52:03

标签: php arrays foreach

因此,我在此系统上忙于更改您的密码,当密码更改时,会出现一个绿色框,其中显示消息'您的密码已更改。'

如果出现错误,会出现一个带有错误的红色框,例如: "您当前的密码不正确",或者"您的新密码和验证密码不相同。"。

因此,如果有帖子请求,我count错误,如果超过0,则返回错误:

public function nieuwpw($username, $currentpass, $newpass, $newpassconf)
{
    $this->errors[] = array();
    $this->succes[] = array();
    $query = $this->db->conn->prepare('SELECT pass FROM ht_users WHERE naam = ?');
    $query->bind_param('s', $username);
    $query->execute();
    $query->bind_result($dbpass);
    $query->store_result();
    while ($query->fetch()) {
        if (password_verify($currentpass, $dbpass))
        {
            if ($newpass === $newpassconf)
            {
                $newpasshash = password_hash($newpass, PASSWORD_DEFAULT);
                $stmt = $this->db->conn->prepare('UPDATE ht_users SET pass = ? WHERE naam = ?');
                $stmt->bind_param('ss', $newpasshash, $username);
                $stmt->execute();
                $stmt->close();
            }
                else
            {
                $this->errors[] = 'Whoops, je 2 nieuwe wachtwoorden zijn niet gelijk.';
            }
        }
            else
        {
            $this->errors[] = 'Whoops, je huidige wachtwoord klopt niet!';
        }
    }
    if (count($this->errors) > 0)
    {
        return $this->errors;
    }
    $this->succes[] = 'Je wachtwoord is met success gewijzigd!';
    return $this->succes;
    $query->close();
}

}

这就是我用来更改密码的功能。以下是我如何回应'错误:

        <?php //24
//25
if(isset($users->succes))//26
{//27
    if (count($users->succes) > 0) //28
    {//29
        foreach ($users->succes as $succes) {//30
                    $content = '<div id="message_succes" style="background-color:#00B200; width:100%; height:30px;"><p style="color:#fff; font-family:Ubuntu; padding:5px;">' . $succes. '</p></div>';//31
    echo $content;//32
//33
            }   //34
    }//35
}//36
if(isset($users->errors))//37
{//38
    if (count($users->errors) > 0) //39
    {//40
        foreach ($users->errors as $errors) {//41
                    $content = '<div id="message_succes" style="background-color:#ff0033; width:100%; height:30px;"><p style="color:#fff; font-family:Ubuntu; padding:5px;">' . $errors. '</p></div>';//42
    echo $content;//43
//44
            }   //45
    }//46
}//47
//48
?> //49

然而,即使我只回应错误或成功消息,如果超过1,我会收到这些错误:

Notice: Array to string conversion in C:\xampp\htdocs\pages\page16.php on line 31


Notice: Array to string conversion in C:\xampp\htdocs\pages\page16.php on line 42

在第二个代码块中,我对行进行编号,以便您可以看到哪些行会抛出错误。

在执行var_dump时,我得到以下输出:

array(2) { [0]=> array(0) { } [1]=> string(41) "Whoops, je huidige wachtwoord klopt niet!" }

另外,我觉得非常奇怪的是它会显示两次红色错误框,即使没有任何成功消息,它也会显示绿框...

我希望这被认为是一个完整的问题,有人可以帮助我解决这个问题。感谢。

2 个答案:

答案 0 :(得分:1)

我认为错误的原因在于您发布的第一个代码块的第3行和第4行:

$this->errors[] = array();
$this->succes[] = array();

尝试将这些行更改为:

$this->errors = array();
$this->succes = array();

在代码中创建一个数组,并立即将数组的第一个元素设置为数组。您可以在发布的var_dump中看到:

array(2){[0] =&gt; array(0){} [1] =&gt; string(41)“哎呀,je huidige wachtwoord klopt niet!” }

稍后,当您循环遍历$ errors或$ succes数组时,循环的第一次迭代将返回您设置为$ errors或$ succes数组的第一个元素的数组。然后你尝试回应那个数组,php会给你一个通知你正在回应一个数组。

我的建议修复是否有效,您是否了解代码中断的原因?

PS:

  1. 尽量保留所有英文代码,以便非荷兰语人士更容易理解您的代码。
  2. 以下字符串是用荷兰语写的:'Je wachtwoord是成功的gewijzigd!'。在荷兰语中,'成功'用1''写成,所以它应该是''Je wachtwoord是成功的gewijzigd!'。
  3. 祝你好运!

答案 1 :(得分:1)

你试过像这样使用它吗?

$this->errors = array();
$this->succes = array();

    foreach ($users as $user) {
        if(isset($user->succes))
        {
            $content = '<div id="message_succes" style="background-color:#00B200; width:100%; height:30px;"><p style="color:#fff; font-family:Ubuntu; padding:5px;">' .$user->succes. '</p></div>';
            echo $content;

        }  
        if(isset($user->errors))
        {
            $content = '<div id="message_succes" style="background-color:#ff0033; width:100%; height:30px;"><p style="color:#fff; font-family:Ubuntu; padding:5px;">' . $user->errors. '</p></div>';
            echo $content;

        }   
    }

评论是否有任何错误......