PHP は知らないのでハズレかもしれませんが・・・
JSON文字列は返っているようですが、返ってきた文字列がqで囲まれて
セキュリティ対策で JSON 応答が "q" でラップされているということはないでしょうか?
JSON サービスの脆弱性(JSON 配列は JavaScript として有効)に起因する XSS 対策として、ASP.NET の Web サービスの JSON 応答は .NET 3.5 から "d" でラップされるようになりました。WCF も同様です。
それと同様な話ということはないでしょうか?
ASP.NET Web サービスで jQuery ajax を使う場合は、そのラップを外すコーディングを追加する必要があります。例えば "d" でラップされる場合は以下のようになります。
success: function (data) {
if (data.hasOwnProperty('d')) {
data = data.d;
}
// data の処置
}
ハズレでしたらすみません。もし、上記の話の詳しい説明に興味がありましたら以下の記事を見てください。
jQuery AJAX と Web サービス
http://surferonwww.info/BlogEngine/post/2011/06/04/jQuery-AJAX-and-Web-Service.aspx
WCF と jQuery AJAX
http://surferonwww.info/BlogEngine/post/2015/10/15/wcf-and-jquery-ajax.aspx
【2018/3/21 13:20 追記】
質問に対する 2018/03/21 12:33 の私のコメントで「サーバー側は今の実装のまま、即ち JSONP としたいということであれば、jQuery ajax のコードに若干の変更をすれば解決できると思います。それを回答欄に追記しておきます」と書きましたが、それを以下に書きます。
JSONP でコールバック名が q すなわち q( ... JSON 文字列 ... ) という応答が返ってくる場合(コールバック名は q で固定と理解)、jQuery ajax のパラメータを以下のようにします。
$.ajax({
url: xxxx,
dataType: 'jsonp',
jsonp: false,
jsonpCallback: 'q'
}).done(function (result) {
・・・以下略・・・
xxxx は要求先の URL です。
dataType: 'jsonp'
とすると、jQuery.ajax を呼び出した時点で script タグを生成し DOM ツリーへ追加してくれます。(script タグを生成して DOM ツリーに追加するためのスクリプトを自力で書く必要はありません)
コールバック名を q とする、すなわち q( ... JSON 文字列 ... ) という応答が返ってくる場合は jsonp: false, jsonpCallback: 'q'
と設定します。
応答が返ってくるとコールバックが呼び出され、コールバックの引数に設定された JSON 文字列が JavaScript オブジェクトにパースされ、done(function (result) { ...
の result に渡されます。