Uncaught TypeError: Cannot use 'in' operator to search for 'length' in [Résolu]

Messages postés
984
Date d'inscription
mercredi 12 décembre 2007
Statut
Membre
Dernière intervention
25 septembre 2019
-
Bonjour à tous,

Un code ajax me permet de récupérer selon la zone et le poids, un montant précis.
J'utilise 2 tables, celle de dhl et celle de la poste.

Mon code ajax et la requête pour dhl fonctionne très bien etle résultat est récupéré via ce bout de code :
if($VAL_Table == "tb_shop_prices_dhl") {

	$sql = "SELECT $VAL_Zone FROM $VAL_Table WHERE $VAL_Poids BETWEEN Poids_min AND Poids_max"; 
	try{
		$Stat = $pdo->prepare($sql);
		$Stat->execute();
		$result["success"] = $Stat->fetchAll(PDO::FETCH_ASSOC);
	}
	catch(PDOException $e) {$result["Error"] = "<div class='alert alert-danger'>".$e->getMessage()."</div>";}

}


Quant à la condition de la poste, c'est plusieurs requêtes et le résultat n'est pas tiré de la requête mais d'une valeur $Poids_final que j'appel ainsi :
try{
[...]
$result["success"] = $Poids_final;
}catch(PDOException $e){echo "<div class='alert alert-danger'>".$e->getMessage()."</div>";}

Seulement à cette étape, j'ai une erreur : Uncaught TypeError: Cannot use 'in' operator to search for 'length' in

Voici mon code ajax complet :
function Montant_Livraison() {
 var VAL_Poids   = $('#VAL_Poids').val();
 var VAL_Livraison  = $('#VAL_Livraison').val();
 var VAL_Zone   = $('#VAL_Zone').val();
 var VAL_Lieu  = $('#VAL_Lieu').val();
 var VAL_Table;

 switch (VAL_Livraison) {
  case "SIVOP" : VAL_Table = null; break;
  case "EXPRESS" : VAL_Table = "tb_shop_prices_laposte"; break;
  case "LA POSTE" : VAL_Table = "tb_shop_prices_laposte"; break;
  case "DHL"  : VAL_Table = "tb_shop_prices_dhl"; break;
  default   : VAL_Table = null; break;

 }
 
 var data = {VAL_Table:VAL_Table, VAL_Poids:VAL_Poids, VAL_Livraison:VAL_Livraison, VAL_Zone:VAL_Zone, VAL_Lieu:VAL_Lieu};

 $.ajax({
    type: "POST",
    url: "_montant_livraison.php",
    cache: false,
    data: data,
    async: true,
    dataType: "json"
   })

 .done(function(reponse) {

 var erreur = typeof(reponse.Error) != 'undefined' ? reponse.Error : null;
 var result = typeof(reponse.success) != 'undefined' ? reponse.success : null;

 if (!erreur) {
 if (result != null) {
 console.log('Resultat', result);

var TAX = ""
var Poids = "";

 $.each(result, function(i, vx) {
 $.each(vx, function(colonne, valeur) {

var Taux = Number(<?php echo $MNY_Taux; ?>);
var Pays = document.getElementById("VAL_Lieu").value;

 });
 });

$("#RCP_Frais").html("<?php echo ": ".$MNY_Symbole." "; ?>" + Poids);
$("#VAL_Transport").val(Poids);

}

if (result == null) {
var Poids = "0";

$("#RCP_Frais").html("<?php echo ": ".$MNY_Symbole." "; ?>" + Poids);
$("#VAL_Transport").val(Poids);

}

document.getElementById("Montant_Transport").innerHTML = document.getElementById("VAL_Devise").value + " " + document.getElementById("VAL_Transport").value;

} else {alert('Erreur AJAX !');console.log('Erreur', erreur);}})
.fail(function(jqXHR, textStatus) {console.log('Ajax error :', jqXHR, textStatus);alert('Erreur AJAX !');});

}

et mon code php sur _montant_livraison.php :
$VAL_Table   = !empty($_POST["VAL_Table"])   ? $_POST["VAL_Table"]: NULL;
$VAL_Poids   = !empty($_POST["VAL_Poids"])   ? $_POST["VAL_Poids"]: NULL;
$VAL_Livraison  = !empty($_POST['VAL_Livraison'])  ? $_POST['VAL_Livraison']: NULL;
$VAL_Zone   = !empty($_POST["VAL_Zone"])   ? $_POST["VAL_Zone"]: NULL;
$VAL_Lieu   = !empty($_POST["VAL_Lieu"])   ? $_POST["VAL_Lieu"]: NULL;

$result = array();

if($VAL_Table == "tb_shop_prices_dhl") {

[...dhl...]

}

