Функция Document Object Model для получения массива ссылок из базы данных и их обработки по одной - PullRequest
0 голосов
/ 16 июня 2011

Я пытался устранить неполадки в программе, которую пытаюсь создать, и мне удалось выяснить, что является причиной проблемы, однако исправить ее у меня не удалось.

Я используюфункция объектной модели документа в php, позволяющая получать массив ссылок из базы данных и обрабатывать их одну за другой, однако в @ $ doc-> loadHTMLFile ("$ alllinks") это делается;В этой строке есть проблема с этой функцией, принимающей значения массива из базы данных.

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

вот версия, которая работает:

<?php session_start();


// EDIT: Use a custom function to do the
// reverse of SORT_NUMERIC with asort
function height_compare($a1, $b1)
{
    if ($a1 == $b1) {
        return 0;
    }
    return ($a1 > $b1) ? -1 : 1;
}

$all_links = array('http://example.com/klvvobj','http://example.net/s/109228626');

foreach($all_links as $alllinks){
$doc = new DOMDocument();
// Okay this is HTML is kind of screwy
// So we're going to suppress errors
@$doc->loadHTMLFile("$alllinks");

// Get all images
$images_list = $doc->getElementsByTagName('img');

$images = array();
foreach($images_list as $image) {

  // Get the src attribute
  $image_source = $image->getAttribute('src');

  if (substr($image_source,0,7)=="http://"){
  $image_size_info = getimagesize($image_source);

  $images[$image_source] = $image_size_info[1];
  print_r($images);
  }
}


// Do a numeric sort on the height
uasort($images, "height_compare");
$tallest_image = array_slice($images, 0,1);
$mainimg = key($tallest_image);

echo "<img src='$mainimg' />";

}
print_r($images);

?> 

, а вот версия, которая не работает:

<?php session_start();

include 'functions.php';

$query = mysql_query("SELECT * FROM links");

        function height_compare($a1, $b1)
{
    if ($a1 == $b1) {
        return 0;
    }
    return ($a1 > $b1) ? -1 : 1;
}

while($result = mysql_fetch_array($query)) {
$link = $result['link'];
$doc = new DOMDocument();

// Okay this is HTML is kind of screwy
// So we're going to suppress errors
@$doc->loadHTMLFile($link);

// Get all images
$images_list = $doc->getElementsByTagName('img');

$images = array();
foreach($images_list as $image) {

  // Get the src attribute
  $image_source = $image->getAttribute('src');

  if (substr($image_source,0,7)=="http://"){
  $image_size_info = getimagesize($image_source);

  $images[$image_source] = $image_size_info[1];
  print_r($images);
  }
}


// Do a numeric sort on the height
uasort($images, "height_compare");
$tallest_image = array_slice($images, 0,1);
$mainimg = key($tallest_image);

echo "<img src='$mainimg' />";

}

                     echo '<a href="logout.php">Log out</a>';

?>

1 Ответ

2 голосов
/ 16 июня 2011

С:

@$doc->loadHTMLFile("'$link'");

, даже если $link содержит правильный / читаемый адрес, результат будет примерно таким:

@$doc->loadHTMLFile("'http://...'");

и 'http://...' неверный адрес.

(см. ')

Измените его на:

@$doc->loadHTMLFile($link);


Также, пожалуйста, не используйте @ для устранения ошибок: используйте

libxml_use_internal_errors(true);

и

libxml_get_errors();

при работе с проблемными XML / HTML.См. http://php.net/manual/function.libxml-use-internal-errors.php


Еще одно дополнение:

Вам не нужны сортировки.Если вы просто хотите «самые высокие изображения», используйте:

$mainimg = array_search(max($images), $images);
...