9276


jQueryを使用せず、JavaScriptとPHPだけでJSONPの挙動を確認したいのですが…

▼index.html

[code]

    function check(arg) {
      var script = document.createElement('script');
      script.type = "text/javascript"; 
      script.src = 'hoge.php?arg='+arg;
      document.body.appendChild(script);
    }
    function callback(last) {
      console.log(last)
    }
    
[/code]

▼hoge.php

[code]

    $arg = ($_GET['arg']);
    print "callback($arg);";
    
[/code]

このとき、引数を数字にすると問題ないのですが、文字列へ変更するとエラーになります  
・check(9); … 〇  
・check('沖縄'); … ×

・どう修正すればよいでしょうか？  
・JSONPではなく、エスケープの問題？


CC BY-SA 3.0
2015-04-17T11:30:09.480
9266
2015-04-17T16:32:30.380
7886
question
javascript
JavaScript と PHP だけで JSONP の挙動を確認したいのですが…


hoge.php 内の$argが文字列として扱われていないため、それぞれ展開後のjavascriptのコードが下記になります。

[code]

    // check(9)
    callback(9);
    // check('沖縄')
    callback(沖縄) // もちろん沖縄という変数が定義されていないのでエラー
    
[/code]

なので、php側のprintを下記の様に修正することで解決します。

[code]

    $arg = ($_GET['arg']);
    print "callback(\"$arg\");";
    
[/code]

また、実際引数にダブルクオートなどが含まれているとphp側でシンタックスエラーとなるので、`htmlspecialchars`などを使って対策して下さい。


CC BY-SA 3.0
2015-04-17T13:05:10.510
9270
2015-04-17T13:05:10.510
9366
9266
answer


PHPで `"なんとか $hoge かんとか"` といった感じで変数の値を埋め込む場合、自動的に引用符で囲まれる、といったことはありません。もし
`callback('沖縄')` という形に展開したいのであれば、自分で引用符で囲む必要があります。

が、JSONPということですし `json_encode()` を使ってはいかがでしょう。

[code]

    $arg = json_encode($_GET['arg']);
    print "callback($arg)";
    
[/code]

なお `$_GET` に含まれる値は全て文字列になっているので、もし数値を数値としてJSONにエンコード、コールバック関数に渡したいのであれば、
[`is_numeric()` 等で判別して数値に変換する](http://php.net/manual/ja/function.is-
numeric.php#107326)といった処理が必要になります。


CC BY-SA 3.0
2015-04-17T16:32:30.380
9276
2015-04-17T16:32:30.380
8000
9266
answer