2016-09-14 6 views
1

json_encodeを使用してphpからjavascriptへのmySQL PDOクエリの結果である配列を渡そうとしています。mySQLクエリから返された文字列でjson_encodeを使用するとエラーが発生する

しかし、フィールドの1つにスペースが含まれている場合、または文字列にデータベース関数を使用しようとすると(最初の非スペース部分のみを選択するため)、オブジェクトは存在しないように見えます。コンパイル。続き

が実行されるコードです:

<?php 
    $sql = "SELECT id, substring_index(firstNames, ' ', 1) as firstName, lastName, gender, idPersonFather, idPersonMother 
    FROM a_person"; 

    $result = $db->query($sql); 
    while ($row = $result->fetch(PDO::FETCH_ASSOC)){ 

    $personArray[$row['id']] = Array( 'firstName' => $row['firstName'] 
            , 'lastName' => $row['lastName'] 
            , 'gender' => $row['gender'] 
            , 'idFather' => $row['idPersonFather'] 
            , 'idMother' => $row['idPersonMother']); 
} 
?> 

<html> 
... 
<script type="text/javascript" src="js/includes/grid_classes.js"> 

    var personArray=<?php echo json_encode($personArray); ?>//get php aray 
    var someNextStuff 
    ...etc 

ラインvar someNextStuffが明らかにオブジェクトが空の文字列に変換され、予期しない来るので、これはエラー Uncaught SyntaxError: Unexpected token var になりますか? 'マリア・アンナセシリア' のような値、およびNULLを含むfirstNamesと

$sql = "SELECT id, firstNames, lastName, gender, idPersonFather, idPersonMother 
FROM a_person"; 

はまた、次のselectは同じ問題が発生します。

ただし、SQLクエリはデータベース(phpmyadmin)で直接動作します。

ただし、選択と配列からfirstNamesフィールドを除外すると、コードが正しく動作しています。

この原因は何ですか?あなたの助けのための

感謝..

編集:

は、私が今

SELECT id, substring_index(coalesce('Maria anna blah','?'), ' ', 1) as firstName, <rest of fields> 

は動作しますが、

SELECT id, substring_index(coalesce(firstNames,'?'), ' ', 1) as firstName, <rest of fields> 

がないことがわかりました。

だから、その場で何かしなければなら、私は..

+0

PHPとJavaScriptを、 '<?php'と'?> 'タグで適切に区切らずにミックスしているようですが、その構文エラーの原因となっています... –

+0

申し訳ありません、例 - 今追加されました。上記のように、スペースを含むフィールドを除外している限り、コードはコンパイルされ、正しく動作します。 – Rusty75

+0

ああ、まあまあ、ちょうど '<?php echo json_encode($ personArray);の後ろにセミコロンが必要なようです。 ?> 'をJavaScriptで使用します。 –

答えて

0

OKを推測、私はそれが実際にそのフィールド内の行のいずれかで、偽の値だったようです!

患者は、順序通りの選択からそれが失敗するまで患者の多くの行を追加しました。これは、ファーストネームÃlineのレコードを追加するときに発生します。 コピー貼り付けÃ... 0089それが何であっても、判読不能な文字が見つかった... 16進数c289 Ã文字の後に値を削除するだけでは文字が十分ではないようですおそらくあまりにも限られたしかし、私はこれが汚いデータだと思うので、文字セットを拡張するのではなく、ソースに戻るでしょう。

1

json_last_error_msgの出力(または古いバージョンのPHPを使用している場合はjson_last_error)を見ると、定数に一致する必要がある整数だけが得られます。エラー:

Control character error, possibly incorrectly encoded

または

Malformed UTF-8 characters, possibly incorrectly encoded

あなたは(Aと印刷できない)見つかった2つの奇妙な文字を使用すると、UTF-8を使用していないデータベースでUTF-8のデータを格納しようとすると何が起こるかですエンコーディング。

ユニコード文字を含む可能性のあるデータごとにutf8_decodeを呼び出すことで、この問題を回避できます。

ただし、データベースをUTF-8で確実に修正する方法があります。

+0

こんにちは、参考にしていただきありがとうございます。データベースの照合はutf8_general_ciですが、HEXコードC289はUTF8内に収まる文字セット内のものではないと思います。私がGEDCOM形式のファミリーツリーソフトウェアプログラムからエクスポートしたデータです。私はGEDCOMファイルを処理し、mysqlデータベースを移植するパッケージを書いています。 UTF8の設定を見落としているかもしれませんが、データが誤ってファイルに格納されている可能性があります。すべての場合において、私は一般的な文字しか期待しないので、おそらく汚いデータです... – Rusty75

関連する問題