Variable PHP dans Javascript

Résolu/Fermé
emrh Messages postés 427 Date d'inscription mardi 9 décembre 2014 Statut Membre Dernière intervention 9 avril 2024 - Modifié le 26 mai 2022 à 12:14
emrh Messages postés 427 Date d'inscription mardi 9 décembre 2014 Statut Membre Dernière intervention 9 avril 2024 - 29 mai 2022 à 20:11
Bonjour à tous,

J'essaie de récupérer dans Javascript deux variables PHP (N° de facture + N° de client) pour les passer à une page externe de traitement PHP afin de rapatrier sur la page d'appel ajax les enregistrements d'une bdd correspondants.

Le code fonctionne parfaitement sur une page mais bizarrement produit un message d'erreur dans la console sur une autre page, et rien ne s'affiche :
var Client = "<br />
<b>Notice</b>: Trying to access array offset on value of type bool in <b>/var/www/html/gite/gestion/factures.php</b> on line <b>375</b><br />
";


Voici le code en question :

<input type="image" class="td-icone" id="FactBtn" alt="Login" src="img/loupe.png" value="<?php echo $facture['facture'];?>" onclick="FactModal(this)" alt="Visualiser cette facture" title="Visualiser cette facture">



function FactModal(arg3){
          var FactNum = arg3.value;
          var Client = "<?php Print($facture['id_client']); ?>";    //<---------------- Ligne 375
          var infoFact = document.getElementById("IdFact");
          infoFact.textContent = FactNum;      
          $.ajax({
            type:'POST',
            url:'facture-visualiser.php',
            data: { FactClient: FactNum, ClientNum: Client },
            success:function(html){
              $('#facture-body').html(html);            
            }
          });
          var modal = document.getElementById("FactModal");
          var span = document.getElementsByClassName("close2")[0];
          modal.style.display = "block";
          span.onclick = function(){
            modal.style.display = "none";
          }
          window.onclick = function(event) {
            if (event.target == modal) {
              modal.style.display = "none";
            }
          }
        }



La variable $facture['id_client'] s'affiche parfaitement bien à d'autre endroit de la page.

Je ne mets pas le code de la page de traitement puisque l'erreur se produit avant qu'elle ne soit appelée et que d'autre part elle fonctionne bien lorsqu'elle est appelée par une autre page de ma webapplication.

Merci d'avance pour votre aide !

Configuration: Linux / Chrome 101.0.4951.64
A voir également:

3 réponses

Pitet Messages postés 2826 Date d'inscription lundi 11 février 2013 Statut Membre Dernière intervention 21 juillet 2022 524
29 mai 2022 à 12:21
Bonjour,

Puisque tu as modifié, dans l'attribut onclick, l'appel de la fonction js FactModal en lui passant directement les paramètres facture et id_client, tu n'as donc pas besoin d'utiliser la propriété .value sur les arguments de cette fonction.
Tu peux directement utiliser les arguments arg3 et arg4 ou même les renommer en FactNum et Client :
function FactModal(FactNum, Client){
    console.log(FactNum);
    console.log(Client);
    // ...
1
emrh Messages postés 427 Date d'inscription mardi 9 décembre 2014 Statut Membre Dernière intervention 9 avril 2024 20
Modifié le 29 mai 2022 à 14:15
C'est exactement ce qu'il me fallait !
C'était si simple !!! MERCI PITET !

Merci également à Jordan pour t'être penché sur mon problème !


Tu dis "Puisque tu as modifié..." ça veut dire que l'ont pouvait passer par l'affectation de valeurs à des variables var FactNum = arg3.value;
Si oui, comment fallait il faire à l'appel de la fonction pour conserver cette présentation ?
0
Pitet Messages postés 2826 Date d'inscription lundi 11 février 2013 Statut Membre Dernière intervention 21 juillet 2022 524 > emrh Messages postés 427 Date d'inscription mardi 9 décembre 2014 Statut Membre Dernière intervention 9 avril 2024
29 mai 2022 à 17:40
Dans ton premier code, la fonction js est appelée avec le paramètre this qui représente la balise html input, car la fonction est appelée dans l'attribut onclick de cette balise. Tu peux faire un console.log(arg3) pour voir que le paramètre est un objet js HTMLInputElement. Le numéro étant stocké dans l'attribut html value, il faut donc utiliser en js la propriété value sur l'élément passé en paramètre pour récupérer le numéro (arg3.value).

A la place de value, tu pourrais utiliser des attributs data-* pour stocker le numéro de facture et l'id du client. Il faudra alors utiliser la propriété dataset au lieu de value sur l'élément passé en paramètre.
Mais le plus simple dans ton cas est sûrement de passer directement les données en paramètres de la fonction comme tu as fait dans tes dernières modifications ;)