if($VAL_Table == "tb_shop_prices_laposte") {

try{
[...code et conditions if pour la poste...]

 $result["success"]   = $Poids_final;

}catch(PDOException $e){echo "<div class='alert alert-danger'>".$e->getMessage()."</div>";}

}

echo json_encode($result);
exit();


J'ai remarqué que même si je supprime tout le code du contenu de la poste et change la variable $Poids_final en valeur fixe, j'obtiens la même erreur...

Avez-vous une idée ? et merci de votre aide.

Cordialement

Configuration: Windows / Chrome 76.0.3809.132
Afficher la suite 

5 réponses

Messages postés
26497
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
14 octobre 2019
1825
0
Merci
Quel est le message d'erreur complet?
Sur quelle ligne de code ?
Que contient ta requête ajax lorsque tu regardes dans la console ?
Que t'affichent tes différents console.log ?

Ton souci vient du php ou du js ?


Cordialement, 
Jordane                                                                 
Commenter la réponse de jordane45
Messages postés
984
Date d'inscription
mercredi 12 décembre 2007
Statut
Membre
Dernière intervention
25 septembre 2019
13
0
Merci
Voici le message complet :

sur la ligne indiquée de la console.

Dans les consoles, je vois le montant (1182150) exact et correct, mais rien ne s'affiche dans ma div et j’obtiens ce message d'erreur.

D'où vient cette erreur ? Je penses après mes tests que c'est la ligne $result["success"] = $Poids_final;
Commenter la réponse de Sinistrus
Messages postés
26497
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
14 octobre 2019
1825
0
Merci
Tu essais de faire un each sur une variable qui n'est pas un array... donc.. normal....
Commenter la réponse de jordane45
Messages postés
984
Date d'inscription
mercredi 12 décembre 2007
Statut
Membre
Dernière intervention
25 septembre 2019
13
0
Merci
Merci Jordane,

J'ai essayé de mettre la valeur dans un array :
$result["success"] = array("Poids_final" => $Poids_final);

Mais ça ne marche toujours pas... tu peux m'aider d'avantage stp ?
jordane45
Messages postés
26497
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
14 octobre 2019
1825 -
$.ajax({
    type: "POST",
    url: "_montant_livraison.php",
    cache: false,
    data: data,
    async: true,
    dataType: "json"
   }).done(function(reponse) {
      var erreur = typeof(reponse.Error) != 'undefined' ? reponse.Error : null;
      var result = typeof(reponse.success) != 'undefined' ? reponse.success : null;
      if (!erreur) {
        if (result) {
          console.log('Resultat', result);
          var TAX = ""
          var Poids = "";
          var Taux = Number('<?php echo $MNY_Taux; ?>');
          var Pays = $("#VAL_Lieu").val();
          if(result.length){
            $.each(result, function(i, vx) {
              console.log("each Result",i,vx);
              Poids += parseFloat(vx.Poids_final);
            });
            $("#RCP_Frais").html("<?php echo ": ".$MNY_Symbole." "; ?>" + Poids);
            $("#VAL_Transport").val(Poids);
          }
        }
        if (result == null) {
          var Poids = "0";
          $("#RCP_Frais").html("<?php echo ": ".$MNY_Symbole." "; ?>" + Poids);
          $("#VAL_Transport").val(Poids);
        }
        document.getElementById("Montant_Transport").innerHTML = document.getElementById("VAL_Devise").value + " " + document.getElementById("VAL_Transport").value;
      } else {
        alert('Erreur AJAX !');
        console.log('Erreur', erreur);
      }
  }).fail(function(jqXHR, textStatus) {
    console.log('Ajax error :', jqXHR, textStatus);
    alert('Erreur AJAX !');
  });

}
Sinistrus
Messages postés
984
Date d'inscription
mercredi 12 décembre 2007
Statut
Membre
Dernière intervention
25 septembre 2019
13 -
Salut Jordane,

Pour une fois tu me donne un code fini sans //explications :D
J'ai fais un copier coller de ton code, il ne m'affiche plus d'erreurs mais ne récupère pas la valeur dans ma div...

Je remarque surtout cette ligne :
if(result.length){
$.each(result, function(i, vx) {
console.log("each Result",i,vx);
Poids += parseFloat(vx.Poids_final);
});
$("#RCP_Frais").html("<?php echo ": ".$MNY_Symbole." "; ?>" + Poids);
$("#VAL_Transport").val(Poids);
}
où lenght me rappel mon code d'erreur...
Bon j'avoue que je ne comprends pas trop sa place et ce qu'il fait...

