11522 sujets

JavaScript, DOM et API Web HTML5

Bonjour,

Je souhaite pouvoir récupérer la valeur d'une variable javascript contenant le score d'un jeu et pouvoir insérer ce score (sa valeur) dans ma table MySql.

Il faut évidemment que le score soit insérer dans la table contenant l'utilisateur enregistré sur le moment.

Merci d'avance pour votre aide !
Salut
il faudrait que tu passe par un formulaire HTML
ensuite c'est à ton PHP de faire le reste et d'insérer dans la base de données...

Mais sans code, on ne risque pas de t'aider Smiley smile
Alors voici mon code html:
<!DOCTYPE html>
<html>

<head>
  <meta charset="utf-8" />
  <title>Création</title>
  <link rel="stylesheet" href="../assets/css/style.css">
  <style>
    * {
      padding: 0;
      margin: 0;
    }

    canvas {
      background: #eee;
      display: block;
      margin: 0 auto;
    }
  </style>
</head>

<body>

  <canvas id="myCanvas" width="1000" height="665"></canvas>

  <script src="../jquery/jquery-3.3.1.min.js"></script>
  <script src="../js/script_3.js">
  </script>

</body>

</html>


Ensuite ma fonction lors de la fin du jeu (game over ou pas):

if (!vie) {
                alert("GAME OVER" + ("\n") + "Score: " + score);
                $.ajax({
                    data: 'score=' + score,
                    url: '../assets/php/login_page.php',
                    method: 'POST', 
                    success: function(msg) {
                        alert(msg);
                    }
                });


En espérant que cela vous aide mieux
Donc maintenant il faut cablé le PHP à ta base..

Utilise donc PDO pour cabler tout ça ! tu configures avec tes informations concernant ta base de données, et ensuite tu peux faire une requête INSERT INTO avec le nouveau score, dans la bonne table.

Ex:
$db = new PDO('dblib:host=your_hostname;dbname=your_db;charset=UTF-8', $user, $pass);
Oui, c'était déjà fait, le problème c'est que lors de la fin du jeu le INSERT INTO ne marche pas et le score de l'utilisateur reste à NULL.

Voici le PDO:

<?php 

try
{
	$bdd = new PDO('mysql:host=localhost;dbname=skateShop;charset=utf8', 'root', '');
}
catch (Exception $e)
{
        die('Erreur : ' . $e->getMessage());
}

?>
JENCAL a écrit :
Montre nous le INSERT INTO alors.


Voilà:

require "assets/php/mySqlLogin.php";

$score = $_POST['score'];

if (isset($_COOKIE['username'])) {
    $req = $bdd->prepare('INSERT INTO info_client(username, score) VALUES(:username, :score)');
    $req->execute(array(
    'score' => $score;
));
}
J'ai changer cela :


require "assets/php/mySqlLogin.php";
session_start();

$score = $_POST['score'];
$username = $_SESSION['username'];

if (isset($_COOKIE['username'])) {
    $req = $bdd->prepare('INSERT INTO info_client(username, score) VALUES(:username, :score)');
    $req->execute(array(
    'username' => $username,
    'score' => $score));
}


A la fin du jeu le problème reste le même, la page contenant le code ci-dessus affiche 'undefined index: score'.
Jimagine que ton code
require "assets/php/mySqlLogin.php";
session_start();

$score = $_POST['score'];
$username = $_SESSION['username'];

if (isset($_COOKIE['username'])) {
    $req = $bdd->prepare('INSERT INTO info_client(username, score) VALUES(:username, :score)');
    $req->execute(array(
    'username' => $username,
    'score' => $score));
}


est sur cette page ?
../assets/php/login_page.php

Car l'undifined index c'est parce que $_POST est vide
Tu devrais rajouter un ISSET POST aussi.
Non, la page ne porte plus le même nom mais oui il est sur une autre page. D'accord je comprend mais cela ne règle donc pas le problème car si je rajoute isset la valeur de score restera NULL puisque dans tout les cas je n'arrive pas à récupérer sa valeur, c'est bien ça ?
LeFrometon a écrit :
Non, la page ne porte plus le même nom mais oui il est sur une autre page. D'accord je comprend mais cela ne règle donc pas le problème car si je rajoute isset la valeur de score restera NULL puisque dans tout les cas je n'arrive pas à récupérer sa valeur, c'est bien ça ?


Oui, le null c'est parce que POST est vide.

Il faut que l'action AJAX (l'url) pointe vers CE CODE la... Ou alors il pointe ailleurs mais dans tous les cas il faut que POST arrive jusqu'a ta requête sql. soit par des paramètres de fonction soit en stockant le tout dans SESSIONS. suis-je clair ?
oui, il y arrive et les variables de SESSIONS sont fonctionnelles mais le score n'arrive jamais à être stocké et envoyé au php ni dans la base de donnnées...
Je me répète.

Si ton code insert into, n'est pas sur la page login_page.php c'est normal que ton score soit vide. car $_POST est accèsible uniquement sur la page appelé par ta requête ajax.

Donc sur login_page.php il faudrait mettre ton POST en sessions.

if(isset($_POST))
{
$_SESSION['tmpPOST'] = $_POST;
}


et ensuite sur la page de ton insert into faire un

if (isset($_SESSION['tmpPOST']))
{
   $score = $_SESSION['tmpPOST']['score'];
}
Finalement j'ai réussi à reprendre la valeur du score javascript en html puis à l'ajouter à ma table via le php, merci quand même de votre aide !
Alors, j'ai créé un form avec la méthode post et une action sur la page des scores et à l'intérieur un input hidden qui permet de stocker la variable score de javascript, voici les codes:

HTML

<form method="post" action="../high_score.php">
      <input type="hidden" id="score" name="score">
    </form>


Javascript

if (!vie) {
                var hidden= document.getElementById('score');
                hidden.value= score;
                hidden.parentElement.submit();
}


HTML et PHP sur page des scores

<?php 
                if (isset($_POST['score'])) {
                  echo $_POST['score'];
                  $username = $_SESSION['username'];

                  $req = $bdd->prepare('SELECT id, score FROM info_client WHERE username = :username');
                  $req->execute(array(
                      'username' => $username));
                  $resultat = $req->fetch();

                  if ($resultat['score'] < $_POST['score'] || $resultat['score'] == '') {

                    $req = $bdd->prepare("UPDATE info_client SET score='".$_POST['score']."' WHERE username= '". $username ."' ");
                    $req->execute(array(
                    'score' => $_POST['score']));
                    $resultat = $req->fetch();

                    echo 'salut';
                    echo $resultat;
                  }
                } else {
                  echo "non";
                }
              ?>


Voilà comment Smiley cligne
Modifié par LeFrometon (18 Feb 2019 - 16:37)
Meilleure solution
Ok donc ça rejoint ce que j'ai dit précédent... sur le changement

"Il faut que l'action AJAX (l'url) pointe vers CE CODE"
Oui tout à fait, par contre le code $.ajax que j'utilisais avant je l'ai du coup remplacé par celui-ci:

if (!vie) {
                var hidden= document.getElementById('score');
                hidden.value= score;
                hidden.parentElement.submit();
}


C'est super que ça marche, je vous remercie pour votre aide tout du long Smiley up
Pas de soucis. Dans le code ajax il été possible de préciser

url: '../assets/php/high_score.php',

au lieu de :

url: '../assets/php/login_page.php',