<input type="image" onclick="factModalValue(this)" value="3" src="img/loupe.png">

<input type="image" onclick="factModalDataset(this)" data-facture="3" data-id-client="17" src="img/loupe.png">

<input type="image" onclick="factModalParameters(3, 17)" src="img/loupe.png">



function factModal(element) {
	console.log(element); // HTMLInputElement
	console.log(element.value); // "3"
}

function factModalDataset(element) {
	console.log(element.dataset.facture); // "3"
	console.log(element.dataset.idClient); // "17"
}

function factModalParameters(facture, idClient) {
	console.log(facture); // 3
	console.log(idClient); // 17
}

1
emrh Messages postés 427 Date d'inscription mardi 9 décembre 2014 Statut Membre Dernière intervention 9 avril 2024 20 > Pitet Messages postés 2826 Date d'inscription lundi 11 février 2013 Statut Membre Dernière intervention 21 juillet 2022
29 mai 2022 à 20:11
Merci beaucoup d'avoir pris le temps d'écrire cette réponse très complète avec tous ces exemples... je vais les copier/coller dans mon pensebete.js avec des commentaires pour la prochaine fois où le cas se représentera !
0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
26 mai 2022 à 12:25
Bonjour
Il nous faudrait le début du code ou au moins la partie où tu initialise ta variable $facture ...
0
emrh Messages postés 427 Date d'inscription mardi 9 décembre 2014 Statut Membre Dernière intervention 9 avril 2024 20
Modifié le 29 mai 2022 à 09:41
Mon erreur vient du fait que la page qui fonctionne contient qu'un seul client et une seule facture, du coup la variable client récupérée par var Client = "<?php Print($facture['id_client']); ?>"; fonctionne, ce qui n'est pas le cas de la page factures.php qui est un tableau contenant plusieurs clients. Les variables n° de facture et n° de client ne sont pas transmises à Javascript d'où le message d'erreur...

En faisant des recherches, j'ai trouvé ça qui devrait aller :

<input type="image" class="td-icone" id="FactBtn" alt="Login" src="img/loupe.png" onclick='FactModal("<?php echo $facture['facture'];?>" , "<?php echo $facture['id_client']; ?>")' alt="Visualiser cette facture" title="Visualiser cette facture">


(J'ai viré au passage value="<?php echo $facture['facture'];?>" qui à mon avis ne sert à rien)


Je n'ai plus de message d'erreur en console, le modal s'ouvre bien mais reste vide... Il doit y avoir encore un problème au passage des variables :
//##################### M O D A L    F A C T   ###################
    function FactModal(arg3,arg4){
      var FactNum = arg3.value;
      var Client = arg4.value;
      console.log(FactNum);
      console.log(Client);
      var infoFact = document.getElementById("IdFact");
      infoFact.textContent = FactNum;      
      $.ajax({
        type:'POST',
        url:'facture-visualiser.php',
        data: { FactClient: FactNum, ClientNum: Client },
        /*data:'FactClient='+FactClient,*/
        success:function(html){
          $('#facture-body').html(html);            
      }
  });
      var modal = document.getElementById("FactModal");
      var span = document.getElementsByClassName("close2")[0];
      modal.style.display = "block";
      span.onclick = function(){
        modal.style.display = "none";
    }
    window.onclick = function(event) {
        if (event.target == modal) {
          modal.style.display = "none";
      }
  }
}



Console :
>>undefined
>>undefined
0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650 > emrh Messages postés 427 Date d'inscription mardi 9 décembre 2014 Statut Membre Dernière intervention 9 avril 2024
29 mai 2022 à 09:39
Impossible pour nous de le savoir
Il faut que tu ajoutes des consoles.log dans ton code JavaScript pour voir le contenu des variables..
Et il faudrait également regarder la réponse ajax que tu peux voir via la console de ton navigateur internet...
0
emrh Messages postés 427 Date d'inscription mardi 9 décembre 2014 Statut Membre Dernière intervention 9 avril 2024 20 > jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024
29 mai 2022 à 09:53
J'ai des console.log en lignes 5 et 6 qui sortent undefined pour les 2 variables...
La partie while ($facture = $req_factures->fetch()) { ?> pour la création du tableau fonctionne bien puisqu'il s'affiche correctement et que <a href="client-fiche.php?id_client=<?php echo $facture['id_client'];?>"> ouvre la bonne page...

Je pense que je ne sais pas passer 2 variables et que le problème doit se situer ici :
onclick="FactModal(<?php echo $facture['facture'];?> , <?php echo $facture['id_client']; ?>)"

et là :
function FactModal(arg3,arg4){
var FactNum = arg3.value;
var Client = arg4.value;
0
emrh Messages postés 427 Date d'inscription mardi 9 décembre 2014 Statut Membre Dernière intervention 9 avril 2024 20 > jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024
29 mai 2022 à 10:13
$.ajax({
            type:'POST',
            url:'facture-visualiser.php',
            data: { FactClient: FactNum, ClientNum: Client },        
            success:function(html){
                console.log(html);//does not print in the console
                $('#facture-body').html(html);            
            }
        });


0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650 > emrh Messages postés 427 Date d'inscription mardi 9 décembre 2014 Statut Membre Dernière intervention 9 avril 2024
29 mai 2022 à 10:17
Je t'invite à utiliser firefox pour debuguer de l'Ajax...et pense bien à activer dans la console, ke debugage xhr pour pouvoir voir les appels ajax et les réponses.
En ce qui concerne les consoles.log il serait peut-être bien également d'en faire un sur les data que tu envoies dans ton Ajax...
1
emrh Messages postés 427 Date d'inscription mardi 9 décembre 2014 Statut Membre Dernière intervention 9 avril 2024 20
26 mai 2022 à 14:35
Ça se passe dans une boucle :

<?php
while ($facture = $req_factures->fetch())
{ ?>
 <tr>
 <td data-label="N°" class="td-centre">
  <?php echo $facture['facture']; ?>
 </td>
 <td data-label="DATE" class="td-centre">
  <?php $date_facture = date("d/m/Y", strtotime($facture['date_facture']));
    echo $date_facture; ?>
 </td>
 <td data-label="CLIENT">
  <a href="client-fiche.php?id_client=<?php echo $facture['id_client']; ?>">
    <img src="img/<?php echo $type; ?>>
 </a>
 </td>
 <td data-label="TOTAL" class="td-droite">
  <?php
    $total = $facture['Total_facture'];
    echo number_format($total, 2, ",", ".") . '  ';
?>
 </td>
 <td data-label="VERST" class="td-droite">
  <?php
    $verst = $facture['VERST'];
    if ($verst <> NULL)
    {
        echo number_format($verst, 2, ",", ".") . '  ';
    }
?>
 </td>
 <td data-label="SOLDE" class="td-droite">
  <?php
    $solde = $total - $verst;
    if ($solde <> 0)
    {
        echo number_format($solde, 2, ",", ".") . '  ';
    }
?>
 </td>
 <td class="td-centre">
  <!-- ############## FACTURE VISUALISER ####################-->
  <input type="image" class="td-icone" id="FactBtn" alt="Login" src="img/loupe.png" value="<?php echo $facture['facture']; ?>" onclick="FactModal(this)" alt="Visualiser cette facture" title="Visualiser cette facture">
... / ...

</tr>
<tr class="separateur"></tr>
<?php }

0