Bonjour a tous apres avoir cherche plein de choses concernant mon sujet je rencontre un probleme. J'ai une page php qui fait appel a une page JS. La page JS se nomme Quiz.js. Dedans je recupere le score de l'utilisateur. Ensuite je la recupere pour pouvoir la recuperer dans mon fichier php. Au passage je stocke le score de l'utilisateur dans un fichier .log pour voir si le score coresspond bien a celui de l'utilisateur


"```` Javascript
// Recupere le score une fois le quiiz terminé 
    fetch ('/ITESCIA/Application_Enfant/Quiiz.php',
        {
            method: "POST",
            headers: {
                "Content-Type": "application/json"
            },
            body: JSON.stringify(
                {
                    "userscore":userScore
                }
            )
        });
"

"```
<?php
session_start();
/* Connexion a la bdd, LocalHost, dbname, user, mdp */ 
$bdd = new PDO('mysql:host=127.0.0.1; dbname=membre', 'root', '');

// Recuperation de la varaibles js 
$data = trim(file_get_contents("php://input"));
$data = json_decode($data, true);
file_put_contents('error.log', $data);

$numero = intval($_SESSION['id']);
$pseudo = strval($_SESSION['identifiant']);

if(isset($_POST['Insertion'])){

    echo("<script>console.log('PHP: ".$data."');</script>");

    //préparation de la requête et des variables mais s'execute des le debut de la page
    $sql = ("INSERT INTO resultat (`Id_Utilisateur`,`Nom_Utilisateur`,`score`)  VALUES (:valeur1,:valeur2,:valeur3)");
    $datas = array(':valeur1'=>$numero, ':valeur2'=>$pseudo, ':valeur3'=>$data);

    //Execution de la requete
    try{

    $requete = $bdd -> prepare($sql);
    $requete->execute($datas) ;
    $message = "le score est : ".$data;

    }catch(Exception $e){
    // en cas d'erreur :
    echo " Erreur ! ".$e->getMessage();
    echo " Les datas : ";
    print_r($datas);
    }
}

Ce que je veux

Je souhaite donc recuperer le score de l'utilisateur, le recuperer en php pour pouvoir ensuite l'inserer dans ma base de données

Ce que j'obtiens
Le soucis c'est que la varibale que je recuperere est null, alors que dans mon fichier .log la valeur correspond bien au score de l'utilisateur. C'est lors de l'insertion que il me dit dans ma base de données que le score est null.

10 réponses


Bonjour.
Il te suffit de le récupérer via la variable globale _POST, il est d'ailleurs inutile d'nvoyer les données au format json.
Soit :

$score = $_POST['userscore'];

Au passage, si tu utilises les marqueurs nommés pour ta requête SQL, autant leur donner un nom facilement identifiable, au lieu de valeur1, valeur2, valeur3...
Il est d'ailleurs inutile de prefixer les noms par : dans la méthode execute.

White
Auteur

J'ai pas bien compris, le but est de recuperer une varibale dans mon fichier JS (scoreUser). J'aimerai donc la recuperer pour pouvoir l'utilise dans mon code php.
C'est donc pour cela que j'ai utilisé du Ajax car la variable que je souhaite utiliser se trouve dans mon fichier JS. Et j'aimerai la recuperer dans ma page php pour pouvoir l'utiliser. :)

Oui, je le sais bien.
Par contre, il y a un problème dans ton code PHP.
Tu ne définis la variable datas, que si un champ nommé Insertion existe, sauf que dans ta requête ajax, il n'y a aucun index dans les données postées qui porte ce nom.
Seul l'index userscore existe via ta requête Ajax.
Par conséquent tu ne peux pas en plus entrer dans la condition requise.

White
Auteur

je vais peut etre passé pour un débile mais j'ai pas compris.

White
Auteur

Je pense que ma requete ajax est fausse, car j'ai pas tres bien compris aussi l'ajax.

White
Auteur

Simplement je veux juste recuperer userscore grace a une requete ajax pour l'envoyer vers la page php. Si tu as un exemple pour que je comprenne je suis prenneur :). Parceque j'ai du mal a comprendre.

Pour commencer, si le script PHP soit Quiiz.php gère autant ta requête ajax qu'une requête HTTP classique et que tu veux gérer les deux cas différemment, il te faut vérifier quelle type de requête est faite lors de l'appel à ton script PHP.
Si par exemple lors de la requête classique il faut impérativement l'index Insertion dans les requêtes postées, mais pas lors d'une requête ajax, il te faut d'abord vérifier de quelle type de requête il s'agit et faire les vérifications selon le cas.
Pour le Javascript:

let formData = new FormData()
formData.append('userscore', userScore)
fetch ('/ITESCIA/Application_Enfant/Quiiz.php', 
    method: 'POST',
    headers: {
        'X-Requested-With': 'XMLHttpRequest'
    },
    body: formData
)
    .then((response) => response.json())
    .then((data) => {
        // Ici tu peux par exemple effectuer une action ou une autre selon le type de données que tu renverrais depuis ton script PHP
    })

Dans le code Javascript que tu montres, tu ne fais qu'effectuer la requête à ton script PHP, mais il te faut aussi faire un traitement selon un retour de données que tu fais par la suite depuis celui-ci, sinon l'utilisateur ne sait pas ce qu'il se passe et il va vite laisser tomber ton site.

White
Auteur

Dans ton script que tu me montre,

let formData = new FormData()
formData.append('userscore', userScore)
fetch ('/ITESCIA/Application_Enfant/Quiiz.php', 
    method: 'POST',
    headers: {
        'X-Requested-With': 'XMLHttpRequest'
    },
    body: formData
)
    .then((response) => response.json())
    .then((data) => {
        // Ici tu peux par exemple effectuer une action ou une autre selon le type de données que tu renverrais depuis ton script PHP
    })

Ou recupere ou le score utilisateur ? J'ai du mal a comprendre,
Apres je souhaite faire une insertion, quand le user click (issest($_POST['Insertion')).
Comment on balance le score dans la page php ?

Je suis désolé si je me repete j'ai du mal :)

Lorsque tu fais une requête Ajax, soit en JavaScript, c'est comme-ci l'utilisateur faisais une requête HTTP classique via le navigateur.
Par conséquent tu fais appel au script PHP, en lui transmettant des données.
Si tu n'a pas compris ça, je te recommandes de te documenter sur le JavaScript via les tutoriels/formations présent(e)s sur le site.

Hello,

De ce que j'ai crus comprendre, tu souhaite que ton JavaScript communique avec ton PHP via une requête Ajax.
Ce qu'il est important de comprendre ici c'est que les variables que tu envoye dans le body de ta requête Ajax sont stockées dans une variable magique en PHP qui est $_POST. Si elles sont bien envoyés tu peux très facilement les récupérées et les traitées en PHP.

Pour que tu comprennent mieux j'ai modifié les examples de code de ton sujet pour utiliser le $_POST.

fetch(
    '/ITESCIA/Application_Enfant/Quiiz.php',
    method: 'POST',
    body: JSON.stringify{
        "userscore": userScore,
        "insertion": true // Si tu ne souhaite pas faire d'insertion, met la variable à `false`
    }
)
.then(function (response) {
    // La requête c'est executée avec succès et tu peux en informer ton utilisateur
    let data = response.json();
    console.log(data);
})
.catch(function (error) {
    // Il y a eu une erreur, et là encore tu peux en informer ton utilisateur
    console.error(error)
})

N'ayant pas le script complet sous les yeux c'est compliqué de voir exactement ce que tu souhaite mettre dans le body de ta requête, donc j'ai fais au mieux pour que le script fonctionne tel quel.

Ensuite du côté PHP, tu peux simplifier ton code et le rendre plus clair.

<?php
session_start();

$bdd = new PDO('mysql:host=127.0.0.1; dbname=membre', 'root', '');

$numero = intval($_SESSION['id']);
$pseudo = $_SESSION['identifiant'];
// Plus besoin ici d'utiliser php://input, les données du formulaire sont dans $_POST

if (isset($_POST['insertion'])) {
    $query = "INSERT INTO resultat (`Id_Utilisateur`, `Nom_Utilisateur`, `score`) VALUES (:numero, :pseudo, :score)";
    $values = [
        ':numero' => $numero,
        ':pseudo' => $pseudo,
        ':score' => $_POST['userscore'] // Voilà où est le score. Attention a bien vérifié que le type correspond avec ce que tu veux mettre dans ta base de donnée
    ];

    try {
        $request = $bdd->prepare($sql);
        $request->execute($values);

        // C'est ici que tu retourne un message de succès pour que ton JavaScript puisse executer le `.then(...)`
        return [
            'title' => "Succès",
            'message' => "Score sauvegardé avec succès"
        ];
    } catch (\Exception $e) {
        // Et là une message d'erreur, pour executer le `.catch(...)`
        return [
            'title' => "Erreur",
            'message' => "Une erreur est survenue lors de la sauvegarde du score"
        ];
    }
}

Je suis loin d'être un expert avec PDO donc il est possible que la requête ne soit pas valide, si c'est le cas tu peux remplacer la partie $query et $values par ce que tu avais. Le seul truc est qu'il faut conserver la variable $_POST['userscore'] car c'est elle qui contient le score envoyé par ton JS.