@semechki
Я не фрилансер, просто пишу код для себя.

Почему цикл while срабатывает только один раз?

Добрый день всем!
Сегодня я опять со своим вопросом.
У меня есть скрипт, который делает автопосты в VK
$sql_select = "SELECT * FROM `vk_post` WHERE postID != ''";
$query = mysqli_query($mysql,$sql_select) or die("Ошибка тут: " . mysqli_error($mysql));
while( $result = mysqli_fetch_array($query) ){
    $date = new DateTime("now");

    $dateNextPost = new DateTime($result['date_create']);
    $dateNextPost->add(new DateInterval('PT'.$result['posting_interval'].'M'));

    $second = $result['posting_interval']*60;
    $APID = $result['id'];
    if( $dateNextPost < $date ){
        echo $result['owner_id'];
        echo '<br>';
        $owner_id = $result['owner_id'];
        $post_id = $result['postID'];
        $imageID = $result['img_id'];
        $videoID = $result['video_id'];
        $message = $result['post_text'];

        $sql_select = "SELECT * FROM `users` WHERE `id`=".$result['user_id'];
        $query = mysqli_query($mysql,$sql_select) or die("Ошибка: " . mysqli_error($mysql));
        $result = mysqli_fetch_array($query);
        $access_token = $result['access_token'];

    // Удаление старого поста
        $request_params = [
            'owner_id' => $owner_id,
            'post_id' => $post_id,
            'access_token' => $access_token
        ];
        $ch = curl_init();
       
        curl_setopt($ch, CURLOPT_URL, 'https://api.vk.com/method/wall.delete');
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, 
        http_build_query($request_params).'&v=6.76');
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        $wallDelete = curl_exec($ch);
        $wallDelete = json_decode($wallDelete,true);
        curl_close($ch);

        if( $wallDelete['response'] == 1 ){
            errors_log('#'.$post_id.'. Запись успешно удалена, создаём новую');
        // Создание новой записи
            $v = '5.70'; //версия vk api
            $params = array(
                'owner_id' => $owner_id,    // Кому отправляем
                'user_id' => $owner_id,   // Что отправляем
                'message' => $message,
                'attachments' => 'photo'.$owner_id.'_'.$imageID.',video'.$owner_id.'_'.$videoID,
                'access_token' => $access_token,  // access_token можно вбить хардкодом, если работа будет идти из под одного юзера
                'v' => '5.70',
            );
            $url = 'https://api.vk.com/method/wall.post';
            // В $result вернется id 
            $result = file_get_contents($url, false, stream_context_create(array(
                'http' => array(
                    'method'  => 'POST',
                    'header'  => 'Content-type: application/x-www-form-urlencoded',
                    'content' => http_build_query($params)
                )
            )));

            $records=json_decode($result, true);
            $newPostID = $records['response']['post_id'];
            $sql = "UPDATE `vk_post` SET postID = '{$newPostID}', published = published + 1, date_create = DATE_ADD(date_create, INTERVAL ".$second." SECOND) WHERE postID = '$post_id'";
            $query = mysqli_query($mysql, $sql) or die("Ошибка " . mysqli_error($mysql));     
        }else{
            errors_log('#'.$post_id.'. Запись не найдена');
        }
    }
}

Вроде всё окей, но он делает пост только одному человеку, хотя людей которые подходят по времени около 20.
Функция errors_log:
function errors_log($error){
    $path=dirname(__FILE__)."/vk_awto.txt";
    if(!file_exists($path))
        file_put_contents($path,'');
    $f=fopen($path,'a');
    fwrite($f,"$error\n");
    fclose($f);
}

Не могу понять почему цикл останавливается, может это из-за моего не достаточного знания curl`a
  • Вопрос задан
  • 173 просмотра
Решения вопроса 1
@ukoHka
Всего понемногу
Скорее всего, причина в том, что вы используете внутри цикла те же переменные, которые используются для проверки цикла. То есть нашли несколько записей, положили в `$query`, затем внутри цикла в этот же `$query` кладете результат запроса с поиском по айди, обрабатываете и вот уже в `$query` ничего нет.

Если не помогло, надо отлаживать.
Чтобы локализовать проблему, попробуйте упростить код, например оставить внутри цикла while только echo "ok\n";
Если выполнится несколько раз, значит проблема внутри цикла, если один раз, значит проблема в запросе в БД.
В первом случае что-то прерывает цикл, возможно исключение. Заключите код в try ... catch и выведите текст ошибки, имя файла и строку.
Альтернативно, можно в коде раскидать маркеры выполнения этапов
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы