0

次のような JSON があります。

{
"num_found": 407343,
"results": [
    {
        "speaker_state": "LA",
        "speaking": [
            "ABC",
            "DEF",
            "GHI"
        ],
        "speaker_party": "D",
    },

等々。このデータを MySQL データベースに解析しようとしています。次のphpコードを適応させました:

<?php

$hostname_ndb = "localhost";
$database_ndb = "senate";
$username_ndb = "root";
$password_ndb = "root";
$ndb = mysql_pconnect($hostname_ndb, $username_ndb, $password_ndb) or trigger_error(mysql_error(),E_USER_ERROR); 
mysql_select_db($database_ndb);

$url = "http://xxx.yyy/text.json";
$json = file_get_contents($url);

$out = json_decode($json, true);

foreach($out["results"] as $results) { 
$speaker_state = $results['speaker_state']; 
$speaking2 = $results['speaking'];
$speaking = implode('', $speaking2);
$date = $results['date'];

mysql_query("INSERT INTO speeches (speaker_state, speaking, date ) VALUES('$speaker_state', '$speaking','$date')") or die (mysql_error()); 

}

?> 

配列内に配列があり、それが問題のようです。スクリプトが機能せず、データがデータベースに保存されません。スクリプトはエラーを返します。

PHP ログには、「PHP 通知: 46 行目の /Applications/MAMP/htdocs/json.php の配列から文字列への変換」という通知が表示されます。

var_dump($speaking2) は以下を返します:

array(3) { [0]=> string(713) "XXX" [1]=> string(891) "ZZZ" [2]=> string(1189)

等々。このスクリプトを機能させるにはどうすればよいでしょうか?

4

1 に答える 1

3

SQL 構文にエラーがあります。1 行目の「speaking, date,」付近で使用する正しい構文については、MySQL サーバーのバージョンに対応するマニュアルを確認してください。

このエラーの理由はdate、フィールド名として使用しているためです。

dateは SQL の予約語であるため、フィールド名またはテーブル名として使用するとエラーが発生します。

理想的には、DB テーブルまたはフィールド名に SQL 予約語を使用しないでください。ただし、使用する場合は、mySQL が受け入れるように名前をバックティックで囲む必要があります。(実際、すべてのフィールド名とテーブル名に対してこれを行うことをお勧めします。必須ではありませんが、良い方法です)

したがって、クエリは次のようになります。

INSERT INTO `speeches` (`speaker_state`, `speaking`, `date`) VALUES ('$speaker_state', '$speaking','$date')

また、入力データをエスケープしているようには見えないことにも注意してください。を使用しmysql_real_escape_string()て、クエリに入力した変数をエスケープする必要があります (つまり$speaker_state$speaking$date)。これを怠ると、エラーが発生し、サイトがハッキングに対して脆弱になる可能性があります。

mysql_xxx()関数は非推奨であることにも注意してください。理想的には、別のデータベース関数のセットを使用する必要があります。その場合、変数をエスケープするための別の方法がありますが、現状では を使用する必要がありますmysql_real_escape_string()

PHP 通知: /Applications/MAMP/htdocs/json.php の 46 行目の配列から文字列への変換

これは、mySQL エラーとはまったく関係ありません。まだ調査が必要な問題である可能性がありますが、質問している SQL エラーの原因ではありません。

どの行が 46 行目であるかを知らずに確認することはできませんが、おそらくここで起こっているのは、受信した JSON 文字列が、SQL 文字列に入れている 3 つの変数のうちの 1 つの配列を生成することです。それらを文字列として扱っていますが、そのうちの 1 つは文字列ではありません。これはおそらくデータの破損を引き起こす可能性があるため、調査する必要があります。実際の JSON 文字列を見ないとそれ以上のことは言えませんが、変数の内容を調べるにはprint_r()orを使用する必要があります。var_dump()

それが役立つことを願っています。

于 2013-08-31T20:55:07.033 に答える