Exécuter la requête CURL dans AJAX

Résolu
ananias8686 Messages postés 96 Statut Membre -  
ananias8686 Messages postés 96 Statut Membre -
Je voudrais afficher le résultat d'un script php dans une input text.

Lorsque l'IBAN est entré, le clique sur le champ BIC devrait afficher le BIC correspondant.
Mon code php contient une variable($iban), une fois cette variable est entré, le script returne le BIC correspondant.
Je voudrais récupérer le champ (input type id=iban) et l'envoyer dans ma variable($iban) afin de récupérer le BIC dans le formulaire.
J'ai essayer de le faire avec ajax mais sans succès.
https://forums.commentcamarche.net/forum/affich-36558996-verifier-que-l-iban-rentre-est-correct-puis-afficher-le-bic#p36561002
Code html avec script js
<form action="" method="post">

    <label>IBAN</label>

    <input id="iban" type="text"/>
                   
    <label>BIC</label> 
        
    <input id="bic" readonly type="text"></input>

</form>

<script type="text/javascript">
$("#iban").on("blur",function(){
    var iban = $(this).val();
 getBIC(iban);

});


function getBIC(iban){
 $.ajax({
  url: 'curl.php',  // mon script curl pour afficher le Bic
  data: { // je ne sais quoi envoyer ici
  },
  success: function(result) {
     if(typeof(result)!="undefined" && result!=null){
    if(result.valid) {
        
   console.log(result);
   
   $("#bic").val(result.bic); 
    }else{
   alert ("IBAN non valide");
    }
     } else{
    alert ("No result");
  }
  },
  
 });
}
</script>

<script  src="https://code.jquery.com/jquery-3.4.1.min.js"  
             integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo="   
             crossorigin="anonymous">
</script>


Code php(curl.php)
<?php 

include_once('simple_html_dom/simple_html_dom.php');
  /* Utilisation de Curl */
 
//On stock la valeur des variables POST
 $url='https://bank.codes/iban/validate/';
$iban='';

$data=array(
    'iban' => $iban) ;
$fields_string = http_build_query($data);
 
//Initialisation de curl dans $curl
$ch = curl_init();
 
curl_setopt($ch, CURLOPT_URL, $url); //Page sur laquelle envoyer les POST autrement dit la page vers laquelle pointe le formulaire
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS,$fields_string); //On envoie les valeurs 
curl_setopt($ch, CURLOPT_FAILONERROR, true); // Required for HTTP error codes to be reported via our call to curl_error($ch)
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);


$data = curl_exec($ch); //Recuparation de la page
curl_close($ch);

$html = file_get_html($data) ;
$pattern='[A-Z]{6,6}[A-Z2-9][A-NP-Z0-9]([A-Z0-9]{3,3}){0,1}'; //regex pour BIC EU
preg_match_all('/'.$pattern.'/', $data, $out);
print_r($out[0][0]);

// clean up memory
$html->clear();
unset($html);
 
 ?>

Comment envoyer la variable
var iban = $(this).val()
dans le code php afin d'executer la requête curl?
Je serais reconnaissant pour toutes les idées.

