Как обойти массив ссылок из БД в yii2?

201
11 января 2018, 23:17

Здравствуйте, столкнулся с такой задачей: в Базе данных в таблице "Monitoring" есть поле "one_url" в котором хранятся ссылки, надо получить массив этих ссылок, обойти каждую ссылку (из таблицы one_url) и сохранить значение в поле "one_price". База данных: https://prnt.sc/hykh7m

Пытаюсь обойти с помощью Simple HTML DOM Parser массив ссылок чтобы получить значение.

Работаю с Yii2, вот пример моего кода:

class CurlController extends Controller
{
    public function actionIndex(){
        $base = new Monitoring(); //Обьявляем подключение к базе
        $base2 = Monitoring::find()->all(); //Получаем значения из базы данных
        //Делаем перебор массива ссылок
        foreach ($base2 as $one_url){
            echo "<pre>";
            print $one_url->url_test;
        }
        $url = $one_url->url_test; //Передаем значение ссылок в переменную
        /**
         *  GetMultiContent->init($url) инициализирует парсер, принимает два параметра:
         *  $url type string - ссылки парсируемых сайтов, если передать массив отработает мультизагрузчик
         *  если строку отработает обычный загрузчик
         *  $no_parser type boolean - true, не создавать объект Simple_html_dom контент для обработки контента
         *  и вернет строку, false, создасть объект автоматически (по умолчанию false)
         */
        $html = Yii::$app->multiparser->init($url);
        //Обходим массив ссылок и получаем значение селектора
        foreach($html->find('.pr-price_cash') as $url)
            echo $element->plaintext . "\n";
    }
}

Делаю все на Yii2, не могу передать в поле $url = $one_url->url_test; - ссылку, подскажите как это сделать пожалуйста, всю голову уже сломал гуглить и как потом каждое значение сохранить в таблицу?

Answer 1

У вас строка $url = $one_url->url_test; //Передаем значение ссылок в переменную находится вне цикла foreach, $one_url->url_test существует только внутри цикла. Кроме того у Вас есть еще ошибки. Во-первых,

$html = Yii::$app->multiparser->init($url);
        //Обходим массив ссылок и получаем значение селектора
        foreach($html->find('.pr-price_cash') as $url)
            echo $element->plaintext . "\n";

тоже находится вне цикла. Во-вторых, если перенести этот код в первый цикл foreach, то будет ошибка 2ого цикла из-за того, что вы используете as $url хотя $url уже выполняет другую роль, в-третьих вы вызываете $element->plaintext - хотя такого объекта не существует.

Для того, чтобы потом занести значение в таблицу, вам нужно вызвать соответствующую сущность, передать ей нужные значение и использовать метод save()

Переделанный примерный код выглядет примерно так:

class CurlController extends Controller
{
    public function actionIndex(){
        $base = new Monitoring(); //Обьявляем подключение к базе
        $base2 = Monitoring::find()->all(); //Получаем значения из базы данных
        $model = new Model(); // та сущность, куда будет вносить данные (это отдельный класс, который расширяет ActiveRecord)
        //Делаем перебор массива ссылок
        foreach ($base2 as $one_url){
            echo "<pre>";
            print $one_url->url_test;
            $url = $one_url->url_test; //Передаем значение ссылок в переменную      
            /**
         *  GetMultiContent->init($url) инициализирует парсер, принимает два параметра:
         *  $url type string - ссылки парсируемых сайтов, если передать массив отработает мультизагрузчик
         *  если строку отработает обычный загрузчик
         *  $no_parser type boolean - true, не создавать объект Simple_html_dom контент для обработки контента
         *  и вернет строку, false, создасть объект автоматически (по умолчанию false)
         */
        $html = Yii::$app->multiparser->init($url);
        //Обходим массив ссылок и получаем значение селектора
        foreach($html->find('.pr-price_cash') as $element) {
            echo $element->plaintext . "\n";
            $model->text = $element->plaintext;
            $model->save();
        }
        }


    }
}
READ ALSO
Yandex.API VS Parser (Яндекс.маркет)

Yandex.API VS Parser (Яндекс.маркет)

Достаточно абстрактный вопрос

191
Где тут ошибка?

Где тут ошибка?

У меня на сервере не работал код, я засунул его в компиляторКомпилятор говорит что надо убрать точку с запятой вот тут: $file = 'Data/Users/'

177
партнерская программа запись в куки

партнерская программа запись в куки

например в кабинете пользователя формируется реферальная ссылка mysiteru/?ref=13 если пользователь перешел по этой ссылке на сайт, как записать...

208