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

php, javascript et json

7 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...

7 réponses

Avatar
AlainBUFERNE
Le mardi 29 mars 2016 16:15:37 UTC+2, 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é javascrip t et
non une string à parser...



Au niveau de ton appel au script php qu'indique tu comme type de réponse?
De toute façon une liste d'objet c'est un string il n'y a que du texte da ns les tuyaux http Non ?
Avatar
SAM
Le 29/03/16 16:15, Une Bévue a écrit :
je souhaite transmettre à une page html une valeur en JSON obtenue par php.

le script php :
<?php


(blabla)
echo "var files = " . json_encode($files, JSON_PRETTY_PRINT) . ";n";
?>



et en faisant :

echo "var files = '" . json_encode($files, JSON_PRETTY_PRINT) . "';n";

histoire de bien préciser que le truc est une chaine
????

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
}
];



donc le PHP a bien écrit en mode JS un array contenant 2 objets
il n'y a aucun besoin de traduction jSon !!!

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



on est bien d'accord

ce que je ne comprends pas.



ton :
<script src="truc.ph"></script>
est l'équivalent de :
<script type="javascript">
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>

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



Là si tu ne veux pas d'erreur il faudrait peut-être
alert(JSON.parse("'"+file+"'");

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...



il faudrait savoir exactement ce qu'est sensé fabriquer ce
"JSON_PRETTY_PRINT"



Cordialement,
--
Stéphane Moriaux avec/with iMac-intel 27" & Mac OS X 10.6.8
Avatar
SAM
Le 29/03/16 20:23, AlainBUFERNE a écrit :
Le mardi 29 mars 2016 16:15:37 UTC+2, Une Bévue a écrit :
je souhaite transmettre à une page html une valeur en JSON obtenue par php.

le script php :
<?php




(snip)
echo "var files = " . json_encode($files, JSON_PRETTY_PRINT) . ";n";




(re-snip)
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...



Au niveau de ton appel au script php qu'indique tu comme type de réponse?
De toute façon une liste d'objet c'est un string il n'y a que du texte dans les tuyaux http Non ?



Je ne comprends pas ton intervention ...

on a un appel de fichier en javascript
ce fichier est en fait un PHP qui in fine echoye un code JS en clair du
genre :
var truc = [{un:1,deux:2},{un:11,deux:22}];
si tu estimes que ce tableau est un string ... là on est mal, on est mal !


Cordialement,
--
Stéphane Moriaux avec/with iMac-intel 27" & Mac OS X 10.6.8
Avatar
Une Bévue
Le 31/03/2016 03:23, SAM a écrit :
donc le PHP a bien écrit en mode JS un array contenant 2 objets
il n'y a aucun besoin de traduction jSon !!!



ben oui, merci, j'ai bien compris mais, amha, ce n'est pas conforme aux
specs.

car je fais bien json_encode(...) qui devrait donner une string.

j'ai bien évidemment essayé d'ajouter des "'" là, le JSON.parse, côté
javascript est OK.

mais c'est anormal de faire ça.

en fait, je l'ai déjà vu dans l'autre sens (js -> php) les
json_[en|de]code de php n'est pas vraiment compatible avec le js.

il faut bidouiller...

avec ruby je fais :
JSON.generate(monObjet)

et ça roule côté js (via WebSocket)

j'ai posté aussi sur f.c.l.php, je n'ai qu'une réponse pour l'instant
(de ANtoine Polatouche) mais sans contenu...

par ailleurs je suis à la cambrousse et ça rame velu l'internet à
travers mon gsm en H+
Avatar
Une Bévue
Le 31/03/2016 03:33, SAM a écrit :
ce fichier est en fait un PHP qui in fine echoye un code JS en clair du
genre :
var truc = [{un:1,deux:2},{un:11,deux:22}];


ben non le php est :
var truc = json_encode(monArray);

c'est ça le pb.
Avatar
SAM
Le 31/03/16 14:46, Une Bévue a écrit :
Le 31/03/2016 03:33, SAM a écrit :
ce fichier est en fait un PHP qui in fine echoye un code JS en clair du
genre :
var truc = [{un:1,deux:2},{un:11,deux:22}];


ben non le php est :
var truc = json_encode(monArray);

c'est ça le pb.



Je ne connais rien au PHP (trop de fonctions, trop touffu, toussa)

relis ce que j'ai dit :
j'y parle de ton code qui echo — écrit — (dans un script JS) le résultat
d'une fonction PHP

en outre ce résultat est "amicalement reformaté" (respect d'indentation
et de retours à la ligne, pour compréhension humaine), ce qui n'a aucune
espèce d’intérêt pour passer du code ...

Si tu regardes les exemples donnés tu te rendras compte qu'il n'est en
aucune manière prévu que cette fonction renvoie un string (ou alors ils
est "dé-stringué" par la fonction echo ?)

Cordialement,
--
Stéphane Moriaux avec/with iMac-intel 27" & Mac OS X 10.6.8
Avatar
SAM
Le 31/03/16 14:39, Une Bévue a écrit :
Le 31/03/2016 03:23, SAM a écrit :
donc le PHP a bien écrit en mode JS un array contenant 2 objets
il n'y a aucun besoin de traduction jSon !!!



ben oui, merci, j'ai bien compris mais, amha, ce n'est pas conforme aux
specs.



Je suis allé voir <http://php.net/manual/fr/function.json-encode.php>
... on ne me parle pas de specs (enfin ... j'ai pas vu)
Ha! il y aurait une "nouvelle" RFC !
et ils y disent :
« A JSON value MUST be an object, array, number, or string, »

De toute la manière il y est dit que cette fonction sert à transformer
une instruction "à la PHP" en code jSon (c a d création d'array et
d'objets +/- imbriqués et plus "à la mode JS") (à ce que j'en comprends)

car je fais bien json_encode(...) qui devrait donner une string.



non !
(en tous cas pas comme tu l'entends)
voir leur exemple :

<?php
$arr = array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5);
echo json_encode($arr);
?>

L'exemple ci-dessus va afficher :
{"a":1,"b":2,"c":3,"d":4,"e":5}


c'est à dire du code JS et qui peut être considéré d'entrée de jeu comme
du JSON


j'ai bien évidemment essayé d'ajouter des "'" là, le JSON.parse, côté
javascript est OK.

mais c'est anormal de faire ça.



non
On ne peut "parser" qu'une chaîne.
<https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/JSON/parse>

Google Traduction de parse :
verbe ==> faire l'analyse grammaticale

à la limite, j'imagine que tu dois pouvoir faire :

var truc = typeof file == string ?
JSON.parse(file) :
jSOM.parse(JSON.stringify(file);

Mébon ... autant faire directement :

var truc = (typeof file == string)? JSON.parse(file) : file;

avec ruby je fais :
JSON.generate(monObjet)

et ça roule côté js (via WebSocket)



oui, bon, comme on ne sait pas ce qu'il se passe entre eux ...
(n'y a t-il pas au passage un truc du genre url_encode ?)


JSON : <http://www.json.org/json-fr.html>
côté JS : <http://www.json.org/js.html>
côté PHP : <http://pecl.php.net/package/json>
Support for JSON (JS Object Notation) serialization.
côté Ruby : <http://flori.github.io/json/>

Cordialement,
--
Stéphane Moriaux avec/with iMac-intel 27" & Mac OS X 10.6.8