7 réponses

  1. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830
     
    Bonjour,
    data: { // je ne sais quoi envoyer ici
      },
    

    Tu lui passe les paramètres que tu souhaites :
    type: "POST",
    data: { iban:iban },
    


    et dans le code PHP .. tu les récupère
    $iban = !empty($_POST['iban']) ? $_POST['iban'] : null;
    


    Par contre, pour récupérer proprement les données ensuite dans ton js, il faut indiquer que ton ajax attend du JSON
    $.ajax({ 
            type: "POST",
           'curl.php',
           data: { iban:iban },
            dataType: "json"
    
    


    et côté php, renvoyer le résultat au format JSON
    // print_r($out[0][0]);
    echo  json_encode($out[0][0]); // renvoi au format JSON. !!Attention à ne rien afficher d'autre dans ce script sinon le format json ne sera pas valide
    


    0
    1. ananias8686 Messages postés 96 Statut Membre
       
      Bonjour
      Merci pour votre aide
      Le clic sur le champ bic ne retourne pas le bic correspondant.
      Je pense que la variable($iban) n'est pas récupérer dans curl.php
      Dans mon formulaire
      form action="" method="post"

      Par contre quand j'envoie un IBAN dans la variable($iban) dans curl.php ça me renvoie juste
      "GEBABEBB"
      je sais pas si c'est du json.
      0
      1. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830 > ananias8686 Messages postés 96 Statut Membre
         
        Le fait de faire de l'ajax rend ton
        <form action="" method="post">
        inutile...
        As tu regardé dans la console de ton navigateur ce qui s'y passait ?
        L'appel ajax se fait ?
        Quelle réponse obtiens tu ? (dans la console toujours...) ?

        A noter que pour débuguer facilement l'ajax, je te conseilles d'utiliser FireFox. La console est plus simple pour l'ajax.
        Il faut, bien entendu, activer le debugage du XHR.
        ensuite, regarder ce qui est envoyé/recu en dépliant la petite fleche qui se trouve au début de la ligne;
        0
  2. ananias8686 Messages postés 96 Statut Membre
     
    J'ai inserer un IBAN puis j'ai cliquer sur le champs BIC
    Voici le resultat


    J’obtiens l'alerte "IBAN non valid" de AJAX
    0
    1. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830
       
      L'écran que tu nous montre n'est pas le résultat de la requête AJAX. (tu n'es même pas dans l'onglet console...)

      Il nous faut l'onglet parametres et l'onglet réponse de l'ajax
      0
      1. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830 > jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention  
         
        Dans la partie JS de ton ajax, il faudrait également mettre le "error"
        error: function (err) {
           console.log("Erreur Ajax : ",err);
           alert("Erreur Ajax !  Regardez la console pour plus d’informations...");
        }
        
        0
  3. ananias8686 Messages postés 96 Statut Membre
     
    Bonjour
    J'ai ajouter le "error", la console renvoie 'null' avec l'erreur AJAX "Erreur Ajax ! Regardez la console pour plus d’informations..."

    Voici le résultat de la console


    0
    1. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830
       
      Donc il t'indique une erreur 500 'internal server error'
      Ce n'est donc pas un souci côté Javscript .... Le souci se situe au niveau du code php.

      As tu procédé aux corrections que je t'avais donné ?
      As tu activé l'affichage des erreurs PHP ?
      Peux tu également nous montrer l'onglet "parametres" dans la console sur ton ajax qu'on voit ce que tu envois comme données ?
      0
  4. ananias8686 Messages postés 96 Statut Membre
     
    J'ai bien effectué les corrections,
    Quand j'execute curl.php
    Notice: Undefined offset: 0 in /home/public_html/aaa/hello/curl.php on line 37
    null
    car variable non reçu (je pense)

    Réponse de l'onglet "parametres" dans la console


    Curl.php
    <?php
    //Affichage des erreurs PHP
    error_reporting(E_ALL);
    ini_set('display_errors', TRUE);
    ini_set('display_startup_errors', TRUE);
    
    include_once('simple_html_dom.php');
      /* Utilisation de Curl */
    
    //On stock la valeur des variables POST
    $iban = !empty($_POST['iban']) ? $_POST['iban'] : null;
     $url='https://www.ibancalculator.com/validate/'.$iban.'/';
    $data=array(
        'tx_valIBAN_pi1[iban]' => $iban) ;
    $fields_string = http_build_query($data);
     
    //Initialisation de curl dans $curl
    $ch = curl_init();
     
    curl_setopt($ch, CURLOPT_URL, $url); //Page sur laquelle envoyer les POST autrement dit la page vers laquelle pointe le formulaire
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS,$fields_string); //On envoie les valeurs 
    curl_setopt($ch, CURLOPT_FAILONERROR, true); // Required for HTTP error codes to be reported via our call to curl_error($ch)
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
    
    
    $data = curl_exec($ch); //Recuparation de la page
    curl_close($ch);
    
    $html = file_get_html($url);
    
    
    $pattern='[A-Z]{6,6}[A-Z2-9][A-NP-Z0-9]([A-Z0-9]{3,3}){0,1}'; //regex pour BIC EU
    preg_match_all('/'.$pattern.'/', $html->plaintext, $out);
    echo json_encode($out[0][0]) ;
    
    // clean up memory
    $html->clear();
    unset($html);
    
    ?>


    index.html(code js inclus)
    <script>
    $("#iban").on("blur",function(){
        var iban = $(this).val();
    	getBIC(iban);
    
    });
    
    
    function getBIC(iban){
    $.ajax({ 
            type: "POST",
           url:'curl.php', 
           data: { iban:iban },
            dataType: "json", 
    
    	 success: function(result) {
    	    if(typeof(result)!="undefined" && result!=null){
    		  if(result.valid) {
    		      
    			console.log(result);
    			
    			$("#bic").val(result.bic); 
    		  }else{
    			alert ("IBAN non valide");
    		  }
    	    } else{
    		  alert ("No result");
    		}
    	 },
    	 
    	error: function (err) {
       console.log("Erreur Ajax : ",err);
       alert("Erreur Ajax !  Regardez la console pour plus d’informations...");
    },
    	 
    	});
    }
    </script>

    0
    1. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830
       
      Remplace la ligne 37
      echo json_encode($out[0][0]) ;
      

      par
      echo json_encode($out) ;
      
      0
      1. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830 > jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention  
         
        même mieux..
        echo json_encode(array('result'=>$out,'debug'=>$iban)) ;
        
        0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. ananias8686 Messages postés 96 Statut Membre
     
    J'ai bien remplacé la ligne 37
    Quand j'execute directement curl.php
    {"result":[[],[]],"debug":null}

    Le clic sur le champ bic retourne l'erreur ajax "IBAN non valide"
    0
    1. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830
       
      Tu pourrais nous montrer l'onglet réponse de ta requête ajax dans la console
      0
  7. ananias8686 Messages postés 96 Statut Membre
     
    Veuillez bien m'excuser pour le délais de réponse. J'ai eu un problème avec mon navigateur Firefox(impossible de le démarrer pour moment), j'ai donc utiliser Firebug pour la reponse ajax



    0
    1. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830
       
      Donc c'est bon.
      Tu n'as plus qu'à utiliser le résultat dans ton code js.
      Visiblement ton appel ajax a fonctionné...
      0
      1. ananias8686 Messages postés 96 Statut Membre > jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention  
         
        Bonjour,
        Dans j'ai d'abord fait un essai pour mon fichier curl.php ligne 37 j'ai mis
        echo json_encode(array('bic'=>$out[0][0]));
        en insérant un Iban dans $iban, ça me sort ce json {"bic":"GEBABEBB"}.

        J'ai ensuite modifier la variable par
        $iban=!empty($_POST['iban']) ? $_POST['iban'] : null;


        Dans mon Ajax ligne 22 j'ai bien mis
        $("#bic").val(result.bic); 
        mais j'obtiens toujours l'erreur "IBAN non valide", ça ne retourne pas le BIC.
        Je ne sais pas d'où provient le problème.
        0
      2. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830 > ananias8686 Messages postés 96 Statut Membre
         
        Dans ton JS tu testes :
        if(result.valid) {
        
        0
  8. ananias8686 Messages postés 96 Statut Membre
     
    Pourriez-vous m'aider un peu plus
    Merci
    0
    1. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830
       
      T'aider un peu plus reviendrait à écrire le code à ta place....

      Regardes ton code JS ..
      Tu as
      if(result.valid) {        
         console.log(result); 
         $("#bic").val(result.bic); 
       } else {
          alert ("IBAN non valide");
       }
      

      Ton "message d'erreur"' est celui la :
      "IBAN non valide"

      Tu vois qu'il apparait dans le ELSE.

      C'est donc que la condition n'est pas la bonne....
      0
      1. ananias8686 Messages postés 96 Statut Membre > jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention  
         
        J'ai mis $("#bic").val(result.bic); dans le else ça marche le Bic s'affiche correctement par contre je ne sais pas pourquoi ce code ne marche pas:
        if(result.valid) {        
           console.log(result); 
           $("#bic").val(result.bic); 
         } else {
            alert ("IBAN non valide");
         }


        Pourriez-vous m'expliquer unpeu
        Merci
        0
      2. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830 > ananias8686 Messages postés 96 Statut Membre
         
        T'es nouille ........
        Je t'ai indiqué que c'était le CONDITION qui n'était pas bonne
        Donc dans le
        if(result.valid) {
        


        Est-ce que, celon toi, dans la réponse de ton ajax tu as un "valid" ??
        La réponse est NON

        C'est là qu'il fallait mettre bic ... mais surtout.. ne pas toucher au else ...
        0
      3. ananias8686 Messages postés 96 Statut Membre > jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention  
         
        Donc normalement
        if(result) {
        		      
        	console.log(result);
        			
        	$("#bic").val(result.bic); 
                    }else{
        	      alert("IBAN non valide") ;
        	        }
        0