Avatar billede jalle Nybegynder
16. april 2016 - 10:24 Der er 2 kommentarer og
1 løsning

DOMDocument::loadHTMLFile() fejler

Har haft bygget et script som tidligere har virket, men ser nu at det ikke virker og kan ikke finde ud af hvorfor det lige pludselig ikke virker.

Bruger det til at hente nogle oplysninger om nogle baner er optaget eller ej og smider det i en database til selv at danne en baneoversigt.

Får følgende fejlmeddelelser:
Warning: DOMDocument::loadHTMLFile() [domdocument.loadhtmlfile]: error parsing attribute name in http://fbk.klub-modul.dk/cms/HallPlanShow.aspx, line: 6 in /hotels/fbk-hal.dk/www2/test8.php on line 6

Warning: DOMDocument::loadHTMLFile() [domdocument.loadhtmlfile]: Unexpected end tag : a in http://fbk.klub-modul.dk/cms/HallPlanShow.aspx, line: 65 in /hotels/fbk-hal.dk/www2/test8.php on line 6

Warning: DOMDocument::loadHTMLFile() [domdocument.loadhtmlfile]: Unexpected end tag : a in http://fbk.klub-modul.dk/cms/HallPlanShow.aspx, line: 96 in /hotels/fbk-hal.dk/www2/test8.php on line 6

Warning: DOMDocument::loadHTMLFile() [domdocument.loadhtmlfile]: htmlParseEntityRef: no name in http://fbk.klub-modul.dk/cms/HallPlanShow.aspx, line: 175 in /hotels/fbk-hal.dk/www2/test8.php on line 6

Warning: DOMDocument::loadHTMLFile() [domdocument.loadhtmlfile]: htmlParseEntityRef: no name in http://fbk.klub-modul.dk/cms/HallPlanShow.aspx, line: 201 in /hotels/fbk-hal.dk/www2/test8.php on line 6

Warning: DOMDocument::loadHTMLFile() [domdocument.loadhtmlfile]: htmlParseEntityRef: no name in http://fbk.klub-modul.dk/cms/HallPlanShow.aspx, line: 349 in /hotels/fbk-hal.dk/www2/test8.php on line 6

Scriptet ser sådan ud - sikkert en lille ændring jeg skal foretage.

Har prøvet at sætte libxml_use_internal_errors(true); ind, men gav bare en masse andre fejl

<?php
require_once("lib/connection.inc.php");
$dom = new DOMDocument(); 
//libxml_use_internal_errors(true);
//load the html 
$html = $dom->loadHTMLFile("http://fbk.klub-modul.dk/cms/HallPlanShow.aspx");

  //discard white space 
$dom->preserveWhiteSpace = false; 

  //the table by its tag name 
$tables = $dom->getElementsByTagName('table'); 


    //get all rows from the table 
$rows = $tables->item(0)->getElementsByTagName('tr'); 

  // get each column by tag name 
$cols = $rows->item(0)->getElementsByTagName('th'); 

$row_headers = NULL;
foreach ($cols as $node) {
    //print $node->nodeValue."\n"; 
    #$row_headers[] = $node->nodeValue;


$table = array();
  //get all rows from the table 
$rows = $tables->item(0)->getElementsByTagName('tr'); 
foreach ($rows as $row) 

  // get each column by tag name 
    $cols = $row->getElementsByTagName('td'); 
    $row = array();
    $i=0;
    foreach ($cols as $node) {
        # code...
        //print $node->nodeValue."\n"; 
        if($row_headers==NULL)
            $row[] = $node->nodeValue;
        else
            $row[$row_headers[$i]] = $node->nodeValue;
        $i++;
    } 
    $table[] = $row;
}
sql("DELETE FROM hal_booking where medlemid < 99999");
for ($i = 16; $i < count($table); $i++) {
//for ($i = 16; $i < 18; $i++) {
    for ($s = 1; $s <= 5; $s++) {
        $kl = substr($table[$i][$s], 4, 4);
        $dag = substr($kl, 0, 1);
        $tid = substr($kl, 1, 2);
        $bane = substr($kl, 3, 1);
        //echo $dag.'-'.$tid.'-'.$bane.'<br>';
        $r = $i +1;
        if ($table[$r][$s] == 'Udsolgt') {
            $id = 2;
        }
        $tid1 = $tid + 1;
        if ($tid1 < 10) {
            $tid1 = '0'.$tid1;
        }
        $tiden = $tid.'-'.$tid1;
        //echo $tiden.' ;-'.$id.'-'.$dag.'-'.$tid.'-'.$bane.'<br>';
        if ($table[$r][$s] == 'Udsolgt') {
            $rs = sql("select id as halid from hal_tider where tider = '$tiden'") or die(mysql_error());
            if ($row = mysql_fetch_array($rs)) {
                extract($row);
                $tjek = sql("INSERT INTO hal_booking SET medlemid='".$id."', dageid='".$dag."', tiderid='".$halid."', baneid='".$bane."'") or die(mysql_error());
                //echo $tjek;
            }
        }
    }
    $i++;
}
//print_r($table[16][1]);
//print_r($table[17][1]);
//var_dump($table);
?>
Avatar billede olsensweb.dk Ekspert
16. april 2016 - 14:55 #1
google
ref https://www.google.dk/search?q=php+DOMDocument::loadHTMLFile%28%29:+error+parsing+attribute+name
http://stackoverflow.com/questions/14783760/remove-dom-warning-php
citat

