[ broker @ 06.11.2003. 21:42 ] @
Nigde nisam mogao da nadjem gotovo kod koji izvrsava niz SQL komandi datih u jednom stringu, onako kako to radi mysql.exe pa sam na przinu napisao funkciju.

Pretpostavljam da ce jos nekome trebati.

Code:

//
// Izvrsi SQL skritu (niz SQL komandi datih u jednom stringu gde je 
// znak ; na kraju svake komande). Vraca true (1) ako je skripta izvrsena
// uspesno a false ako je doslo do greske. Podaci o gresci se mogu dobiti
// pozivom funkcija mysql_errno() i mysql_error()
//
function mysql_exec_batch ($p_query) {
  $query_split = preg_split ("/[;]+/", $p_query);
  foreach ($query_split as $command_line) {
    $command_line = trim($command_line);
    if ($command_line != '') {
      $query_result = mysql_query($command_line);
      if ($query_result == 0) { 
        break; 
      }; 
    };
  }; 
  return $query_result;
}
[ NetworkAdmin @ 10.11.2003. 09:21 ] @
zar to ne radi:
mysql_query($query);
[ Goran Rakić @ 10.11.2003. 16:06 ] @
probaj da uradiš:
mysql_query('SELECT * FROM test;SHOW TABLES;');
ne radi, zar ne ;)

E ovaj kod gore ti daje mogućnost da izvršiš ceo .sql fajl, znači više query-a odjednom i vrlo je korisno.
[ -zombie- @ 10.11.2003. 17:58 ] @
da, ideja je korisna, ali nije baš do kraja razrađena.

1) zaglupiće se ako neki red sadrži ;
2) takođe, neće se snaći sa komentarima (kakve obično dobijamo kada izvozimo baze)
3) ...
[ Goran Rakić @ 10.11.2003. 21:20 ] @
Ja sam pisao ranije nešto tako, a onda sam olakšao sebi posao sa system() funkcijom i which mysql i mysql -h aaa.com -u user -p pass < backup/backup.sql što sasvim lepo šljaka, doduše u većini slučajeva na Unix sistemima zbog which alata, kao i preusmeravanje ulaza što je mogućnost sh, bash i još po nekih ljuski.

Može da se i ovakav kod lepo razradi, ali uvek postoji problem sa "nije_pokrivena_još_ovakva_kombinacija".
[ _owl_ @ 10.11.2003. 22:42 ] @
PhpMyAdmin -- pravo cudo, pored toga sto bach SQL mozete da uradite preko web-a, mozete i da uzmete kod koji radi taj isti batch. Opaki su ti open source projekti, svasta moze da se nauci/preuzme/prepravi.
[ broker @ 11.11.2003. 09:47 ] @
Citat:
-zombie-:
1) zaglupiće se ako neki red sadrži ;
2) takođe, neće se snaći sa komentarima (kakve obično dobijamo kada izvozimo baze)


1. Nece se zaglupeti. Kod trimuje string koji je izdvojio kao komandu i ako dobije prazan string ne izvrsava ga.

2. Komentari ne smetaju osim u slucaju da neko zvekne ; u sam komentar.. mada, ovo nije namenjeno za all purpose and dumb users koriscenje nego da olaksa pisanje koda.

Ja vise volim da sto vise stvari resim SQL-om i ovo mi je zgodno resenje. Kad napravim komplikovan SQL skript koji radi posao (a to ume da bude poduzi niz komandi) samo ga iskopiram u PHP kod i izvrsim gornjom funkcijom. Ne samo sto je prakticno nego je i mnogo citljivije. Dodje skoro kao stored procedures :)

[ -zombie- @ 11.11.2003. 17:51 ] @
Citat:
broker:
1. Nece se zaglupeti. Kod trimuje string koji je izdvojio kao komandu i ako dobije prazan string ne izvrsava ga.


INSERT INTO articles SET keywords='html ; css ; javascript';

[ broker @ 12.11.2003. 08:13 ] @
ebiga... :) najde mi slabu tacku :)

Pa... siguran sam da se to moze resiti nekim prilicno jednsotavnim reg_exp, samo sto sam ja slab sa regexp. Ak se ne varam, ; se regularno moze pojaviti samo u stringovima pa bi moglo da se izvededa se pre podele na komande takvi slucajevi oznace a posle vrate.

Ako je neko rad da napise reg_exp koji nalazi ; u nizu znakova koji pocinju i zavrsavaju se sa ' odnosno " i zamenjuje ga sa ## neka posalje.
[ -zombie- @ 12.11.2003. 12:50 ] @
nije tako jednostavno, i sumnjam da se nekim normalnim regexom mogu pokriti svi slučajevi.

znak navoda ' se može naći i u stringu, ali je onda eskejpovan sa \', pa onda, mogu se koristiti i dupli navodi ", pa onda kombinacije jednih i drugih do u besvest...


znači, ma koliko ja voleo umetnost regexa, mislim da je za ovo neophodan neki liniski parser sa stanjem (statefull). videću da li mogu da skuvam jedan uskoro...
[ broker @ 13.11.2003. 11:55 ] @
Javi ako sta postignes, mada mislim da se ti problemi u dobroj meri mogu izbeci u samm sorsu. Najcesce se takvi stringovi moraju u stvari napraviti van SQL-a i proslediti kao parametri a niz SQL komandi je uglavnom baratanje s gotovim podacima u tabelama.
[ NetworkAdmin @ 14.11.2003. 23:13 ] @
onda je lijek dodavane "meta" komanti u sql file recimo
#explodemarker#
INSERT INTO articles SET keywords='html ; css ; javascript';
#explodemarker#
INSERT INTO articles SET keywords=lolita ; youngporn; underage';
#explodemarker#
[ _owl_ @ 15.11.2003. 22:22 ] @
Ne treba komplikovati nesto sto je po svoj prilici jednostavno
(sto u celu pricu dodavati neke eksplozije, dinamite i ostalo).
Ako neko hoce da pravi svoje resenje od nule onda mora malo
da se udubi u problem i eventualno prouci slicna resenja koja
postoje (gorepomenuti PhpMyAdmin).
Regex-ima se takvi problemi ne resavaju (resavaju se konstruisanjem
parsera, potisnog automata ili cega vec).
[ _owl_ @ 15.11.2003. 22:25 ] @
Zaboravih primer:
INSERT INTO articles
VALUES ('#explodemarker#', 'SELECT *;'bilo koji drugi marker');
Nije da hocu da miniram ideju ali ne ide to tako.
[ NetworkAdmin @ 18.11.2003. 08:58 ] @
Code:
function QueryUpload ($mysql_host, $mysql_user, $mysql_db, $mysql_password, $filename)
 {
  mysql_connect($mysql_host, $mysql_user, $mysql_password) || FatalError("Could not connect to SQL db");
  mysql_select_db($mysql_db) || FatalError("mysql_select_db :: failure");

  $fp = fopen($filename, "rb");
  $command = "";
  echo "Please wait...<br>\n";
  while (!feof($fp)) {
   $c = fgets($fp, 1500000);
   $c = chop($c);
   $c = ereg_replace("^[ \t]*#.*", "", $c);
   $command.=$c;
   if (ereg(";$",$command)) {
    $command=ereg_replace(";$","",$command);
        if (ereg("CREATE TABLE ", $command)) {
                $table_name = ereg_replace(" .*$", "", eregi_replace("^.*CREATE TABLE ", "", $command));
                echo "Creating table: [$table_name] ...<br>\n";
        flush();
        }
    mysql_query($command);
    $myerr = mysql_error ();
        if (!empty($myerr))
        {
     echo $myerr;
         break;
        } 
    $command="";
    flush();
   }
  }
  mysql_close ();
  fclose($fp);
  if (!empty($myerr))
     return false;
  return true;   
 } 


Evo na svjetlo javnosti ova funkcija pa da vidimo ima li bugs :)