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

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

ただいまの
回答率

87.62%

phpの配列をjavascriptで取得したい

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 2,963

score 18

jsonを使ってphp→javascriptの通信をしたのですが、どうも値がうまくわたってくれません。

php側を書き換えるのかjavascript側を書き換えるのかどちらかもわかりません。

別フォームで入力した緯度経度を[12.345, 23.456, 56.789]という風に取得したいのですがどうすればいいのでしょうか?

<!DOCTYPE html>
<html>
<body>
</body>
<script type="text/javascript">
//マップ生成
var map = L.map('map');
L.tileLayer('https://cyberjapandata.gsi.go.jp/xyz/std/{z}/{x}/{y}.png', {
  attribution: "<a href='https://maps.gsi.go.jp/development/ichiran.html' target='_blank'>地理院タイル</a>"
}).addTo(map);
map.setView([〇, 〇], 12);

</script>

<?php
//DB接続
$pdo = new PDO($dsn, $user, $password);

//データベースに値を挿入
  $sql="INSERT INTO lnglat (name, comment, ido, keido) VALUES (:name, :comment, :ido, :keido)";
  $stmt = $pdo->prepare($sql);
  $params = array(':name' => $name, ':comment' => $comment, ':ido' => $latitude, ':keido' => $longitude);
  $stmt ->execute($params);

//確認のため表示
$sql = 'SELECT * FROM lnglat';
$result = $pdo->query($sql);
foreach($result as $row){
   echo $row['id'].': ';
   echo $row['comment'].' ';
   echo $row['ido'].' ';
   echo $row['keido'].'<><>';
//json形式に変換
   $phpjson=json_encode($row['ido']);
//全てきちんと表示された(緯度:12.1234,56.7890など)
   echo $phpjson.'<br>';
}

?>

<script type="text/javascript">

var test=JSON.parse('<?php echo $phpjson; ?>')

//配列をすべて取得したいが取得できるのは最新投稿の1文字ずつ
//例えば緯度:12.345と投稿した場合取得されるのは[1,2,.,3,4,5]など
//最新投稿の1文字ずつが取得される
for(var i=0;i<test.length;i++){
  console.log(test[i])
}

console.log("log出力");
console.log(test);
</script>
</html>
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+2

配列をすべて取得したいが取得できるのは最新投稿の

最新投稿になるのは、m6u様のおっしゃる、上書きのせいです

$phpjson=json_encode($row['ido']);

のところを

$latitudes[] = $row['ido'];

として、foreachの閉じカッコのあとで、$phpjson = json_encode($latitudes);などとする必要があります。

例えば緯度:12.345と投稿した場合取得されるのは[1,2,.,3,4,5]など
最新投稿の1文字ずつが取得される

ここのところですが、実際に[1,2,.,3,4,5]となりますか?
console.log(test[i])の結果だと思うのですが

1
2
.
3
4
5
log出力

ではないですか? 

おそらく、$row['ido']は"12.345"が数値か文字列で入っていると期待しますので、
$phpjson = json_encode("12.345");の結果、$phpjsonは"12.345"ですし、JSON.Parse($phpjson)も、12.345です。これをforで取り出すと↑のような結果となると想像します。

繰り返しになりますがforeachの中で$phpjsonを作ると、$row['ido']の単一の値だけが上書きになり、配列にならないので、こういう動きになります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/12/19 13:40

    ありがとうございます!解決できました!!

    キャンセル

+2

javascriptコード内に
echo $phpjson.'<br>';で」<br>とか置かれたら文法エラーでしょ。

しかも、

foreach($result as $row){
   echo $row['id'].': ';
   echo $row['comment'].' ';
   echo $row['ido'].' ';
   echo $row['keido'].'<><>';
//json形式に変換
   $phpjson=json_encode($row['ido']);
//全てきちんと表示された(緯度:12.1234,56.7890など)
   echo $phpjson.'<br>';
}


foreachのループをするたびに、$phpjsonは追記ではなく上書きされているっていう。
せめて、配列に保存しておいてimplode()で連結してjsonに仕立てるとかしないと。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/12/19 10:20

    超見づらいですが、<br>のechoはscript内ではないですね・・

    キャンセル

+2

あまり読まずに回答します。

php→javascriptの通信

そのまま受け取ると「できません。」
行われるのは通信ではないからです。
PHPが行っているのはあくまで画面への出力のみで、それをブラウザから参照するためにHTMLなりCSSなりJavaScriptなりに解釈してくれます。
つまり「ブラウザがHTMLなりCSSなりJavaScriptなりに解釈できるような文字列をPHPでechoすれば良い」という話になります。
またこれにより「JavaScriptで作った情報をPHPでそのまま参照は不可」ということにもなります(Ajax・非同期通信の場合は別)
強いてならブラウザ⇔サーバーの通信ですね。

今どのように出力されているか分かりませんが、「ブラウザがHTMLなりCSSなりJavaScriptなりに解釈できるような文字列をPHPでecho」するようにしてください。
[12.345, 23.456, 56.789]としたいのでしたらまずは

echo "var test=JSON.parse('[12.345, 23.456, 56.789]');";


とするところからですね。
これで想定通り動いたらあとはこの形になるようにPHPで文字列を作っていきましょう。


以下、ヒント回答(もしかしたらそのまま答えかもしれませんが)

idoカラムがどのような形になっているか分からないですけど、
json_encode()自体がうまくいってないんじゃないかと。
本来はPHPの配列などをJSON文字列に変換するものです。
もしidoカラムに行毎に緯度情報が入っているのでしたら、
実はjson_encode()はおそらく想定通りになりません。
むしろjson_encode()は不要で下記のように書いたほうがいいのではないでしょうか。

$ido_array = [];
foreach($result as $row){
//中略
  $ido_array[] = $row['ido'];
//中略
}
//中略
?>
//中略
var test=JSON.parse('[<?php echo implode(",",$ido_array) ?>]')

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/12/19 10:32

    ヒントのところですが、おっしゃる趣旨はそのとおりとは思いますが、JSON.parseでパースできる配列を作るのに、[]の文字とimplode結果を足すくらいなら、せっかく作った$ido_arrayをそのままjson_encodeにかけたほうがよいように思います(配列をjsonにするもの、という回答内容にも添うと思います)。

    キャンセル

  • 2018/12/19 10:38

    確かにその方が質問の流れには沿ってるように思いますし、私も「JSON文字列だけ出力する」のが目的であればjson_encode()使うと思います。

    ただ、このようにした主旨としては、
    私の回答が「ブラウザがHTMLなりCSSなりJavaScriptなりに解釈できるような文字列をPHPでechoする」なので、その方向性に沿って書いたものになります。
    json_encode()だとどのような文字列になるのか最初はイメージしづらいところもあります。今後、json文字列以外も同じようにPHPで作ったものを出力することもあるでしょうし、その際に作り方のイメージがしやすいやり方ということでの提案としてみました。

    キャンセル

  • 2018/12/19 11:15

    コメントありがとうございます。理解しました。私が姑息な考えで羞じいるばかりです。

    キャンセル

  • 2018/12/19 11:17

    そこまで卑下しなくても・・・。
    私も言葉足らずのところがあるのでそこは日々反省です。

    キャンセル

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

  • ただいまの回答率 87.62%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る