DOMDocument is very good at dealing with imperfect markup, but it throws warnings all over the place when it does.

This isn't well documented here. The solution to this is to implement a separate aparatus for dealing with just these errors.

Set libxml_use_internal_errors(true) before calling loadHTML. This will prevent errors from bubbling up to your default error handler. And you can then get at them (if you desire) using other libxml error functions.

You can find more info here http://www.php.net/manual/en/ref.libxml.php

/citat


har du overvejt at få dem til at validere deres side ??
http://validator.w3.org/check?verbose=1&uri=http://fbk.klub-modul.dk/cms/HallPlanShow.aspx


det ser ud til at være interne fejl
http://php.net/manual/en/domdocument.loadhtmlfile.php#114531

set denne linje libxml_use_internal_errors(true); aktiv igen



>Har prøvet at sætte libxml_use_internal_errors(true); ind, men gav bare en masse andre fejl
hvilke ??, det er vel ikke php fejl ??
ovenstående linje fjerner netop de fejl du har listed

***************************************************


>sql("
går ud fra det er en function du selv har lavet

>mysql_xxxx
du bør/skal opdaterer dit sql API til mysqli eller PDO


mysql er udgået af PHP7, det burde du også få en besked på når du laver en connect, hvis du har slået error_reporting og display erreors til
http://php.net/manual/en/function.mysql-connect.php
http://php.net/manual/en/errorfunc.configuration.php#ini.error-reporting
http://php.net/manual/en/errorfunc.configuration.php#ini.display-errors

*************
det nemmeste er at skifte til mysqli, i mysqli kan du anvende 2 styles frit som du har lyst

procedural style: som du kender fra det gamle mysql, der er grundlæggende bare tilføjet et i, i alle mysql_ kommandoerne så de hedder mysqli_, og ved mange af dem skl adu også angive din connection

OOP style: dette er det der anvendes mest, og er fremtiden

Prepare Statement: er noget af det nye der er kommet til i mysqli, en kvik guide http://www.eksperten.dk/guide/1480
du har kun numbered place holders
*************
PDO: dette ser jeg som det fremtidige ext (API), du kan kun anvende OOP style, tilgengæld har du alle fordele fra ODBC men ikke ulemperne ved at skulle installerer en system driver

Prepare Statement: er klart forbedret i forhold til mysqli
du har numbered placeholders og named placeholders, sidst nævnte er klart nemmere at læse IMHO
********************
Avatar billede jalle Nybegynder
16. april 2016 - 17:08 #2
Har fundet ud af at det er er selve den første del af koden som den er galt med

  //the table by its tag name 
$tables = $dom->getElementsByTagName('table'); 


    //get all rows from the table 
$rows = $tables->item(0)->getElementsByTagName('tr'); 

  // get each column by tag name 
$cols = $rows->item(0)->getElementsByTagName('th'); 

$row_headers = NULL;
foreach ($cols as $node) {
    //print $node->nodeValue."\n"; 
    #$row_headers[] = $node->nodeValue;


$table = array();
  //get all rows from the table 
$rows = $tables->item(0)->getElementsByTagName('tr'); 
foreach ($rows as $row) 

  // get each column by tag name 
    $cols = $row->getElementsByTagName('td'); 
    $row = array();
    $i=0;
    foreach ($cols as $node) {
        # code...
        //print $node->nodeValue."\n"; 
        if($row_headers==NULL)
            $row[] = $node->nodeValue;
        else
            $row[$row_headers[$i]] = $node->nodeValue;
        $i++;
    } 
    $table[] = $row;
}

sql er en funktion, som jeg selv har lavet - det er efterhånden 4 år siden jeg sidst har programmeret og har ikke fuldt med i udviklingen. Kan se at der er sket meget

Har ikke fundet løsningen endnu.

Det er som er min udfordring er at jeg skal have information om en bane er udsolgt eller ej og gemme de data i en database ? - nogen som har en løsning til dette?
Avatar billede jalle Nybegynder
16. april 2016 - 20:14 #3
lukker denne op opretter et nyt
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester