Discussion:
php, javascript et json
(trop ancien pour répondre)
Une Bévue
2016-03-29 14:17:33 UTC
Permalink
je souhaite transmettre à une page html une valeur en JSON obtenue par php.

le script php :
<?php
header('Content-Type: application/javascript');
function getVideoSize($file) {
$size = shell_exec("/usr/local/bin/exiftool -ImageSize $file");
$sizes = split(', ', preg_replace('/Image Size : (\d+)x(\d+)\s+/',
'$1, $2', $size), 2);
return ['src' => str_replace('/Users/yt/Sites', '', $file), 'width'
=> intval($sizes[0]), 'height' => intval($sizes[1])];
}
$dir = '/Users/yt/Sites/Videos/videos/';
$allowed_ext = array(".mp4", ".ogv", ".webm");
$files = [];
if ($handle = opendir($dir)) {
while (false !== ($file = readdir($handle)))
{
$file_lc = strtolower($file);
$ext = strrchr($file_lc, '.');
if (in_array($ext,$allowed_ext)) {
$files[] = getVideoSize($dir . $file);
}
}
closedir($handle);
}
echo "var files = " . json_encode($files, JSON_PRETTY_PRINT) . ";\n";
?>


si je regarde au navigateur directement la sortie de mon script php,
j'obtiens :

var files = [
{
"src": "\/Videos\/videos\/2015_03_20__18_58_47__MVI_2218.MP4",
"width": 640,
"height": 480
},
{
"src": "\/Videos\/videos\/2015_03_20__18_58_47__MVI_2218.webm",
"width": 640,
"height": 480
}
];

ce script est appellé, côté html, par :
<script src='/Videos/php/browse.php'></script>


maintenant, si je regarde le résultat obtenu, càd la variable "files"
par le javascript :

console.log("files = " + files);
donne :
files = [object Object],[object Object]

console.log("typeof files = " + typeof files);
donne :
typeof files = object

console.dir(files);
donne :
Array[2]
0: Object
height: 480
src: "/Videos/videos/2015_03_20__18_58_47__MVI_2218.MP4"
width: 640
1: Object
height: 480
src: "/Videos/videos/2015_03_20__18_58_47__MVI_2218.webm"
width: 640


càd que j'obtiens directement une array d'objets en javascript, sans
passer par JSON.parse, ce que je ne comprends pas.

d'ai lleurs, si j'essaie de parser le json par :
var truc = JSON.parse(files);
, j'obtiens une erreur :

VM5602:1 Uncaught SyntaxError: Unexpected token o


donc, en résumé, je ne comprends pas pourquoi avec
json_encode côté php, j'obtiens une liste d'objets côté javascript et
non une string à parser...
Antoine Polatouche
2016-03-31 01:38:24 UTC
Permalink
Post by Une Bévue
je souhaite transmettre à une page html une valeur en JSON obtenue par php.
<?php
header('Content-Type: application/javascript');
function getVideoSize($file) {
$size = shell_exec("/usr/local/bin/exiftool -ImageSize $file");
(\d+)x(\d+)\s+/', '$1, $2', $size), 2);
return ['src' => str_replace('/Users/yt/Sites', '', $file),
'width' => intval($sizes[0]), 'height' => intval($sizes[1])];
}
$dir = '/Users/yt/Sites/Videos/videos/';
$allowed_ext = array(".mp4", ".ogv", ".webm");
$files = [];
if ($handle = opendir($dir)) {
while (false !== ($file = readdir($handle)))
{
$file_lc = strtolower($file);
$ext = strrchr($file_lc, '.');
if (in_array($ext,$allowed_ext)) {
$files[] = getVideoSize($dir . $file);
}
}
closedir($handle);
}
echo "var files = " . json_encode($files, JSON_PRETTY_PRINT) . ";\n";
?>
si je regarde au navigateur directement la sortie de mon script php,
var files = [
{
"src": "\/Videos\/videos\/2015_03_20__18_58_47__MVI_2218.MP4",
"width": 640,
"height": 480
},
{
"src": "\/Videos\/videos\/2015_03_20__18_58_47__MVI_2218.webm",
"width": 640,
"height": 480
}
];
<script src='/Videos/php/browse.php'></script>
maintenant, si je regarde le résultat obtenu, càd la variable "files"
console.log("files = " + files);
files = [object Object],[object Object]
console.log("typeof files = " + typeof files);
typeof files = object
console.dir(files);
Array[2]
0: Object
height: 480
src: "/Videos/videos/2015_03_20__18_58_47__MVI_2218.MP4"
width: 640
1: Object
height: 480
src: "/Videos/videos/2015_03_20__18_58_47__MVI_2218.webm"
width: 640
càd que j'obtiens directement une array d'objets en javascript, sans
passer par JSON.parse, ce que je ne comprends pas.
var truc = JSON.parse(files);
VM5602:1 Uncaught SyntaxError: Unexpected token o
donc, en résumé, je ne comprends pas pourquoi avec
json_encode côté php, j'obtiens une liste d'objets côté javascript et
non une string à parser...
Bonjour,

