2016-11-27 4 views
0

私は、phpからのクエリの結果をjavascriptオブジェクトに取得しようとしています。だからコンソールに私はエラーメッセージが表示されますUncaught SyntaxError:予期しないトークンはJSONの位置66にあります。変数が文字列のときにjsonを読み込もうとしているため、これがわかります。だから私のジレンマをheres。以下にGeoJSONオブジェクト(緯度と経度)を含有thestartgeomと呼ばれるテキスト列のクエリ結果は、次のとおりJavascriptでjsonとして文字列を出力するには?

{"type":"Point","coordinates":[40.752067565918,-73.9678421020508]} 
{"type":"Point","coordinates":[40.6908912658691,-73.9961242675781]} 
{"type":"Point","coordinates":[40.7666969299316,-73.9906158447266]} 

データベースとI 100,000を超えるレコードがあるため、テキスト列があるように私はそれを保存する理由個別の行のみを選択しようとしています。私はこれがテキストの列であることを知っているが、私は行ごとに行を行くことができ、緯度と経度(40.342、-73.221)を出力することができますので、私はjavascriptでjsonオブジェクトとしてそれを読んでみたい。私は私の質問でいずれかを怒らせるなら、私を許してください。しかし、これは本当に私を迷惑にしており、私は最後の手段です。

私の究極の目標は、JavaScriptのオブジェクトの座標のみを出力することです。

以下は私のコードです。どんな助けでも大歓迎です。

私のPHPファイル:

<?php 

$connect = pg_connect("host=127.0.0.1 dbname=d106 user=b16 password=cccC") or die("Could not connect: "); 
$result = pg_query($connect,"SELECT distinct thestartgeom FROM bike"); 
if (!$result) 
{ 
    echo "no results "; 
} 

while($row = pg_fetch_array($result)) 
    $coor = $row['thestartgeom']; 
    echo $coor; 
} 
pg_close($connect); 
?> 

私のHTML/JS:

<html> 
<head> 
<title>Simple</title> 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script> 

<script> 

$.ajax({ 
    type: "GET", 
    dataType: "JSON", 
    url: "getstat.php", 
    data: {sataVariable: "here is some data send with GET method"}, 
    success: function(data) { 
     var r = data.responseText; 
     var j = JSON.parse(r); 
     var coords = j.coordinates; 

     document.writeln(coords); // attempting to take the coordinates and store it in a variable 
     for (i = 0; i < coords.length; i++) { 
      coords.forEach(function(entry){  
       // loop through the coordinates and output the lat,lng 
       var d = document.getElementById("fpcoords"); 
       d.innerHTML = d.innerHTML + "<br>" + "LatLng(" + entry[0] + "," + entry[1] + "));" 
      }); 

     }  
    } 
}); 
</script> 
</head> 
    <body> 
    </body> 


    </html> 
+1

あなたは出力として三つの異なるJSON文字列を持っており、それはJSONレスポンスに対して有効ではありません。有効なJSONになるには、配列の内部にある必要があります。 – Justinas

+1

分かりやすいコードの字下げが良い考えです。コードを読むのに役立ちます。もっと重要なのは**あなたのコードをデバッグするのに役立ちます** [コーディング標準を見てください](http://www.php-fig.org/psr/psr-2/ )あなた自身の利益のために。あなたはこのコード を数週間/数ヶ月で修正するように頼まれるかもしれません。そして、あなたは私に最後に感謝します。 – RiggsFolly

+0

そして、私は@ RiggsFollyのためにありがとう –

答えて

0

最初のJSONが無効です.3つのオブジェクトが配列内にある必要があります。つまり、[]で囲んでカンマで区切る必要があります。JSONを少しだけフォーマットし直して不要なデータ:

<?php 
$connect = pg_connect("host=127.0.0.1 dbname=d106 user=b16 password=cccC") or die("Could not connect: "); 
$result = pg_query($connect,"SELECT distinct thestartgeom FROM bike"); 
if (!$result){ 
    echo '{"error":"no results"}'; 
} 

$points= array();  
while($row = pg_fetch_array($result)) 
    $coordinate = json_decode($row['thestartgeom'])->coordinates; 
    $p = new stdClass; 
    $p->lat = $coordinate[0]; 
    $p->long = $coordinate[1]; 
    array_push($points, $p); 
} 
$output = new stdClass; 
$output->points = $points; 
echo json_encode($output); 
pg_close($connect); 
?> 

ワーキングPHPサンドボックス: http://sandbox.onlinephpfunctions.com/code/0d3c4081edf097190e7233dc49b3f84cbe0ed094

この意志出力のようなあなたのJSON:

{ 
"points": [ 
    { 
    "lat": 40.752067565918, 
    "long": -73.9678421020508 
    }, 
    { 
    "lat": 40.6908912658691, 
    "long": -73.9961242675781 
    }, 
    { 
    "lat": 40.7666969299316, 
    "long": -73.9906158447266 
    } 
] 
} 

はその後、単純に次のようにJavaScriptでそれらを反復:

var dataset = /* The JSON above... */ 
var pointList = document.getElementById('pointList'); 

dataset.points.forEach(function(p){ 
    var li = document.createElement('li'); 
    li.innerHTML = "LatLong: "+p.lat+", "+p.long; 
    pointList.appendChild(li); 
}); 

作業JSFiddle: https://jsfiddle.net/workingClassHacker/qkpp333z/1/

+1

あなたは彼に配列を作成する方法を示す必要があります。そして、 'echo json_encode($ thearray)' – RiggsFolly

+0

答えに感謝します。だから私はPHPからのクエリをJavaScriptの文字列として読んでいるので、各jsonオブジェクトのカンマはありません。私のPHPコードでは、私は各行のクエリ後にコンマを追加する必要がありますか? –

+0

いいえ、配列に入れるだけで、私の答えの例とPHPのサンドボックスのリンクを見てください。配列プロパティを持つ配列またはオブジェクトをjson_encode関数に配置すると、有効なJSONが作成されます。しかし、あなたは一度だけjson_encodeを呼び出す必要があります!完全なオブジェクトを渡すだけで、あなたは家に帰ることができます:) – Espen

-1

JSON文字列が有効ではありません。サーバーは正しい形式のJSON文字列を返す必要があります。あなたのケースでは、角括弧内[ ]を3行を囲み、コンマを入れ,各オブジェクトの後にする必要があります:

[ 
    { 
     "type":"Point", 
     "coordinates":[ 
     40.752067565918, 
     -73.9678421020508 
     ] 
    }, 
    { 
     "type":"Point", 
     "coordinates":[ 
     40.6908912658691, 
     -73.9961242675781 
     ] 
    }, 
    { 
     "type":"Point", 
     "coordinates":[ 
     40.7666969299316, 
     -73.9906158447266 
     ] 
    } 
] 

また、将来的には私は、データベースに挿入する前に、データを符号化するだろう有効なJSON応答を返すために、手動で出力文字列をフォーマットする必要はありません。

+0

ちょっと男、あなたの応答に感謝します。JSON文字列はpgsqlクエリから来ています。 –

+1

ユーザーは「Uncaught SyntaxError:予期しないトークン{JSON位置66で例外」例外を報告しました。無効なJSON応答が表示されます。コメントそのものとして、それは無関係であろう。これは、どのように明らかに見えるかもしれないが、ユーザの質問に答えることを試みる。 – Fehniix

+0

@BrandonJ解析しようとしているJSONレスポンスは何ですか?あなたのコードで 'console.log(r)'は何を返すでしょうか? – Fehniix

関連する問題