Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

php, javascript et json

4 réponses
Avatar
Une Bévue
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...

4 réponses

Avatar
Antoine Polatouche
Le 29/03/2016 16:17, Une Bévue a écrit :
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...


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 ;)
Avatar
Une Bévue
Le 31/03/2016 03:38, Antoine Polatouche a écrit :
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.
Avatar
Olivier Miakinen
Le 08/04/2016 07:05, Une Bévue a écrit :
Le 31/03/2016 03:38, Antoine Polatouche a écrit :
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),



Oui.

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.

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.

ç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
Avatar
Une Bévue
Le 08/04/2016 12:43, Olivier Miakinen a écrit :
Mais si, c'est une chaîne pour PHP.

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


Essayons avec d'autres exemples.



OK, pigé, le truc, merci pour ces deux exemples !