【问题标题】:AJAX values undefined with SymfonySymfony 未定义的 AJAX 值
【发布时间】:2020-12-14 14:46:04
【问题描述】:

我实际上尝试使用 AJAX 和 Symfony 进行自定义身份验证,但我遇到了一个我什至无法识别的问题。 似乎 AJAX 部分找不到路由,因为我的浏览器控制台无法“识别”我的路由脚本。与输入字段数据相比,我试图识别 AJAX 数据,问题是 AJAX 返回未定义的值。我将把我的代码的不同部分放在下面:

带有 AJAX 脚本的 Twig 模态:

<div class="modal fade" tabindex="-1" role="dialog" id="loginModal">
    <div class="modal-dialog" role="document">
        <div class="modal-content">
            <div class="modal-header">
                <h4 class="modal-title">Connexion</h4>
                <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
            </div>
            <div class="modal-body" align="center">
                <form action="#" method="POST">
                    <label for="pseudoMail">Pseudo ou e-mail : </label>
                    <input type="text" id="pseudoMail" placeholder="Pseudo ou e-mail" name="pseudoMail" required><br>
                    <label for="mdp">Mot de passe : </label>
                    <input type="password" id="mdp" placeholder="Mot de passe" name="mdp" required><br>
                    <input type="submit" class="btn btn-primary" id="login" value="Se connecter" />
                </form>
            </div>
        </div>
    </div>
</div>
<script src="{{ asset('js/jquery-3.5.1.min.js') }}"></script>
<script>

    $(document).ready(function () {
        $("#login").click(function()
        {
            $.ajaxSetup({
                headers: {
                    'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
                }
            });
            $.ajax({
                type: 'POST',
                url: '{{ path('checkLogin') }}',
                data: {
                    pseudo: $("input#pseudoMail").val(),//TODO Remplir l'Ajax de façon à ce que les données soient reconnues
                    motdepasse: $("input#mdp").val()
                },
                dataType: 'json',

                success: function(data)
                {
                    if(data.pseudo !== "" && data.motdepasse !== "")//TODO Modifier la condition et jouer les sons correspondants (dossier sfx)
                    {
                        setTimeout(alert("Vous êtes connecté !"), 5000);
                        var sound = document.createElement('audio');
                        sound.setAttribute('src', 'https://themushroomkingdom.net/sounds/wav/smb/smb_1-up.wav');
                        sound.play();
                    }
                    else
                    {
                        alert("Les identifiants ne correspondent pas. Veuillez réessayer.");
                        var sound = document.createElement('audio');
                        sound.setAttribute('src', 'https://themushroomkingdom.net/sounds/wav/smb/smb_fireworks.wav');
                        sound.play();
                    }
                },
                error: function(data)
                {
                    console.log("Pseudo : " + data.pseudo);
                    console.log("Mot de passe : " + data.motdepasse);
                    console.log("Pseudo sans data : " + $('input#pseudoMail').val());
                    console.log("Mot de passe sans data : " + $('input#mdp').val());
                    console.log(data);
                    alert("Erreur détectée ! " + data);
                }
            });
        });
    });
</script>

PHP 脚本:

    /**
     * @Route("/checkLogin", name="checkLogin")
     */
    public function checkLogin(Request $request, SessionInterface $session)//TODO vérifier les connexions pour mesures de sécurité ?
    {
        $pseudoMail = $request->request->get('pseudoMail');
        $motdepasse = $request->request->get('mdp');
        $repo = $this->getDoctrine()->getRepository(Utilisateur::class);
        $pseudoDB = $repo->findOneBy(["pseudo" => $pseudoMail]);
        $mailDB = $repo->findOneBy(["email" => $pseudoMail]);
        $motdepasseDB = $repo->findOneBy(["motDePasse" => $motdepasse]);
        if (($pseudoDB && $motdepasseDB) || ($mailDB && $motdepasseDB))
        {
            $session->set('login', true);
            /*return $this->render('boutique/index.html.twig', [
                'controller_name' => 'BoutiqueController',
            ]);*/
            var_dump($pseudoMail . "-" . $motdepasse);
            return new JsonResponse(array('pseudo' => $pseudoMail, 'motDePasse' => $motdepasse));
        }
        else
        {
            $session->set('login', false);
            //$this->addFlash('flash', "Login incorrect. Veuillez réessayer.");
            /*return $this->render('accueil/index.html.twig', [
                'controller_name' => 'AccueilController',
            ]);*/
            return new Response("Problème !");
        }
    } 

【问题讨论】:

  • 此路由是否启用了POST 方法类型?
  • `$request 获取密钥与您发送的不同

标签: javascript php jquery ajax symfony


【解决方案1】:

正如 charlietfl 所说,您的 AJAX 代码和 PHP 代码之间的密钥不同。它们应该相等。

data: {
      pseudo: $("input#pseudoMail").val(),
      motdepasse: $("input#mdp").val()
},

在您的 AJAX 请求中,键是 pseudomotdepasse。因此,在您的 PHP 代码中,您应该像这样使用这些键:

$pseudoMail = $request->request->get('pseudo');
$motdepasse = $request->request->get('motdepasse');

【讨论】:

  • 我已经尝试过您的解决方案,但它不起作用(顺便感谢您的回答,我不知道这些键应该相等,我是 AJAX 初学者)。我认为这是一个路径问题,因为当我检查我的浏览器控制台时,我的 PHP 脚本根本没有加载。控制台向我显示一条消息,指出无法加载资源。这让我觉得这条路线根本无法识别,而且这不仅仅是一个关键错误。如果您需要更多代码来帮助您,请随时问我。再次感谢您的帮助。
  • 这就是我所做的,但是我遇到了一个错误,阻止我检查我的 PHP 代码。这就是为什么我认为这是我的 AJAX 脚本中 URL 参数中的路径问题。我会给你看我得到的截图:Screenshot。当我尝试检查“checkLogin”PHP 脚本时,我无法检查任何内容。是否可以在 AJAX 脚本中使用 twig 语法(如果脚本在 twig 文件中)?因为这可能是错误。再次感谢你。编辑:我使用的是 Safari 浏览器,也许这些信息会有所帮助。
  • 好的,我发现了其他可能导致我的项目出现问题的东西。我在我的 ajax 函数顶部放置了一个 event.preventDefault() 以避免页面自行刷新。现在我可以在 XHR 选项卡上看到一些内容,并在浏览器控制台上看到更多信息。我会试着找出另一个问题在哪里。
  • 问题已解决。我在理解数据过程时遇到了一些困难,但现在一切正常!我会将这个问题标记为已解决。谢谢!
猜你喜欢
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-13
  • 1970-01-01
相关资源
最近更新 更多