Hope is a Dream. Dream is a Hope.

非公開ブログは再開しました。

JqueryからPHPへJSONを渡すには

はい。

ふぃふぃです。

最近javascriptで配列型のデータを扱う機会が増えてきました。

これまでは、特にデータを保管する必要もなかったのですが、

過去データとの比較などをやりたくなってきたので、 サーバにcsv形式で保存する方法を調べておりました。

過去記事にも書きましたがはてな人力検索などで質問をしていると、 どうにも、PHP経由での保存が望ましいとのこと。

PHPAjax初心者ということもありかなりはまってしまったのでメモ。

送信側

$(function(){

    // 送信・保存するためのデータ配列
    var ary_data = new Array(100); //[1,2,3,4,5,6];
    for (var i = 0; i < ary_data.length; i++) {
        ary_data[i]=i;
    }

    // 送るデータ形式はJSONでなければ、PHP側でエラーが出る.のでJSON.stringify()でJSON形式に変換
    send_data= JSON.stringify(ary_data);

        // 送信処理
    $.ajax({
        url: "receive_json_save.php", // 送信先のPHP
        type: "POST", // POSTで送る
        contentType: "Content-Type: application/json; charset=UTF-8",    
//必須ではなさそうだが、サーバ側との整合のために明示しておいた方がよい。
        // dataType: 'json', //受信形式 必須ではなさそうだがサーバ側との整合のために明示しておいた方がよい。
        data:send_data //JSON形式の送信データ
    }).success(function(data, status, xhr) {
        // 通信成功時の処理
        console.log("success");
        console.log("data ="+data);
        console.log("status ="+status);
        console.log("xhr ="+xhr);

    }).error(function(xhr, status, error) {
        // 通信失敗時の処理
        console.log("error");
    }).complete(function(xhr, status) {
        // 通信完了時の処理
        console.log("fin");
    });


})

</script>

受け取り側

<?php

        //-JSONデータの受信処理---------------------------------------------------//
        // file_get_contents()で送信データを受信(JSONの場合はここがミソ。らしい。)
    $json = file_get_contents("php://input");

        // JSON形式データをPHPの配列型に変換
    $data = json_decode($json);

        //-CSVへの保存処理--------------------------------------------------------//

        // CSV形式にするため、配列をカンマで区切り
    $string = implode(",", $data);

        // Debug用。(注意)JSON形式でHTMLへ返答する場合にはコメントアウトしなければいけない。
        // $stringはJSON形式ではないのでヘッダーが違うとerorrになる。(ここではまりました)
    echo "<p>CSVファイルにセットされるデータ:".$string;
    
    $file_name = "001.csv";

    // ファイル保存のおまじない
    $file = fopen($file_name, "w") or die("OPEN error $file_name");
    flock($file, LOCK_EX);
    fputs($file, $string."\n");
    flock($file, LOCK_UN);
    fclose($file);


        //-htmlへの返答する場合。-------------------------------------------------//

        // JSON形式で送信するためのヘッダー。これないとerorrになる。
    header("Content-Type: application/json; charset=utf-8");

        // JSONの書きだし
    print_r($json);

?>

(おまけ)csvを見る

おまけ。これを直接たたけばCSVの中身が見れる。

<?php

    $fname = "001.csv";

    $file = fopen($fname, "r");

    while(!feof($file)){
        echo fgets($file, 100)."<br>";
    }

    fclose($file);
?>

勉強になりました。

助言を頂いた皆様有難うございました。

PHPによるWebアプリケーションスーパーサンプル 第2版

PHPによるWebアプリケーションスーパーサンプル 第2版