Deuxièmement, est-il possible, dans mon cas, de ne pas toucher au code ajax et juste de mettre
$result["success"]
dans un array ?
jordane45
Messages postés
26497
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
14 octobre 2019
1825 -
J'ai surtout mis des console.log ... jr m'attend à ce que tu nous montres ce que ca t'affiche
Sinistrus
Messages postés
984
Date d'inscription
mercredi 12 décembre 2007
Statut
Membre
Dernière intervention
25 septembre 2019
13 -
ca affiche dans la console :
Resultat 1234450

c'est tout...
J'ai essayé de garder mon même code initial sans changer l'ajax mais ajouter une table virtuelle qui sauvegardera les données souhaitées, puis de faire un

 $sql = "SELECT Montant FROM tb_shop_prices_laposte_virtuel WHERE Reference = '".$VAL_Handle."' ";
try{
$Stat = $pdo->prepare($sql);
$Stat->execute();
$result["success"] = $Stat->fetchAll(PDO::FETCH_ASSOC);
}
afin de récupérer dans un tableau la valeur souhaitée.

Dans ce cas précis j'obtiens la même réponse que mon code pour DHL :

Montant : "1234450" pour la poste
Zone3: "9300" pour DHL

J'aurais préféré éviter toute cette gymnastique et récupérer juste
$result["success"] = $Poids_final;
dans ce même principe.
jordane45
Messages postés
26497
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
14 octobre 2019
1825 -
Attends..
Tu avais marqué juste avant

J'ai essayé de mettre la valeur dans un array :
$result["success"] = array("Poids_final" => $Poids_final);


Mais tu as retiré ton array .... sinon la console nafficherait pas ce que tu me dis.
De plus.. pense bien à vider ton cache lorsque tu modifies du code js.
Commenter la réponse de Sinistrus
Messages postés
984
Date d'inscription
mercredi 12 décembre 2007
Statut
Membre
Dernière intervention
25 septembre 2019
13
0
Merci
Bonjour Jordane,

J'ai contourné le problème en conservant mon même code ajax et php.
J'avais compris que mon problème vient du fait que la valeur récupérée n'était pas un tableau...
Je me suis donc inspiré de ma première condition (celle de DHL) et j'ai donc créé une table virtuelle qui recevra les données (de la poste) dans un tableau.

Je m'explique:
L'objectif, étant de mettre une valeur ($result["success"] = $Poids_final;) dans un tableau, j'ai fais ceci:
try {
    $AD = $pdo - > prepare("INSERT INTO tb_shop_prices_laposte_virtuel (Zone, Montant, NIC_Handle) VALUES (:VAL_Zone, :Poids_final, :VAL_Handle)");
    $AD - > execute(array(
        "VAL_Zone" => $VAL_Zone,
        "Poids_final" => $Poids_final,
        "VAL_Handle" => $VAL_Handle
    ));

    $sql = "SELECT Montant FROM tb_shop_prices_laposte_virtuel WHERE NIC_Handle = '".$VAL_Handle.
    "' ";
    //Récupère le montant total a afficher
    $Stat = $pdo - > prepare($sql);
    $Stat - > execute();
    $result["success"] = $Stat - > fetchAll(PDO::FETCH_ASSOC);
    //$result["success"] 		= $Poids_final;

    $SUP = $pdo - > exec("DELETE FROM tb_shop_prices_laposte_virtuel WHERE NIC_Handle='".$VAL_Handle.
        "' ");
} catch (PDOException $e) {
    echo "<div class='alert alert-warning'>".$e - > getMessage().
    "</div>";
    die();
}


Tu me diras que c'est archaique, je sais, mais c'est la seule solution que j'ai pu trouver pour transformer ma valeur en tableau et de pouvoir la récupérer comme le montre l'image de mon poste précédent.
Je précise que la partie de DHL utilise aussi une requête pour afficher le résultat... si je devais modifier l'ajax, je me perdrais étant donné que je ne maîtrise pas ce language.

Au final, voici mon code complet, je ne sais pas si tu peux me conseiller/recommander d'avantage :

AJAX:
function Montant_Livraison() {
    var VAL_Poids = $('#VAL_Poids').val();
    var VAL_Livraison = $('#VAL_Livraison').val();
    var VAL_Zone = $('#VAL_Zone').val();
    var VAL_Lieu = $('#VAL_Lieu').val();
    var VAL_Handle = "<?php echo $_SESSION_NICHANDLE; ?>";

    var VAL_Table;
    switch (VAL_Livraison) {
        case "SIVOP":
            VAL_Table = null;
            break;
        case "EXPRESS":
            VAL_Table = "tb_shop_prices_laposte";
            break;
        case "LA POSTE":
            VAL_Table = "tb_shop_prices_laposte";
            break;
        case "DHL":
            VAL_Table = "tb_shop_prices_dhl";
            break;

        default:
            VAL_Table = null;
            break;

    }

    var data = {
        VAL_Poids: VAL_Poids,
        VAL_Livraison: VAL_Livraison,
        VAL_Table: VAL_Table,
        VAL_Zone: VAL_Zone,
        VAL_Lieu: VAL_Lieu,
        VAL_Handle: VAL_Handle
    };

    $.ajax({
            type: "POST",
            url: "_montant_livraison.php",
            cache: false,
            data: data,
            async: true,
            dataType: "json"
        })

        .done(function(reponse) {
            var erreur = typeof(reponse.Error) != 'undefined' ? reponse.Error : null;
            var result = typeof(reponse.success) != 'undefined' ? reponse.success : null;

            if (!erreur) {
                if (result != null) {
                    console.log('Resultat', result);

                    var TAX = ""
                    var Poids = "";

                    $.each(result, function(i, vx) {
                        $.each(vx, function(colonne, valeur) {

                            var Taux = Number( < ? php echo $MNY_Taux; ? > );
                            var Pays = document.getElementById("VAL_Lieu").value;

                        });
                    });

                    $("#RCP_Frais").html("<?php echo ": ".$MNY_Symbole."
                        "; ?>" + Poids);
                    $("#VAL_Transport").val(Poids);
                }

                // ajouté pour le cas de SIVOP
                if (result == null) {
                    var Poids = "0";

                    $("#RCP_Frais").html("<?php echo ": ".$MNY_Symbole."
                        "; ?>" + Poids);
                    $("#VAL_Transport").val(Poids);

                }

                var transp = document.getElementById("VAL_Transport").value;
                var devise = document.getElementById("VAL_Devise").value;
                $("#Montant_Transport").html(devise + " " + transp);

            } else {
                alert('Erreur AJAX !');
                console.log('Erreur', erreur);
            }
        })
        .fail(function(jqXHR, textStatus) {
            console.log('Ajax error :', jqXHR, textStatus);
            alert('Erreur AJAX !');
        });

}


PHP:
$VAL_Table = !empty($_POST["VAL_Table"]) ? $_POST["VAL_Table"] : NULL;
$VAL_Poids = !empty($_POST["VAL_Poids"]) ? $_POST["VAL_Poids"] : NULL;
$VAL_Livraison = !empty($_POST['VAL_Livraison']) ? $_POST['VAL_Livraison'] : NULL;
$VAL_Zone = !empty($_POST["VAL_Zone"]) ? $_POST["VAL_Zone"] : NULL;
$VAL_Lieu = !empty($_POST["VAL_Lieu"]) ? $_POST["VAL_Lieu"] : NULL;
$VAL_Handle = !empty($_POST["VAL_Handle"]) ? $_POST["VAL_Handle"] : NULL;

$result = array();

if ($VAL_Table == "tb_shop_prices_dhl") {

    $sql = "SELECT $VAL_Zone FROM $VAL_Table WHERE $VAL_Poids BETWEEN Poids_min AND Poids_max";
    try {
        $Stat = $pdo - > prepare($sql);
        $Stat - > execute();
        $result["success"] = $Stat - > fetchAll(PDO::FETCH_ASSOC);
    } catch (PDOException $e) {
        $result["Error"] = "<div class='alert alert-danger'>".$e - > getMessage().
        "</div>";
    }

}


if ($VAL_Table == "tb_shop_prices_laposte") {
    [...]
    //$result["success"] = $Poids_final;

    try {
        $AD = $pdo - > prepare("INSERT INTO tb_shop_prices_laposte_virtuel (Zone, Montant, NIC_Handle) VALUES (:VAL_Zone, :Poids_final, :VAL_Handle)");
        $AD - > execute(array(
            "VAL_Zone" => $VAL_Zone,
            "Poids_final" => $Poids_final,
            "VAL_Handle" => $VAL_Handle
        ));

        $sql = "SELECT Montant FROM tb_shop_prices_laposte_virtuel WHERE NIC_Handle = '".$VAL_Handle.
        "' ";
        $Stat = $pdo - > prepare($sql);
        $Stat - > execute();
        $result["success"] = $Stat - > fetchAll(PDO::FETCH_ASSOC);

        $SUP = $pdo - > exec("DELETE FROM tb_shop_prices_laposte_virtuel WHERE NIC_Handle='".$VAL_Handle.
            "' ");
    } catch (PDOException $e) {
        echo "<div class='alert alert-warning'>".$e - > getMessage().
        "</div>";
        die();
    }

}

echo json_encode($result);
exit();
Commenter la réponse de Sinistrus