2013-08-31 2 views
0

У меня есть JSON, который выглядит следующим образом:разрушающихся в PHP массив из 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()); 

} 

?> 

В массиве есть массив, и это, кажется, проблема. Сценарий не работает, данные не хранятся в базе данных. Сценарий возвращает ошибку «У вас есть ошибка в синтаксисе SQL, проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с« говорящим, датой »в строке 1.

Журнал PHP показывает уведомление: "PHP Примечание: Массив для преобразования строки в /Applications/MAMP/htdocs/json.php в строке 46". в журнале PHP

var_dump ($ speaking2) возвращает:

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

и и так далее. Как бы вы посоветовали мне адаптировать этот сценарий, чтобы он работал?

+0

1. Это уведомление, а не ошибка 2. Что показывает 'var_dump ($ speaking2)' –

+0

Я обновил свой вопрос с дополнительной информацией. – user1029296

+0

вне темы, но учтите, что функции 'mysql_xx()' устарели и их использование не рекомендуется. Вы должны подумать о переходе на лучший поддерживаемый API баз данных, такой как библиотека PDO. – Spudley

ответ

3

У вас возникла ошибка в синтаксисе SQL; проверьте руководство, которое соответствует версии сервера MySQL для корректного синтаксиса использовать вблизи «говоря, дату,» в строке 1.

Причина этой ошибки в том, что вы используете date как имя поля.

date является зарезервированным словом в SQL и вызывает ошибку, если вы используете его как имя поля или имя таблицы.

В идеале вы не должны использовать зарезервированные слова 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. Вы рассматриваете их как строки, но один из них не является строкой. Вероятно, это приведет к повреждению данных, поэтому вы должны изучить его. Я не могу сказать ничего более, чем это, не видя фактической строки JSON, но вы должны использовать print_r() или var_dump() для изучения содержимого переменных.

Надеюсь, что это поможет.

+0

Большое спасибо за ваш ответ. Я добавил задние скобки. Теперь возникает ошибка: «У вас возникла ошибка в синтаксисе SQL, проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса, чтобы использовать здоровье близкого человека, расширенный доступ к высшему образованию, проблемы, связанные с ветеринаром нашей страны» в строка 1 ", которая является частью текста, который является частью переменной" говорить ". Вы уверены, что факт, что «говорящий» является массивом, не является проблемой в запросе MySQL? – user1029296

+0

@ пользователь1029296. Если вы получаете ошибку MySQL в том, что должно быть * content *, это еще одно доказательство того, что вы не избегаете вещи правильно. Вы должны это делать. ('mysql_real_escape_string' или (лучше)' mysqli_real_escape_string' является вашим другом здесь.) – TRiG

+1

Причина следующей ошибки заключается в том, что вы не следовали моему совету об экранировании входных переменных. Текст содержит символ цитаты, а ** должен ** быть экранирован. – Spudley

Смежные вопросы