如果数据库为空,代码将不起作用

Posted

技术标签:

【中文标题】如果数据库为空,代码将不起作用【英文标题】:if the database is empty, code will not work 【发布时间】:2018-11-17 22:35:42 【问题描述】:

如果数据库不包含条目,则代码将不起作用。如果存在条目,则代码有效。有谁知道为什么代码只有在数据库中已经有条目的情况下才有效?

我收到超时错误:

Maximum execution time of 30 seconds exceeded

_

使用我创建用户的代码,然后是他与邀请 URL 相关的个人资料。创建一个长度为 7 个字符的唯一代码,即个人邀请 URL。 我需要循环,因为必须检查是否曾经生成过代码。还是有更好的解决方案?

 protected function create(array $data)

    if($data['gender'])

    
        $avatar = 'defaults\avatars\male.jpg';
    

    else

    
        $avatar = 'defaults\avatars\female.jpg';
    

    if (array_key_exists('team_id', $data) && $data['team_id'])
        $team = $data['team_id'];
    else
       $team = Null;
    

    if (isset($data['invited_id']) && $data['invited_id'])
        $invited_from = $data['invited_id'];
    else
        $invited_from = Null;
    

    $user = User::create([
        'name' => $data['name'],
        'team_id' => $team,
        'invited_from_id' => $invited_from,
        'username' => $data['username'],
        'email' => $data['email'],
        'password' => bcrypt($data['password']),
        'birthday' => $data['birthday'],
        'gender' => $data['gender'],
        'slug' => str_slug($data['username']),
        'avatar' => $avatar,
        'active' => false,
        'activation_token' => str_random(255)
    ]);

    $user->profile()->save(new Profile());

    while (true) 
        $randomstring = substr(str_shuffle("0123456789abcdefghijklmnopqrstuvwxyz"), 0, 7);
        if (Invite::where('url','!=', $randomstring)->exists()) 
            Invite::create([
            'user_id' => $user->id,
            'url' => $randomstring
            ]);
            break;
        
    

    //store notify for user in database
    $usern = User::find($invited_from);

    if($usern) 
        User::find($usern->id)->notify(new NotifyInvite($user));
    

    return $user;

【问题讨论】:

你能显示你得到的错误吗? 我收到超时错误,我将其添加到我的问题中 仅供参考,您不需要重新找到用户来通知他们,因为您已经在$usern 变量中拥有它们,即$usern->notify(new NotifyInvite($user)) 应该可以正常工作。 【参考方案1】:

问题不在于您的数据库,问题在于如果条件不满足,您永远不会跳出循环。所以while(true) 将永远运行。您需要在条件中添加默认情况,这将退出循环。

【讨论】:

如何添加默认情况? 您需要在这里分享更多关于您想要实现的目标。默认情况下,您应该将break; 排除在 if 条件之外,以便在不满足条件的情况下终止循环。 因此,您可以使用 str_random(7) 辅助函数来代替生成随机 7 个字符的方式。此外,尝试调试即使在空数据库中您的条件返回 false 的原因。我在我的一张桌子上尝试了你的条件,它返回 true。因此,一旦它根据您的代码返回 true,它应该会跳出 while 循环。 如果数据库为空,此代码Invite::where('url','!=', $randomstring)->exists()返回false。为什么?没看懂,应该会生成新的代码,直到生成不存在的代码。 正如我在上面的评论中所说,您需要对其进行调试。我在我的一张桌子上尝试了相同的条件,它应该返回 true。

以上是关于如果数据库为空,代码将不起作用的主要内容,如果未能解决你的问题,请参考以下文章

如果 sscanf 在代码中的任何位置,STM32 USB CDC 虚拟 COM 将不起作用

如果我从横向模式单击快照,人脸检测算法将不起作用

transpportrule不起作用

如果我不在 WinForms 上使用 Thread.Sleep,BackgroundWorker 将不起作用

express.js,如果我删除下一个参数,错误处理程序将不起作用

如果过早调用 presentModalViewController 将不起作用