Элементы в цикле foreach как-то не уникальны - PullRequest
0 голосов
/ 05 марта 2019

Я вставляю некоторые значения из json-декодированного ответа в мою базу данных, но некоторые значения каким-то образом вставляются не только в свои собственные строки, но и в другие строки, у которых есть некоторые из этих значений.Так, например, если у строки было свое собственное аудио, оно сохраняет свое аудио, но оно также получает видео / фото / граффити некоторых других строк.Тем не менее, те сообщения, которые не имеют вложений, оставляют эти поля пустыми.Это очень странное поведение, и я уже потерялся в этих циклах.

foreach ( $response->posts as $key => $element ) {
    $comment_id = $element->id; 
    $user_id = $element->from_id;

    $usersget = $var_hidden_from_this_example;

    $user_name = $var_hidden_from_this_example_2;
    $user_photo = $var_hidden_from_this_example_3;

    $comment_text = $response->posts[$key]->text;
    $comment_date = date('Y-m-d H:i:s', $response->posts[$key]->date);

    if ( !isset ($element->attachments) ) {
        $photo = $graffiti = $video = $audio = null;
    }
    else {
        foreach ( $element->attachments as $key_att => $attachment ) {
            if ( $attachment->type == 'photo' ) {
                if ( $attachment->photo->album_id == $example_only ) {
                    $graffitis = array();
                    $graffitis[] = $attachment->photo->$example_var;
                }
                else {
                    $photos = array();
                    $photos[] = $attachment->photo->$example_var;
                }
            }
            if ( $attachment->type == 'video' ) {
                $videos = array();
                $videos[] = $example_var2;
            }
            if ( $attachment->type == 'audio' ) {
                $audios = array();
                $audios[] = $example_var3;
            }
        }
        if ( isset ($photos) ) {
            $photo = implode('\n', $photos);
        }
        if ( isset ($graffitis) ) {
            $graffiti = implode('\n', $graffitis);
        }
        if ( isset ($videos) ) {
            $video = implode('\n', $videos);
        }
        if ( isset ($audios) ) {
            $audio = implode('\n', $audios);
        }
    }

    $data = [
        'comment_id'          => $comment_id,
        'user_id'             => $user_id,
        'user_name'           => $user_name,
        'user_photo'          => $user_photo,
        'url'                 => $referer,
        'comment_text'        => $comment_text,
        'comment_date'        => $comment_date,
        'photo'               => $photo,
        'graffiti'            => $graffiti,
        'video'               => $video,
        'audio'               => $audio,
    ];

    $sql = "INSERT INTO level_1 (comment_id, user_id, user_name, user_photo, url, comment_text, comment_date, photo, graffiti, video, audio) VALUES (:comment_id, :user_id, :user_name, :user_photo, :url, :comment_text, :comment_date, :photo, :graffiti, :video, :audio)";
    $pdo->prepare($sql)->execute($data);
}

Другими словами, значения photo, graffiti, video и audio вставляются нетолько в соответствующих строках, но одинаковые значения вставляются во все строки таблицы, у которых не было своих собственных значений такого типа (кроме строк, у которых не было ни одной из них - они остаются пустыми, как и ожидалось).

1 Ответ

0 голосов
/ 05 марта 2019

Как отмечалось в комментариях, вы не переинициализируете свои $graffitis массивы и т. Д. , если не увидите приложение такого типа.Таким образом, для элемента, у которого нет видео, он получает видео от предыдущего элемента, у которого были видео.Попробуйте переписать ваш цикл так:

$graffitis = $photos = $videos = $audios = array();
foreach ( $element->attachments as $key_att => $attachment ) {
    if ( $attachment->type == 'photo' ) {
        if ( $attachment->photo->album_id == $example_only ) {
            $graffitis[] = $attachment->photo->$example_var;
        }
        else {
            $photos[] = $attachment->photo->$example_var;
        }
    }
    if ( $attachment->type == 'video' ) {
        $videos[] = $example_var2;
    }
    if ( $attachment->type == 'audio' ) {
        $audios[] = $example_var3;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...