Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

Problem sa našim slovima kod generisanja SQL koda za prebacivanja baze iz XML u MySQL

  • 15 odgovora
  • 10.006 pregleda

Najnovija ↓

Problem sa našim slovima kod generisanja SQL koda za prebacivanja baze iz XML u MySQL 18.04.2016. u 12:30 · pre 128 meseci #1
Potrebno mi je prebacivanje podataka iz Excela u MySQL bazu. Pronašao sam u knjizi jedno rješenje koje
od Excelove XML datoteke generiše SQL kod, koji bih onda mogao kopirati u bazu preko PhpMyAdmin-a.
(Tako sam bar zamislio, valjda ne radim nešto mnogo pogrešno.)

Međutim, problem nastaje kod naših slova, tj. afrikata. Generisani SQL kod nekad ima više polja nego
što ih tabela sadrži. Npr. umjesto:

INSERT INTO IME_BAZE ( ARTIKAL, KUPAC, DATUM ) VALUES ( 'Guma', 'Marko Marković', '26.02.2016.' );

kao rezultat dobijem:

INSERT INTO IME_BAZE ( ARTIKAL, KUPAC, DATUM ) VALUES ( 'Guma', 'Marko Markovi', 'ć', '26.02.2016.' );

I vrlo često (iako ne uvijek) pravi takve prekide kod naših slova (ćĆčČđĐšŠžŽ).

Problem mi se dešavao i sa nekim drugim znakovima (apostrof, crtica, navodnici...), ali sam rješenje
našao u starim temama ovdje na forumu (korištenje funkcija addslashes, htmlspecialchars, strip_tags,
magic_quotes_gpc i sl.). Međutim, za ovaj problem nisam uspio naći rješenje, pa se nadam da će mi neko
pomoći.

Evo koda iz knjige:
Code:

<?php
$tables = array();
$indata = 0;

function encode( $text )
    { 
         $text = preg_replace( "/'/", "''", $text ); 
         return "'".$text."'";
    }

function start_element( $parser, $name, $attribs )
    { 
      global $tables, $indata; 
      if ( $name == "WORKSHEET" ) 
      {
            $tables []= array( 
                    'name' => $attribs['SS:NAME'],                
                    'data' => array()
            );
        }
        if ( $name == "ROW" )
        {
                $tables[count($tables)-1]['data'] []= array();
        }
        if ( $name == "DATA" )
        {
            $indata = 1;
        } 
    }

function text( $parser, $text ) 
    {
        global $tables, $indata;
        if ( $indata )
        {

                $data =& $tables[count($tables)-1]['data'];
                $data[count($data)-1] []= $text;
            }
    }

function end_element( $parser, $name )
    {
        global $indata;
        if ( $name == "DATA" )
        $indata = 0;
    }

$parser = xml_parser_create( );
xml_set_element_handler( $parser, "start_element", "end_element" );
xml_set_character_data_handler( $parser, "text" );
while( !feof( STDIN ) ) {
  $text = fgets( STDIN );
  xml_parse( $parser, $text );
}
xml_parser_free( $parser );
foreach( $tables as $table ) {
    $name = $table['name'];
    $data =& $table['data'];
    $cols = implode( ", ", $data[0] );
    for( $in = 1; $in < count( $data ); $in++ ) {
        $sqldata = implode( ", ", array_map( "encode", $data[$in] ) );
?>

INSERT INTO <?php echo( $name )?> ( <?php echo( $cols ) ?> ) VALUES ( <?php echo(
$sqldata ); ?> );

<?php } } ?>
Re: Problem sa našim slovima kod generisanja SQL koda za prebacivanja baze iz XML u MySQL 20.04.2016. u 15:47 · pre 128 meseci #5
Odustao sam od XML-a i prešao na CSV. Skoro je proradilo ali i dalje imam problem sa našim slovima.
Podesio sam encoding pri kreiranju baze na utf-8:
Code:

CREATE DATABASE ime_baze DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;

a prilikom importa CSV-a koristio sam ovaj kod:
Code:

LOAD DATA INFILE 'putanja/do/file.csv'
IGNORE INTO TABLE ime_tabele
CHARACTER SET UTF8
FIELDS TERMINATED BY ';'
OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n';

i kad u localhostu pokušam
Code:

SELECT * FROM ime_tabele;

nedostaju naša slova, tačnije kada naiđe na naše slovo nedostaje ostatak podatka od tog slova pa do kraja.
Re: Problem sa našim slovima kod generisanja SQL koda za prebacivanja baze iz XML u MySQL 27.04.2016. u 16:08 · pre 127 meseci #14
Da zaključim ovu temu zbog nekog ko će možda nekad imati ovakav problem.

Sam encoding u UTF-8 za CSV fajl mi nije riješio problem.

Malo sam pogledao opcije za gorepomenutu LOAD DATA INFILE naredbu.
Pa u njoj ima (a i gore se koristi):
Code:

OPTIONALLY ENCLOSED BY '"'

Tako da sam prvo u Excelu svakom polju na početku i kraju dodao znak # (umjesto navodnika,
jer se oni pojavljuju u nekim poljima, pa mi je stvaralo novi problem), a onda koristio ovako:
Code:

OPTIONALLY ENCLOSED BY '#'

i tek tada je sve bilo manje-više OK...
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme