[ glavince @ 12.12.2006. 01:25 ] @
Naslov je rekao sve.
Preko forme za upload uplodiram sql fajl, kako da se u isto vreme izvrsi. t.e. da se kreira tabela.
[ w3bl0rd @ 12.12.2006. 09:54 ] @
možeš ili preko phpmyadmina ili sa mysqldump (ako server dopušta) ili da sam napišeš skriptu...
[ Jezdimir Lončar @ 12.12.2006. 09:57 ] @
Pa napraviš fajl run.php i staviš ga u action forme.
Konektuješ se na bazu i taj fajl otvoriš (fread i fopen) . Kao argument koristiš $_FILE array.
Imaš recimo:
$q = fread($fname);
mysql_query($q);
echo "Done!";
$fname ti je path do tog sql fajla.
Pozdrav,
Jezdo.
[ Davor Grubelić @ 12.12.2006. 10:02 ] @
još jedan način:

Code:

<?php

mysql_connect('localhost', 'nameless', '5xgdvz298');
mysql_select_db('test');

$upload_dir = 'upload/';
$upload_file = 'file.sql';

/**
 * nakon uploada...
 * neka file.sql sadrži samo jednu naredbu ...."SELECT * FROM tablica;"
 */

if (file_exists($upload_dir . $upload_file)) {
    $sql = join('', file($upload_dir . $upload_file));
    $tmp_res = mysql_query($sql);
    //$result = mysql_fetch_row($tmp_res);
    /**
     * sad dalje radiš sa razultatima što god hoćeš.
     */
}

?>
[ glavince @ 12.12.2006. 11:54 ] @
Sve je u redu ili nikako da mi usje
$tmp_res = mysql_query($sql);
Ovoako izgleda sql fajl
Code:

CREATE TABLE `sport` (
  `sport_id` smallint(5) unsigned NOT NULL default '0',
  `naziv` varchar(50) default NULL,
  `export_id` smallint(5) unsigned NOT NULL default '0',
  PRIMARY KEY  (`sport_id`),
  KEY `ID` (`sport_id`),
  KEY `Naziv` (`naziv`)
) ENGINE=MyISAM CHARACTER SET utf8;

SET SQL_MODE = 'MYSQL323';

INSERT INTO `sport` VALUES("10", "Fudbal", "1");
INSERT INTO `sport` VALUES("20", "Košarka", "2");
INSERT INTO `sport` VALUES("30", "Tenis", "3");
INSERT INTO `sport` VALUES("40", "Formula 1", "4");
INSERT INTO `sport` VALUES("45", "Moto trki", "4");
INSERT INTO `sport` VALUES("50", "Golovi vo liga", "5");
INSERT INTO `sport` VALUES("55", "Super Tip", "11");
INSERT INTO `sport` VALUES("60", "Hokej", "6");
INSERT INTO `sport` VALUES("70", "Rakomet", "7");
INSERT INTO `sport` VALUES("80", "Američki fudbal", "8");
INSERT INTO `sport` VALUES("90", "Odbojka", "3");
INSERT INTO `sport` VALUES("100", "Vaterpolo", "7");
INSERT INTO `sport` VALUES("105", "Ski sportovi", "14");
INSERT INTO `sport` VALUES("110", "Atletika", "15");
INSERT INTO `sport` VALUES("115", "Boks", "16");
INSERT INTO `sport` VALUES("120", "Ragbi", "8");
INSERT INTO `sport` VALUES("130", "Politika", "12");
INSERT INTO `sport` VALUES("140", "Zabava", "13");

Da napomenem da preko phpmyadmina sve je Ok.
[ Miroslav Ćurčić @ 12.12.2006. 12:52 ] @
Na nekom MySQL serverima je zabranjeno izvršavanje više instrukcija odjednom.

Čak i sam phpMyAdmin kad mu "uvoziš" bekap, to isecka na pojedinačne instrukcije pa ih onda redom izvršava.
To možeš videti po tome što dodaje komentare na kraju svake od njih posle izvršavanja.

Evo moje funkcije koju koristim za to razdvajanje:
Code:

function SqlParser($filename) {
  // razdvaja sql komande iz datoteke u array pojedinačnih instrukcija
  $sql= file($filename);
  $out= array();
  $p= 0;
  $size= count($sql);
  $Terms= array('`',"'",'"');
  while ($p<$size) {
      $line= $sql[$p];
      $tline= trim($line);
      if((!$tline)or($tline[0]=='-')) {$p++; continue;} // prazan red ili komentar
      // ako je stig'o dovde onda počinje neka instrukcija
      $instr= '';
    $InString= false;
      do {
        $instr .= $line;
        // zavrsava li se red usred nekog stringa (enter usred stringa)
        for($x=0;$x<strlen($tline);$x++) {
          if(($InString)and($tline[$x]==$Term)) // izlazimo iz stringa
            {$InString=false; continue;}
          if((!$InString)and(in_array($tline[$x],$Terms))) // ulazimo u string
            {$Term=$tline[$x]; $InString=true; continue;} 
        }
        $FoundSemicolon= (!$InString) && (substr($tline,-1)==';');
         $p++;
         if($p>=$size) break;
         $line= $sql[$p];
        $tline= trim($line);
      } while (($InString) || (!$FoundSemicolon));
      $out[]= $instr;    
  }
  return $out;
}

Posle u foreach petlji izvršiš svaki element vraćenog niza.
[ glavince @ 12.12.2006. 13:55 ] @
Broblem resen sa function SqlParser.
Hvala puno.
[ glavince @ 12.12.2006. 20:02 ] @
E sada opet problem.
Sql fajl koji dobijam je iz win2k u ascii encoding.
Kako da ga konvertiram u utf-8 i pri tom da otstranim bom.
Dali neko ima gotov parser koji ce to odraditi?
[ bitecode @ 12.12.2006. 21:15 ] @
Evo funkcije koja prevodi iz string iz "našeg" u UTF-8.
Code:

iconv("ISO-8859-2", "UTF-8", $string);

Možes jednostavnom petljom proći kroz query-file da ga "očistiš". Također možeš taj file čitav učitati u jedan string pa ga konvertovati..kako ti volja. Neki će vjerovatno predložiti utf8_encode() i utf8_decode(), ali nažalost ta funkcija ne radi sa našim hiroglifima :) Koristi ISO-8859-1 charset.

cheerz