[ nadinne @ 28.10.2010. 15:02 ] @
Zamolila bih Vas za pomoc, koristila sam simple html php dom parser za preuzimanje podataka sa jednog sajta, napravila sam klasu koja bi trebalo da parserovanim podacima popuni bazu,

problem je sto se podaci ne insertuju u bazu

Jel ima neko ideju kako da resim problem?

evo koda:
Code:


<?php
$server="localhost";
$user="root";
$pass="";
$db="baza_bioskopa";

include_once('simple_html_dom.php');
require_once('config.php');
include_once('database.php.inc');

if(isset($database)) { echo "true"; } else { echo "false"; }
echo "<br />";
echo $database->mysql_prep("it's working? <br/>");

$conn=new MySQLDatabase($server,$user,$pass,$db);
$conn->open_connection();

function nadjiPozicijuStringa($search, $string, $offset)
{
    
    $arr = explode($search, $string);
    switch( $offset )
    {
        case $offset == 0:
        return false;
        break;
    
        case $offset > max(array_keys($arr)):
        return false;
        break;

        default:
        return strlen(implode($search, array_slice($arr, 0, $offset)));
    }
}

$html = file_get_html('http://www.filmoskop.com/bioskopi');
foreach($html->find('div.list-compact') as $e)
{
    $bioskop = $e->find('a');
    $podaci = $e->find('span');
    $filmovi = $e->find('li');
        echo "BIOSKOP: " . $bioskop[0]->attr["name"];
        //echo "<br>PODACI: " . $podaci[1]->innertext;
        echo "<br>FILMOVI: <br>";
        
             
        
                foreach($filmovi as $film)
                   
                   
                     {
                     $pozicija_drugog_vece = nadjiPozicijuStringa(">", $film, 2);
                     $pozicija_treceg_manje = nadjiPozicijuStringa("<", $film, 3);
                     $imefilma = substr($film , $pozicija_drugog_vece+1, $pozicija_treceg_manje-$pozicija_drugog_vece-1);
                     
                     echo $imefilma . "<br>";
                     echo $film->plaintext. '<br>';
                     
                      
             //ekstrakcija vremena
             
             $pozicija_treceg_vece = nadjiPozicijuStringa(">", $film, 3);
             $pozicija_cetvrtog_manje = nadjiPozicijuStringa("<", $film, 4);
             $svavremena = substr($film , $pozicija_treceg_vece+1, $pozicija_cetvrtog_manje-$pozicija_treceg_vece-1);
             $svavremena = substr($svavremena, 3);
             $vremenaniz = explode(", ", $svavremena);
             foreach($vremenaniz as $vreme) {
                echo "POCETAK PROJEKCIJE:" . $vreme. '<br>';
                
                }

                    
}
}
$sql  = "INSERT INTO bioskopi (ID_bioskopa, naziv_bioskopa, podaci) VALUES (1,$bioskop,'$podaci')";
$sql  = "INSERT INTO repertoar (ID_filma, ID_bioskopa, vreme_projekcije) VALUES (1,1,'$vreme') ";
//$sql  = "INSERT INTO filmovi (ID_filma, naziv_filma, opis_filma) VALUES ('$imefilma') ";

$result = $database->query($sql);

$conn->close_connection(); 
                        
?>    





i jos
Code:

<?php

require_once('config.php');
  class MySQLDatabase{
     /* var $server="localhost";
      var $user="root";
      var $pass="";
      var $database="baza_bioskopa";
      var $conn=0;
      var $upit=0;*/
      
private $connection;
    
  function __construct() {
    $this->open_connection();
    }
    
    public function open_connection() {
        $this->connection = mysql_connect(DB_SERVER, DB_USER, DB_PASS);
        if (!$this->connection) {
            die("Database connection failed: " . mysql_error());
        } else {
            $db_select = mysql_select_db(DB_NAME, $this->connection);
            if (!$db_select) {
                die("Database selection failed: " . mysql_error());
            }
        }
    }
    public function close_connection() {
        if(isset($this->connection)) {
            mysql_close($this->connection);
            unset($this->connection);
        }
    }

    public function query($sql) {
        $result = mysql_query($sql, $this->connection);
        $this->confirm_query($result);
        return $result;
        }
        
        private function confirm_query($result) {
        if (!$result) {
            die("Database query failed: " . mysql_error());
        }
    }
        public function mysql_prep( $value ) {
        $magic_quotes_active = get_magic_quotes_gpc();
        $new_enough_php = function_exists( "mysql_real_escape_string" ); // i.e. PHP >= v4.3.0
        if( $new_enough_php ) { // PHP v4.3.0 or higher
            // undo any magic quote effects so mysql_real_escape_string can do the work
            if( $magic_quotes_active ) { $value = stripslashes( $value ); }
            $value = mysql_real_escape_string( $value );
        } else { // before PHP v4.3.0
            // if magic quotes aren't already on then add slashes manually
            if( !$magic_quotes_active ) { $value = addslashes( $value ); }
            // if magic quotes are active, then the slashes already exist
        }
        return $value;
    }
}
$database = new MySQLDatabase();
$db =& $database;

