質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

3020閲覧

GASからPOSTされたjsonデータを、PHPに送信し、データベースに書き込みたいです。

unwind

総合スコア19

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2021/08/11 05:19

編集2021/08/12 01:13

前提条件・実現したいこと

スプレッドシートに下記のようなデータがあります。

ID日付名前出席
iddatenameattend
12021/07/01立花FALSE
22021/07/02TRUE
32021/07/03FALSE
42021/07/04桔梗TRUE
52021/07/05FALSE

また、MYSQLには、下記のようなデータがあります

iddatenameattend
12021/07/11テストFALSE
22021/07/12testTRUE
32021/07/13ファイルFALSE
42021/07/14fileTRUE
52021/07/15書き込みFALSE

スプレッドシートのデータをUrlFetchApp.fetch関数を用いてPHPにJSON形式のデータとして、値を渡します。
PHPにJSON形式で値を渡して、MySQLに書き込みます。

問題点

GASからPHPに、jsonデータはわたっていますが、MYSQLの方に書き込みされていません。

ソース

test.gs

GAS

1//データ取得 2function getData() { 3 //データ取得するシート(現在開いているシートを指定) 4 var sheet = SpreadsheetApp.getActiveSheet(); 5 6 //行(横軸)と列(縦軸)の最大数を取得 7 var maxRow = sheet.getLastRow(); 8 var maxColumn = sheet.getLastColumn(); 9 10 //JSON用のkey 11 var keys = []; 12 13 //データ格納配列 14 var data = []; 15 16 //2行目のkeyの名前取得 17 //1行目は管理しやすいよう日本語で記述し、 18 //JSON用のラベルは2行目で指定しているため 19 //【getRange】の第1引数は【2】 20 for (var x = 1; x <= maxColumn; x++) { 21 keys.push(sheet.getRange(2, x).getValue()); 22 } 23 24 //データの取得 25 //実際のデータが3行目からなので【y = 3】から開始 26 //getRange()を使って、3行目1セル ~ 最終行目の最終セルを範囲指定 27 var _values = sheet.getRange(3, 1, maxRow, maxColumn).getValues(); 28 29 for(var i = 0; i < _values.length - 2 ; i++){ 30 var json = {}; 31 for (var k = 0; k < _values[i].length; k++) { 32 json[keys[k]] = _values[i][k]; 33 } 34 data.push(json); 35 } 36 37 console.log(data); 38 39 //オプションに入れる 40 var options = { 41 'method' : 'POST', 42 'Content-Type' : 'application/json', 43 'payload' : JSON.stringify(data) 44 }; 45 var response = UrlFetchApp.fetch('test_index.phpp', options); 46 console.log(JSON.stringify(data)); 47 return response; 48}

test_index.php

PHP

1<?php 2 3 function console_log($data) 4 { 5 echo '<script>'; 6 echo 'console.log(' . json_encode($data) . ')'; 7 echo '</script>'; 8 } 9 10 require("./mysql_control.php"); 11 12 $dbh = new PDO( 13 $dsn, 14 $db_user, 15 $db_password, 16 array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET CHARACTER SET `utf8`") 17 ); 18 19 $json_string = file_get_contents('php://input'); 20 $oJson = json_decode($json_string, true); 21 $date = $oJson->date; 22 $name = $oJson->name; 23 $attend = $oJson->attend; 24 25 $log = $date . "\n" . $name . "\n" . $attend . "\n"; 26 console_log($log); 27 28 file_put_contents( "data.json", json_encode($oJson, JSON_UNESCAPED_UNICODE)); 29 30 if($date != "" || $name != "" || $attend != ""){ 31 $sql = 'INSERT IGNORE INTO commute ( 32 `date`, 33 `name`, 34 `attend`) VALUES (:date, :name, :attend)'; 35 36 $stmt = $dbh->prepare($sql); 37 $stmt->bindParam(':date', $date, PDO::PARAM_STR); 38 $stmt->bindParam(':name', $name, PDO::PARAM_STR); 39 $stmt->bindParam(':attend', $attend, PDO::PARAM_BOOL); 40 41 $dbh->beginTransaction(); 42 foreach($oJson as $datum){ 43 $date = $datum['date']; 44 $name = $datum['name']; 45 $attend = $datum['attend']; 46 $stmt->execute(); 47 } 48 49 $dbh->commit(); 50 51 } 52 53 ?>

試したこと

PHP

1 $sql = 'INSERT IGNORE INTO commute ( 2 `date`, 3 `name`, 4 `attend`) VALUES (:date, :name, :attend)'; 5 6 $stmt = $dbh->prepare($sql); 7 8 $dbh->beginTransaction(); 9 foreach($oJson as $datum){ 10 $stmt->bindValue(':date', $datum['date'], PDO::PARAM_INT); 11 $stmt->bindValue(':name', $datum['name'], PDO::PARAM_INT); 12 $stmt->bindValue(':attend', $datum['attend'], PDO::PARAM_INT); 13 $stmt->execute(); 14 }

bindParamのところをbindValueのパターンに変えてみても、MySQLの書き込みは出来ませんでした。
GASからスプレッドシートのデータをJSON形式でtest_index.phpにPOSTし、JSON形式のデータをMySQLに書き込みたいです。
皆様方のお力をお借りできればと思います。

hentaiman様からご指摘を頂いたソースでjsonが確認できたとされるところ

test.gs

gas

1 //オプションに入れる 2 var options = { 3 'method' : 'POST', 4 'Content-Type' : 'application/json', 5 'payload' : JSON.stringify(data) 6 }; 7 var response = UrlFetchApp.fetch('test_index.phpp', options); 8 console.log(JSON.stringify(data)); 9 return response;

test_index.php

php

1$json_string = file_get_contents('php://input'); 2$oJson = json_decode($json_string, true); 3file_put_contents( "data.json", json_encode($oJson, JSON_UNESCAPED_UNICODE));

で、test.gsを実行すると確認できました。

file_put_contents( "data.json", json_encode($oJson, JSON_UNESCAPED_UNICODE));
で、data.jsonに書き込んだところ、下記のデータを得ることが出来ました。

json

1[{"id":1,"date":"2021-06-30T15:00:00.000Z","name":"立花","attend":false}, 2{"id":2,"date":"2021-07-01T15:00:00.000Z","name":"橘","attend":true}, 3{"id":3,"date":"2021-07-02T15:00:00.000Z","name":"柳","attend":false}, 4{"id":4,"date":"2021-07-03T15:00:00.000Z","name":"桔梗","attend":true}, 5{"id":5,"date":"2021-07-04T15:00:00.000Z","name":"楓","attend":false}]

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hentaiman

2021/08/11 10:17

> GASからPHPに、jsonデータはわたっていますが、 これはどのように確認しましたか?ソースのどの行までその値が生きている事を確認しましたか?
unwind

2021/08/12 01:14

hentaisan様、お世話になっております。 コメント頂きありがとうございます。 本文の方に、新たにjsonが確認されたところの項目を記載いたしました。 お手数ですが、ご確認のほど、宜しくお願い致します。
guest

回答2

0

hentaiman様のおかげで、無事プログラムが動くことが出来ました!

php

1if($date != "" || $name != "" || $attend != ""){ 2... 3}

のところで、うまく動いてなかったみたいです。

この場を借りて、hentaiman様に御礼申し上げます。

自己解決前のプログラムの一部
test_index.php

php

1 $json_string = file_get_contents('php://input'); 2 $oJson = json_decode($json_string, true); 3 $date = $oJson->date; 4 $name = $oJson->name; 5 $attend = $oJson->attend; 6 7 $log = $date . "\n" . $name . "\n" . $attend . "\n"; 8 console_log($log); 9 10 file_put_contents( "data.json", json_encode($oJson, JSON_UNESCAPED_UNICODE)); 11 12 if($date != "" || $name != "" || $attend != ""){ 13 $sql = 'INSERT IGNORE INTO commute ( 14 `date`, 15 `name`, 16 `attend`) VALUES (:date, :name, :attend)'; 17 18 $stmt = $dbh->prepare($sql); 19 $stmt->bindParam(':date', $date, PDO::PARAM_STR); 20 $stmt->bindParam(':name', $name, PDO::PARAM_STR); 21 $stmt->bindParam(':attend', $attend, PDO::PARAM_BOOL); 22 23 $dbh->beginTransaction(); 24 foreach($oJson as $datum){ 25 $date = $datum['date']; 26 $name = $datum['name']; 27 $attend = $datum['attend']; 28 $stmt->execute(); 29 } 30 31 $dbh->commit(); 32 33 }

自己解決後のプログラムの一部
test_index.php

php

1 $json_string = file_get_contents('php://input'); 2 $oJson = json_decode($json_string, true); 3 console_log($json_string); 4 console_log($oJson); 5 $date = $oJson['date']; 6 $name = $oJson['name']; 7 $attend = $oJson['attend']; 8 9 $log = $date . "\n" . $name . "\n" . $attend . "\n"; 10 console_log($log); 11 12 $date_post = $_POST['date']; 13 $name_post = $_POST['name']; 14 $attend_post = $_POST['attend']; 15 16 $log = $date_post . "\n" . $name_post . "\n" . $attend_post . "\n"; 17 console_log($log); 18 19 file_put_contents( "data.json", json_encode($oJson, JSON_UNESCAPED_UNICODE)); //data.jsonとして同じ階層に書き出し 20 21 // $attendance = array($date, $name, $attend); 22 $sql = 'INSERT IGNORE INTO commute ( 23 date, 24 name, 25 attend) VALUES (:date, :name, :attend)'; 26 27 $stmt = $dbh->prepare($sql); 28 if($date != "" || $name != "" || $attend != ""){ 29 console_log("osjsonなし"); 30 $stmt->bindValue(':date', $date_post, PDO::PARAM_STR); 31 $stmt->bindValue(':name', $name_post, PDO::PARAM_STR); 32 $stmt->bindValue(':attend', $attend_post, PDO::PARAM_BOOL); 33 $stmt->execute(); 34 35 }else if($oJson != ""){ 36 console_log("osjsonあり"); 37 38 $stmt->bindParam(':date', $date, PDO::PARAM_STR); 39 $stmt->bindParam(':name', $name, PDO::PARAM_STR); 40 $stmt->bindParam(':attend', $attend, PDO::PARAM_BOOL); 41 $dbh->beginTransaction(); 42 foreach($oJson as $datum){ 43 $date = $datum['date']; 44 $name = $datum['name']; 45 $attend = $datum['attend']; 46 $stmt->execute(); 47 } 48 49 $dbh->commit(); 50 }

投稿2021/08/16 07:18

unwind

総合スコア19

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

unwind

2021/08/17 05:34

hentaiman様。何から何までありがとうございます。 error-logという機能があるんですね。知りませんでした。
guest

0

ベストアンサー

解決の為のヒント

一点目:解決の為には以下のドキュメントとサンプルコードを確認しつつ引用してあるコードを見直す事
https://www.php.net/manual/ja/function.json-decode.php

$oJson = json_decode($json_string, true);
$date = $oJson->date; $name = $oJson->name; $attend = $oJson->attend;

二点目:以下は何がしたいのか?

foreach($oJson as $datum){
$date = $datum['date']; $name = $datum['name']; $attend = $datum['attend']; $stmt->execute(); }

以下、バグを自力で解決出来ない理由

デバッグの仕方がいい雑だからです
わざと雑にしている訳ではない事は分かるので、以下を読んで心当たりがあればデバッグの姿勢を見直しましょう

質問者が現在把握している現象は

file_put_contents( "data.json", json_encode($oJson, JSON_UNESCAPED_UNICODE));

$oJsonがencode出来るかどうか、データがあるかどうかではなく

$stmt->bindParam(':name', $name, PDO::PARAM_STR);

bindParamしても値が入っていない、もしくはその前のif文で弾かれていてSQL自体が実行されないとなるはずです
それなら確認内容は$oJsonがencode出来るかどうかではなく、$nameなどに値があるかどうとなるはずです
ここで$dateが入っているかどうかを確認するかなど順番に少しずつ確認を勧めましょう

  • 「ここまでは出来てるだろう」と脳内補完してはいけません
  • ミスる訳ないと決めつけて基礎的な記述をしている個所のデバッグを怠るのはNGです
  • 把握している純粋な情報に従ってデバッグしましょう(簡単な箇所でミスる訳ないという思い込みがあるからデバッグ対象から漏れる)

追記

正しいdecodeと、誤ったdecode
※質問者がうまくいかない理由が分かりやすくなるように

php

1$json = ' 2[{"id":1,"date":"2021-06-30T15:00:00.000Z","name":"立花","attend":false}, 3{"id":2,"date":"2021-07-01T15:00:00.000Z","name":"橘","attend":true}, 4{"id":3,"date":"2021-07-02T15:00:00.000Z","name":"柳","attend":false}, 5{"id":4,"date":"2021-07-03T15:00:00.000Z","name":"桔梗","attend":true}, 6{"id":5,"date":"2021-07-04T15:00:00.000Z","name":"楓","attend":false}]'; 7 8$decode = json_decode($json, true); 9echo $decode->date; 10> PHP Warning: Attempt to read property "date" on array in php shell code on line 1 11 12echo $decode['date']; 13> PHP Warning: Undefined array key "date" in php shell code on line 1 14 15echo $decode[0]['date']; 16> 2021-06-30T15:00:00.000Z 17$date = $decode[0]['date']; 18echo $date != "" ? 'valid' : 'invalid'; 19> valid 20 21$date = $decode->date; 22> PHP Warning: Attempt to read property "date" on array in php shell code on line 1 23 24echo $date != "" ? 'valid' : 'invalid'; 25>invalid

投稿2021/08/12 02:00

編集2021/08/12 13:48
hentaiman

総合スコア6426

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

unwind

2021/08/12 04:39

hentaiman様。 何から何まで、コメント頂きありがとうございます。 hentaiman様が記載されたことを、やってみようと思います。
hentaiman

2021/08/12 13:49

phpマニュアルで苦戦しているかと思い、ちょっと追記しました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問