Мне бы очень хотелось, чтобы кто-то потратил немного времени и просмотрел мой код. Я разбираю контент новостей, и я могу вставить исходный синтаксис в мою базу данных, которая содержит URL-адрес новостей и заголовок. Я хотел бы расширить его дальше, пройти по каждой ссылке статьи и проанализировать содержимое статьи и включить ее в мою базу данных. Первоначальный синтаксический анализ работает так:
<?php include_once ('connect_to_mysql.php'); include_once ('simple_html_dom.php'); $html = file_get_html('http://basket-planet.com/ru/'); $main = $html->find('div[class=mainBlock]', 0); $items = array(); foreach ($main->find('a') as $m){ $items[] = '("'.mysql_real_escape_string($m->plaintext).'", "'.mysql_real_escape_string($m->href).'")'; } $reverse = array_reverse($items); mysql_query ("INSERT IGNORE INTO basket_news (article, link) VALUES ".(implode(',', $reverse)).""); ?>
Как вы можете видеть, я использую PHP Simple HTML DOM Parser. Чтобы расширить, я пытаюсь использовать оператор mysqli, где я могу привязать параметры, чтобы все теги html были вставлены в мою базу данных. Я уже делал это с помощью синтаксического анализа XML. Проблема в том, что я не знаю, как связать массив и посмотреть, правильно ли мой код, если он будет работать таким образом … Вот весь код:
<?php $mysqli = new mysqli("localhost", "root", "", "test"); $mysqli->query("SET NAMES 'utf8'"); include_once ('simple_html_dom.php'); $html = file_get_html('http://basket-planet.com/ru/'); //find main news $main = $html->find('div[class=mainBlock]', 0); $items = array(); foreach ($main->find('a') as $m){ $h = file_get_html('http://www.basket-planet.com'.$m->href.''); $article = $h->find('div[class=newsItem]'); //convert to string to be able to modify content $a = str_get_html(implode("\n", (array)$article)); if(isset($a->find('img'))){ foreach ($a->find('img') as $img){ $img->outertext = '';}} //get rid of images if(isset($a->find('a'))){ foreach ($a->find('a') as $link){ $link->href = 'javascript:;'; $link->target = '';}} //get rid of any javascript if(isset($a->find('iframe'))){ foreach ($a->find ('iframe') as $frame){ $frame->outertext = '';}} //get rid of iframes @$a->find('object', 0)->outertext = ''; @$a->find('object', 1)->outertext = ''; //modify some more to retrieve only text content //put entire content into a div (will if statements work here???) $text_content = '<div>'.$a.'<br>'. ($a->find('object', 0)->data > 0 ? '<a target="_blank" href="'.$a->find('object', 0)->data.'">Play Video</a> ') ($a->find('object', 1)->data > 0 ? '<a target="_blank" href="'.$a->find('object', 1)->data.'">Play Video</a> ') ($a->find('iframe[src*=youtube]', 0)->src > 0 ? '<a target="_blank" href="'.$a->find('iframe', 0)->src.'">Play Video</a> ') //couple more checks to see if video links are present .'</div>'; $items[] = '("'.$m->plaintext.'","'.$m->href.'","'.$text_content.'")'; } //reverse the array so the latest items have the last id $reverse = array_reverse($items); $stmt = $mysqli->prepare ("INSERT IGNORE INTO test_news (article, link, text_cont) VALUES (?,?,?)"); $stmt->bind_param ???; //(implode(',', $reverse)); $stmt->execute(); $stmt->close(); ?>
Итак, логика для каждого href найденной статьи, я передаю ее для анализа содержимого, и я пытаюсь добавить его в массив. У меня, наверное, много ошибок, но я еще не могу это проверить, потому что я не знаю, как связать его, чтобы увидеть, работает ли он. И я также не уверен, могу ли я делать утверждения if внутри $ text_content div … что означает отображать «Воспроизвести видео», если они существуют. Поэтому, пожалуйста, если кто-то может потратить время на то, чтобы поработать над этим, я был бы очень признателен.
UPDATE: изменил операторы if на операторы сравнения в $ text_content div.
Это именно тот сценарий, когда mysqli действительно неудобен. Чтобы связать несколько параметров, вы должны передать их все как список аргументов переменной длины в mysql-> bind_param (), но сложной частью является то, что вы должны привязать их по ссылке . Ссылки на PHP могут быть довольно запутанными.
Вот пример (хотя я не тестировал этот точный код):
$stmt = $mysqli->prepare("INSERT IGNORE INTO test_news (article, link, text_cont) VALUES (?,?,?)"); foreach ($reverse as &$value) { $params[] = &$value; } array_unshift(str_repeat('s', count($params))); call_user_func_array(array($stmt, 'bind_param'), $params);
Мне гораздо проще использовать PDO, когда я хочу написать универсальную функцию для привязки параметров к SQL. Связывание не требуется, просто передайте массив значений методу PDOStatement :: execute ().
$stmt = $pdo->prepare("INSERT IGNORE INTO test_news (article, link, text_cont) VALUES (?,?,?)"); $stmt->execute($reverse);
Обновление: если вам нужны $ items, чтобы содержать несколько строк данных, я бы сделал это следующим образом:
Во-первых, при создании $ items создайте массив массивов, а не объедините значения вместе:
foreach ($main->find('a') as $m){ $items[] = array($m->plaintext, $m->href, $text_content); }
Затем подготовьте инструкцию INSERT, которая вставляет одну строку, и цикл за $ items, выполняющий подготовленный оператор один раз для каждого кортежа:
$stmt = $pdo->prepare("INSERT INTO test_news (article, link, text_cont) VALUES (?,?,?)"); foreach ($items as $tuple) { $stmt->execute($tuple); }
Я не знаю, почему вы использовали array_reverse () вообще, и я не знаю, почему вы использовали INSERT IGNORE, поэтому я их не выбрал.