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

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

新規登録して質問してみよう
ただいま回答率
85.35%
JSON

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

PHP

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

解決済

1回答

846閲覧

POSTで送信したJSONデータの値をPHPの変数に入れたいです。

tetejiro

総合スコア17

JSON

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

PHP

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

0グッド

0クリップ

投稿2021/08/17 13:19

前提・実現したいこと

初心者です。最近JavaScriptを勉強し始めました。

JavascriptのPOSTを使用してPHPにJSONデータを送信し、
その後PHPを用いてデータベースへインサートしようとしています。

POSTを用いてPHP側に送信するまではできました。
print_r($_POST)でArray ( [text] => {"array1":1,"array2":2,"array3":3,"array4":"お店"} )と出ます。

値として書いている1, 2, 3の実際の値は、
javascriptで手に入れた位置情報の1: latitude(緯度), 2: longitude(経度), 3:accuracyですので少数を含んだ数字です。

PHPからデータベースにインサートするために、この各値(array1~4)をPHPの変数に代入したいのですが、それができません。

発生している問題・エラーメッセージ

Warning: Trying to access array offset on value of type null 警告:タイプnullの値で配列オフセットにアクセスしようとしています

該当のソースコード

JavaScirpt

1 <script> 2 'use strict'; 3 navigator.geolocation.getCurrentPosition(success, fail); 4 5 function success(pos) { 6 $(document).ready(function() { 7 var lat = pos.coords.latitude; 8 var long = pos.coords.longitude; 9 var accu = pos.coords.accuracy; 10 let geol = `経度:${lat} / 緯度:${long}`; 11 $('#geol').text(geol); 12 $('#reg').on('click', function() { 13 let loc = window.prompt('登録する場所の名前を記入してください。'); 14 if (loc) { 15 let data = { 16 'array1': lat, 17 'array2': long, 18 'array3': accu, 19 'array4': loc 20 }; 21 var data2 = JSON.stringify(data); 22 postForm(data2); 23 } 24 //$("#tabledata").append('<td>' + data.array1 + '</td>', '<td>' + data.array2 + '</td>', '<td>' + data.array3 + '</td>', '<td>' + data.array4 + '</td>'); 25 }); 26 }); 27 } 28 29 function fail(error) { 30 alert('位置情報の取得に失敗しました。エラーコード:' + error.code); 31 } 32 33 function postForm(value) { 34 var form = document.createElement('form'); 35 var request = document.createElement('input'); 36 form.method = 'POST'; 37 form.action = 'http://localhost/portfolio/git-portfolio/portfolio2/main-branch.php'; 38 request.type = 'hidden'; 39 request.name = 'text'; 40 request.value = value; 41 form.appendChild(request); 42 document.body.appendChild(form); 43 44 form.submit(); 45 } 46 </script> 47

PHP

1 $text = sanitize($_POST['text']); 2 $text = json_decode($text); 3 print_r($text); 4 5 $lat = $text['array1']; 6 $long = $text['array2']; 7 $accu = $text['array3']; 8 $loc = $text['array4']; 9

試したこと

・中身の整形の問題なのかとも思い
$text = str_replace(':', '=>', $text);をやって、
{"array"=>1}のようにしてみましたがだめでした。
(エラーの文面が変わりませんでした。)

・エンコードしてからデコードしなおすというのもしましたが、だめでした。

補足情報(FW/ツールのバージョンなど)

POST送信する際に参考にしたページはこちらです。https://www.sejuku.net/blog/53627
FormによるPOSTの中の「JavaScriptから動的にPOST送信する方法」を基に書きました。

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

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

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

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

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

guest

回答1

0

ベストアンサー

sanitizeで何やっているのか知らないですがそこで壊しているんじゃないでしょうか。

変なことをせず、json_decode$_POST['text']を直接渡せば動くように思います。

投稿2021/08/17 13:52

ishina_yum

総合スコア509

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

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

tetejiro

2021/08/17 14:07

ご回答と、お早いお返事本当にありがとうございます。 アドバイスいただいた通り、sanitizeを取ってみました。 (htmlspecialcharsを行っていました。)すると stdClass Object ( [array1] => 1 [array2] => 2, [array3] => 4 [array4] => お店 )となり、 Fatal error: Uncaught Error: Cannot use object of type stdClass as array 致命的なエラー:キャッチされないエラー:タイプstdClassのオブジェクトを配列として使用できません と表示されてしまいました。 stdClass objectというものを初めて目にしましたので、 今調べている途中なのですが、 もし解決策をご存じでしたら、引き続き対応を教えていただけないでしょうか。 すみませんが、よろしくお願いいたします。
tetejiro

2021/08/17 14:23

すみません。今デコードの第2引数をtrueにすることで解決させることができました。 これに1日つぶれていたので、本当にありがたいです。 これにて解決とさせていただきます。 本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問