2013-08-24 3 views
0

У меня есть массив, который является json_decode некоторых данных, полученных из API twitter.
Вот часть массива, чем я использую:ForEach выполняет только одну задачу

Array(
    [0]=>stdClass Object (
     [user] => stdClass Object (
      [screen_name] => User1 
     ) 
     [text] => Text of message 
     [id] => 220301332135952385 
     [created_at] => Tue Jul 03 23:41:45 +0000 2012 
    ) 

    [1]=>stdClass Object (
     [user] => stdClass Object (
      [screen_name] => User2 
     ) 
     [text] => Text of message 
     [id] => 220301332135952385 
     [created_at] => Tue Jul 03 23:41:45 +0000 2012 
    ) 
) 

Проблема я бегу в том, что мой PHP только получать значения User1 и Text of message от него. Мой фактический массив намного длиннее, но он следует описанному выше шаблону.
Вот мой PHP:

foreach($tweet as $num => $val) { 
    $username = $tweet[$num]->user->screen_name; 
    echo $num . "-USER-" . $username . "-NAME "; 
    $tweet = $tweet[$num]->text; 
    $id = $tweet[$num]->id_str; 
    $year = substr($tweet[$num]->created_at, -4); 

    $statement = $connect->prepare("INSERT INTO table (username, tweet, id, year) VALUES ('$username', '$tweet', '$id', '$year')"); 
    $statement->execute(); 
} 

$tweet мой массив. echo есть что-то, что я использовал для отладки. Она выводит:

1-USER-User1-NAME 2-USER--NAME 3-USER--NAME 

Я ожидаю:

1-USER-User1-NAME 2-USER-User2-NAME 

Наконец, моя база данных получает только User1 в столбце имя пользователя и Text of message в колонке чирикать. Ничто не вводится в id или year. Хотя, он создает пустые строки для каждого твита после первого. Не уверен, что я делаю неправильно. Любая помощь будет принята с благодарностью. Благодаря!

+0

попытка отладки, удалить все, что в цикле Еогеасп , и протестируйте print_r ($ tweet) –

+0

@FaceOfJock Этот foreach находится внутри другого foreach. У меня есть print_r внутри первого foreach. – MOOcow102

+0

Я сказал это, потому что размер вашего твита равен 3, и вы показали свой массив только с двумя объектами, так что, возможно, у вас что-то не так внутри вашего второго foreach, попробуйте добавить еще один print_r и показать мне результат –

ответ

1

Если вы еще не решили эту проблему, вот что происходит:

В третьей строке в вашем foreach цикла вы заменяете значение $tweet, которая является причиной, почему вы видите только первые пользователя username и tweet в базе данных. Причина, по которой вы не получаете «id» и «year», состоит в том, что после того, как tweet теперь стал $tweet[$num]->text, который является строкой.

Другая проблема в вашем $id = $tweet[$num]->id_str. В любом случае это не работает по вышеуказанной причине, но как только вы исправите вышеуказанную проблему, ваш $id все равно будет null.

Попробуйте следующее:

foreach($tweet as $num => $val) { 
    $username = $tweet[$num]->user->screen_name; 
    echo $num . "-USER-" . $username . "-NAME "; 
    $user_tweet = $tweet[$num]->text; // Use $user_tweet = ... instead of $tweet = ... 
    $id = $tweet[$num]->id; // Replace $id_str with $id 
    $year = substr($tweet[$num]->created_at, -4); 

    $statement = $connect->prepare("INSERT INTO table (username, tweet, id, year) VALUES ('$username', '$user_tweet', '$id', '$year')"); 
    $statement->execute(); 
} 

Я не знаю, почему вы решили использовать $tweet[$num] вместо $val.

также использовать подготовленные заявления, что является самым полным в своем коде, предлагают использовать приготовленную параметризованный запрос следующим образом (и вот почему «SQL Injection Prevention-Defense Option 1: Parameterized Queries»):

$statement = $connect->prepare("INSERT INTO table (username, tweet, id, year) VALUES (:username, :user_tweet, :id, :year)"); 
$statement->bindParam(':username', $username); 
$statement->bindParam(':user_tweet', $user_tweet); 
$statement->bindParam(':id', $id); 
$statement->bindParam(':year', $year); 
$statement->execute(); 
+0

А, спасибо. Не поймал, что я дважды использовал $ tweet в качестве переменной. Спасибо тонну! – MOOcow102