?>






na ovom linku je taj prakticni parser:
dom parser

Hvala puno na svakoj sugestiji,

PHP Juniorka

[ Nikola Poša @ 28.10.2010. 16:36 ] @
Teško da će sad neko od ljudi koji posećuju ovaj forum sesti, pa proučavati taj tvoj kôd, i onda ga umesto tebe debug-ovati, al' ajde...

Nisi rekla da dobijaš ikakvu grešku pri upisu u bazu, tako da je verovatno ta MySQLDatabase klasa u redu. Problem je izgleda u logici izvlačenja podataka pomoću tog dom parser-a, tačnije, pri pokušaju "čupanja" određenih elemenata iz tog DOM dokumenta kojeg dobijaš. Vidim da tu ispisuješ te neke željene sadržaje, $bioskop[0]->attr["name"], $imefilma, $film->plaintext, $vreme, itd. Da li pri tom ispisu dobijaš željene rezultate?

Takođe, vidim da u tim INSERT upitima pokušavaš da bind-uješ promenljive $bioskop i $podaci. Problem je što su te promenljie rezultat poziva tog nekog find() metoda, kojeg omogućava dom parser, a taj metod vraća niz DOMNode objekata (pretpostavljam), što svakako nije nešto što tek tako možeš da upišeš u bazu.
[ developer10 @ 28.10.2010. 16:54 ] @
Gornji post dobro kaze, tesko se uziviti u tudji kod i natjerati se da bas "zaronis" i nadjes gresku.
Ja bih uradio ovim redom:
Prvo vidi mozes li echo-vati sljedece varijable: $podaci, $vreme, $imefilma kako bi znala da li ih dobijas onako kako ocekujes.
Ako dobijas, onda je problem u samom query-ju. Pokusaj ukloniti single quotes oko tih varijabli pa pokusaj onda. AKo ni to ne pali,
onda razdvoji te varijable sasvim od ostatka:

Code:

$sql  = "INSERT INTO bioskopi (ID_bioskopa, naziv_bioskopa, podaci) VALUES (1, $bioskop, " . $podaci . ") ";
$sql  = "INSERT INTO repertoar (ID_filma, ID_bioskopa, vreme_projekcije) VALUES (1,1, " . $vreme . ") ";
//$sql  = "INSERT INTO filmovi (ID_filma, naziv_filma, opis_filma) VALUES (" . $imefilma . ") ";


Gornja verzija query-ja je bez single quotes oko pomenutih varijabli. ako ne bude radilo, ubaci jos single quotes pa mozda proradi.
[ nadinne @ 28.10.2010. 21:17 ] @
Hvala vam!

Da sve mogu da echo-ujem, snaćiću se, verovatno je query negde neispravan..

[ Nikola Poša @ 29.10.2010. 10:26 ] @
Sad tek vidim da, pored te sintakse greške u upitu, koju je naveo developer10, imaš i problem u logici...

Pri popunjavanju MySQL tabela koje imaju autoincrement kolonu, nikako ne treba ručno da unosiš vrednost te kolone, što ti upravo radiš u tom tvom kôdu. Makni "ID_bioskopa" iz tih zagrada u INSERT upitu, kao i tu vrednost "1". Isto važi i za tabelu "filmovi".

Dalje, tabela "repertoar", koliko vidim, predstavlja vezu između nekog filma i bioskopa, al' problem je što ti pri popunjavanju uvek unosiš samo jednu jedinu hardcode-ovanu vezu. Redosled unošenja podataka bi trebao da izlgeda npr. ovako:
1. najpre uneseš bioskop i u neku privremnu promenjlivu smestiš id bioskopa koji je unet. Pošto API tog tvog custom db adaptera (klasa MySQLDatabase) ne nudi takvu funkcionalnost, id poslednje unetog bioskopa ćeš dobiti pomoću funkcije mysql_insert_id
2. zatim uneseš film, i onda id filma koji je upravo unet, a kojeg dobijaš na način opisan u prethodnom koraku, smestiš u još jednu privremenu promenljivu (npr. $filmId)
3. na kraju ide unos u tu veznu tabelu "repertoar", tako što ćeš pri unosu iskoristiti te id-eve bioskopa i filma koje si dobila u prethodnim koracima.

Naravno, sve ovo se dešava u toj petlji, u kojoj i parsiraš sadržaj tog sajta sa kojeg uzimaš podatke, pošto si rešila da na taj način organizuješ kôd. A i najverovatnije unutar one petlje u kojoj "vrtiš" $vremenaniz, pošto tek tu dobijaš taj poslednji podatak od interesa - vreme projekcije.