Kyzend Kyzend - 2 months ago 13
JSON Question

Json encode doesn't work

i want to encode a php array to JSON so i can pass it in a image onclick() as an attribute that's why i need htmlspecialcharts;

And then in the js function im trying to use JSON.parse to convert it to a js object so i can use the data of my array.

But i can't parse it since the syntax i'm getting from encoding is not right

the initial php array is :

array (size=3)
0 => string 'Bleu' (length=4)
1 => int 1
2 => string 'XL' (length=2)


I'm using htmlspecialchars(json_encode()) on it and
the result i need to get is :

jsonTab = '["Bleu",1,"XL"]';


But instead after encoding i get :

Bleu,1,XL


i don't get why the encoding doesn't work right...

code php in wich i create the php array by listing size of each color of the product :

$couleurs = $pdo ->getCouleurProduit($id);
$nbCouleur = count($couleurs);
$t = 1;
foreach ($couleurs as $uneCouleur)
{

$taille = $pdo ->getTaille($id,$uneCouleur[0]); // renvoie les taille de la couleur
$nbTaille = count($taille); // renvoie le bombrede taille n0 = 1


${'couleur'.$t} = array($uneCouleur[0]); // definie une tableaux nomé "couleurx" avec pour premier element le libelle de la couleur
array_push(${'couleur'.$t}, $nbTaille); // ajoute en second element au tableaux "couleurx" le nombre de taille pour la couleur

for ($i = 0; $i < $nbTaille; $i++ ) // tant que i est inferieur au nombre de taille
{
array_push(${'couleur'.$t}, $taille[$i][0]); // on ajoute au tableaux "couleurx" le libelle (a [0]) de chaque taille [i] du tableaux $taille

}
${'cl'.$t} = htmlspecialchars(json_encode(${'couleur'.$t})); //on creer une variable clx qui prend la valeur encoder en json du tableau "couleurx" actuel
$t++;

}$couleurs = $pdo ->getCouleurProduit($id);
$nbCouleur = count($couleurs);
$t = 1;
foreach ($couleurs as $uneCouleur)
{

$taille = $pdo ->getTaille($id,$uneCouleur[0]); // renvoie les taille de la couleur
$nbTaille = count($taille); // renvoie le bombrede taille n0 = 1


${'couleur'.$t} = array($uneCouleur[0]); // definie une tableaux nomé "couleurx" avec pour premier element le libelle de la couleur
array_push(${'couleur'.$t}, $nbTaille); // ajoute en second element au tableaux "couleurx" le nombre de taille pour la couleur

for ($i = 0; $i < $nbTaille; $i++ ) // tant que i est inferieur au nombre de taille
{
array_push(${'couleur'.$t}, $taille[$i][0]); // on ajoute au tableaux "couleurx" le libelle (a [0]) de chaque taille [i] du tableaux $taille

}
${'cl'.$t} = htmlspecialchars(json_encode(${'couleur'.$t})); //on creer une variable clx qui prend la valeur encoder en json du tableau "couleurx" actuel
$t++;

}


img the php array for attribute

$r=1;

foreach ($couleurs as $uneCouleur)
{?>
<img id = "test" src= "./images/<?=${'couleur'.$r}[0]?>.jpg " alt = "lol" onclick="loadTaille(<?php echo ${'cl'.$r} ?>);"/><?php
$r++; //pour chaque couleur du produit on utilise les tableaux couleurx et clx
}?>


And js file produit.js

function loadTaille(img){

// var txt = "'[" + img + "]'";
// var txt = '["Bleu",1,"XL"]';

var tailles = JSON.parse(img);
alert (img)

}

Answer

You haven't posted any code, so it's difficult to say where exactly you're going wrong, however, here is a simple example that works for the values you posted:

$arr = ['Bleu', 1, 'XL'];
echo json_encode($arr);

outputs

["Bleu",1,"XL"]

As an aside, I don't really think you want to use htmlspecialchars() when dynamically generating javascript code. The appropriate context there is not html (unless you're inlining the javascript in an html attribute, which I assume is not the case here).

Update:

Now that I see the code you've posted, I believe you can resolve your syntax error by single-quoting the rendered json string in the javascript context.

Change:

onclick="loadTaille(<?php echo ${'cl'.$r} ?>);"

to:

onclick="loadTaille('<?php echo ${'cl'.$r} ?>');"