Единственная проблема, с которой я столкнулся в вашем коде, заключалась в том, что отсутствие определения пользовательского агента привело бы к ошибке 403. Для доступа к каналу.
В будущем вы можете использовать curl_getinfo
для извлечения кода состояния.запроса, чтобы убедиться, что он не потерпел неудачу, и далее сопоставить его с кодом 200, что означает ОК.
$httpcode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
Помимо этого несколько ошибок в ваших циклах.
С SimpleXML:
<?php
$url = "https://thehockeywriters.com/category/san-jose-sharks/feed/";
$curl = curl_init();
curl_setopt($curl, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.2; WOW64; rv:17.0) Gecko/20100101 Firefox/17.0");
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_URL, $url);
$data = curl_exec($curl);
$httpcode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
curl_close($curl);
if ($httpcode !== 200)
{
echo "Failed to retrieve feed... Error code: $httpcode";
die();
}
$feed = new SimpleXMLElement($data);
// list all titles...
foreach ($feed->channel->item as $item)
{
echo $item->title, "<br>\n";
}
С DOMDocument:
<?php
$url = "https://thehockeywriters.com/category/san-jose-sharks/feed/";
$curl = curl_init();
curl_setopt($curl, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.2; WOW64; rv:17.0) Gecko/20100101 Firefox/17.0");
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_URL, $url);
$data = curl_exec($curl);
$httpcode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
curl_close($curl);
if ($httpcode !== 200)
{
echo "Failed to retrieve feed... Error code: $httpcode";
die();
}
$xml = new DOMDocument();
$xml->loadXML($data);
// list all titles...
foreach ($xml->getElementsByTagName("item") as $item)
{
foreach ($item->getElementsByTagName("title") as $title)
{
echo $title->nodeValue, "<br>\n";
}
}
Если вы просто хотите напечатать название / описание всех элементов:
foreach ($feed->channel->item as $item)
{
echo $item->title;
echo $item->description;
// uncomment the below line to print only the first entry.
// break;
}
Если вы хотите только первыйзапись без использования foreach:
echo $feed->channel->item[0]->title;
echo $feed->channel->item[0]->description;
Сохранение заголовка и описания в массив для последующего использования:
$result = [];
foreach ($feed->channel->item as $item)
{
$result[] =
[
'title' => (string)$item->title,
'description' => (string)$item->description
];
// could make a key => value alternatively from the above with
// title as key like this:
// $result[(string)$item->title] = (string)$item->description;
}
Foreach с подготовленным оператором MySQLi / PDO:
foreach ($feed->channel->item as $item)
{
// MySQLi
$stmt->bind_param('ss', $item->title, $item->description);
$stmt->execute();
// PDO
//$stmt->bindParam(':title', $item->title, PDO::PARAM_STR);
//$stmt->bindParam(':description', $item->description, PDO::PARAM_STR);
//$stmt->execute();
}