avec json_encode côté php tu crées une chaîne contenant du texte au
format json.
Quand du coté php tu concatènes "var files = " avec cette chaîne, tu
obtiens une chaîne contenant du texte javascript.

Quand du coté html tu écris <script src='/Videos/php/browse.php'></script>
tu insères ce code javascript dans le html.

Quand tu utilises la variable files ainsi déclarée, tu as un objet
javascript, et c'est normal : la chaine retournée par le php devient du
code javascript dans le html et tu te retrouves avec un truc du genre:
var obj = [{},{}];
et pas
var str = "[{},{}]" ;

C'est ce que tu retournes de ton php.

JSON.parse() prend une chaîne comme argument, pas un objet.
Si tu veux parser ton json tu peux retourner une variable chaîne en faisant:
echo "var files = ' " . json_encode($files, JSON_PRETTY_PRINT) . "
';\n"; // j'ai laissé des espace pour voir les quotes
alors files sera une chaîne que tu pourras parser, mais je ne vois pas
le problème à généré l'objet files directement...

J'espère m'être fait comprendre, la distinction entre code et texte
n'est pas toujours évidente ;)
Une Bévue
2016-04-08 05:05:55 UTC
Permalink
Post by Antoine Polatouche
J'espère m'être fait comprendre, la distinction entre code et texte
n'est pas toujours évidente;)
ben oui, d'autant que pour moi, le :
echo "var files = " . json_encode($files, JSON_PRETTY_PRINT) . ";\n";

fait équivaloir, côté js, la variable "files" au json_encode($files,
JSON_PRETTY_PRINT), càd du texte...

euh, ça veut quand même dire que, côté php, json_encode(...) ne retourne
pas une chaine ???

ça n'est toujours pas vraiment clair pour moi.

même si j'ai trouvé une solution (utiliser la variable "files" telle
qu'elle est).

merci beaucoup pour votre patience.
Olivier Miakinen
2016-04-08 10:43:24 UTC
Permalink
Post by Une Bévue
Post by Antoine Polatouche
J'espère m'être fait comprendre, la distinction entre code et texte
n'est pas toujours évidente;)
echo "var files = " . json_encode($files, JSON_PRETTY_PRINT) . ";\n";
fait équivaloir, côté js, la variable "files" au json_encode($files,
JSON_PRETTY_PRINT),
Oui.
Post by Une Bévue
càd du texte...
Tu veux dire une chaîne de caractères ? C'en est une pour PHP, ce
qui lui permet de la concaténer avec la chaîne "var files = " et de
l'afficher avec echo. Une fois affichée avec echo, ce ne sera pas
une chaîne pour JavaScript.
Post by Une Bévue
euh, ça veut quand même dire que, côté php, json_encode(...) ne retourne
pas une chaine ???
Mais si, c'est une chaîne pour PHP.
Post by Une Bévue
ça n'est toujours pas vraiment clair pour moi.
Essayons avec d'autres exemples.

================================================
Exemple 1.

côté PHP :
echo "var nombre = " . "42" . "\n";
("42" est bien une chaîne pour PHP)

côté JavaScript :
var nombre = 42
(42 n'est pas une chaîne pour JavaScript)

================================================
Exemple 2.

côté PHP :
echo "var str = " . "\"" . "42" . "\"" . "\n";
("42" est toujours une chaîne pour PHP)

côté JavaScript :
var str = "42"
(il a fallu rajouter des « " » pour obtenir "42")

================================================

Cordialement,
--
Olivier Miakinen

« Au fond, diviser par zéro revient à unifier la Mécanique Quantique
et la Relativité Générale. » -- M.A. le 7/3/2016 dans fr.sci.maths
Une Bévue
2016-04-08 11:49:43 UTC
Permalink
Post by Olivier Miakinen
Mais si, c'est une chaîne pour PHP.
Post by Une Bévue
ça n'est toujours pas vraiment clair pour moi.
Essayons avec d'autres exemples.
OK, pigé, le truc, merci pour ces deux exemples !

Continuer la lecture sur narkive:
Loading...