Variable PHP dans Javascript

Résolu
emrh Messages postés 427 Date d'inscription   Statut Membre Dernière intervention   -  
emrh Messages postés 427 Date d'inscription   Statut Membre Dernière intervention   -
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   Statut Membre Dernière intervention   527
 
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   Statut Membre Dernière intervention   20
 
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   Statut Membre Dernière intervention   527 > emrh Messages postés 427 Date d'inscription   Statut Membre Dernière intervention  
 
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   Statut Membre Dernière intervention   20 > Pitet Messages postés 2826 Date d'inscription   Statut Membre Dernière intervention  
 
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 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752
 
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   Statut Membre Dernière intervention   20
 
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 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752 > emrh Messages postés 427 Date d'inscription   Statut Membre Dernière intervention  
 
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   Statut Membre Dernière intervention   20 > jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention  
 
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   Statut Membre Dernière intervention   20 > jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention  
 
$.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 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752 > emrh Messages postés 427 Date d'inscription   Statut Membre Dernière intervention  
 
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   Statut Membre Dernière intervention   20
 
Ç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