Az adatbázis export függvény optimalizálása

Az adatbázis export függvény optimalizálása
2020-01-07T10:13:02+01:00
2020-01-09T11:27:30+01:00
2022-10-15T21:26:21+02:00
Valaki88
Sziasztok!

Írtam php-ben egy adatbázis (+tábla) export függvényt.

function export($db,$tables=null){ if (isset($db)){ global $kapcsolat; $db = strpos($db,',')!==false?explode(',',$db):array($db); $t_nev = ''; $str = ''; for ($it=0; $it<count($db); $it++){ $tablak = array(); mysqli_select_db($kapcsolat,$db[$it]); $t = mysqli_query($kapcsolat,'SHOW TABLES'); while ($row = mysqli_fetch_row($t)) $tablak[] = $row[0]; if ($tables != null){ // preg_match('#\((.*?)\)#',$tables,$tables); $tables = $tables[1]; // Ezzel rakom tömbbe a táblaneveket a zárójeles elválasztós verzióval! $tablak = strpos($tables,',')!==false?explode(',',$tables):array($tables); // echo '<pre>';print_r($tablak);echo '</pre>'; $t_nev = '_'.$tablak[0]; } $ido = time(); $str = "-- Létrehozás ideje: $ido\n"; foreach ($tablak as $uj_table){ mysqli_select_db($kapcsolat,$db[$it]); $mezo = mysqli_query($kapcsolat,'SELECT * FROM `'.$uj_table.'`'); $mezo_num = mysqli_num_fields($mezo); // $str .= 'DROP TABLE '.$uj_table.';'; $r = mysqli_query($kapcsolat,'SHOW CREATE TABLE `'.$uj_table.'`'); $row2 = mysqli_fetch_row($r); $str .= $row2[1].";\n\n"; for ($i = 0; $i < $mezo_num; $i++){ while($row = mysqli_fetch_row($mezo)){ $str .= 'INSERT INTO '.$uj_table.' VALUES('; for($j=0; $j < $mezo_num; $j++){ $row[$j] = addslashes($row[$j]); $row[$j] = str_replace("\n","\n",$row[$j]); if (isset($row[$j])) $str .= '"'.$row[$j].'"'; else $str .= '""'; if ($j < ($mezo_num-1)) $str .= ','; } $str .= ");\n"; } } } $f = 'save/'.$db[$it].$t_nev.'.sql'; $n = 0; while (file_exists($f)) $f = 'save/'.$db[$it].$t_nev.'('.(++$n).').sql'; $dl = 0; // $dl = 1; if (($dl)){ // fájl letöltés echo 'dl'; header("Content-type: application/sql"); header("Content-Disposition: attachment; filename=".$f); header("Pragma: no-cache"); header("Expires: 0"); $handle = fopen('php://output','w'); fwrite($handle,$str); fclose($handle); } else{ // fájl létrehozás echo 'A(z) <b>'.$f.'</b> létrehozva!<br>'; $handle = fopen($f,'w+'); fwrite($handle,$str); fclose($handle); // echo date('Y.m.d. H:i:s:u',$ido); } $str = ''; } } }
A különböző függvény paraméter meghívásokkal különböző formában exportál.
export('db_1,db_2,db_3’); // Ebben az esetben teljes adatbázis(oka)t exportál. export('db_1’,'tabla_nev_1,tabla_nev_2,tabla_nev_3'); // Ebben az esetben egy adott adatbázisnak az adott tábláját (vagy tábláit) exportál.
Eddig stimmel!

Viszont már egy jó ideje azon szüttyögök, hogy az alábbi módon is működjön a függvényem.

export('db_1,db_2’,'(tabla_nev_1,tabla_nev_2,tabla_nev_3),(tabla_nev_xy,tabla_nev_abc)'); // Ebben az esetben a függvény első paraméterében megadott adatbázisokból, a függvény második paraméterében megadott táblákat szeretném exportálni.
Az párosítást vesszőkkel és zárójelekkel oldanám meg a fenti módon.
Tehát a példám alapján:
Adatbázis: db_1
Táblák: tabla_nev_1, tabla_nev_2,tabla_nev_3
Adatbázis: db_2
Táblák: tabla_nev_xy, tabla_nev_abc

Ebben kérném a segítségeteket.

Megpróbáltam úgy, hogy a függvényemből a foreach blokkot kiemeltem egy külön függvénybe, majd az eredeti függvényemben a foreach helyébe egy for ciklussal a $tables tömb alapján (amit kikommenteltem a fenti függvényben, mert nem jött össze) lefuttattam a kiemelt, új függvényt.
Sajnos nem működött, de szerintem az elv jó lehet.

Kérlek, segítsetek módosítani úgy a kódomat, hogy mindkét függvénymeghívás annak megfelelően készítse el az exportálást!

export('db_1,db_2,db_3’); // Ebben az esetben teljes adatbázis(oka)t exportál. export('db_1’,'tabla_nev_1,tabla_nev_2,tabla_nev_3'); // Ebben az esetben egy adott adatbázisnak az adott tábláját (vagy tábláit) exportál.

Nagyon szépen köszönöm a segítséget!
Mutasd a teljes hozzászólást!
Én biztos nem szüttyögnék mindenféle stringekkel + szeparátorokkal...

Talán valami ilyesmit csinálnék első körben:

function export($param) { echo "<h3>EXPORT</h3>"; foreach($param as $db => $tables) { echo '<h4 style="color: blue">'.$db.'</h4>'; if(!is_array($tables)) { $tables = [$tables]; } //////////////////////// foreach($tables as $table) { echo 'exporting '.$db.'.<span style="color:red;">'.$table.'</span><br>'; } } echo "<hr>"; } export(["db1" => "*"]); export(["db1" => "db1_table1"]); export(["db1" => ["db1_table1"]]); export(["db1" => ["db1_table1","db1_table2"]]); export(["db1" => ["db1_table1","db1_table2"], "db2" => "*"]); export(["db1" => ["db1_table1","db1_table2"], "db2" => "db2_table1"]); export(["db1" => ["db1_table1","db1_table2"], "db2" => ["db2_table1","db2_table2"]]); export(["db1" => ["db1_table1","db1_table2"], "db2" => ["db2_table1","db2_table2"], "db3" => "*"]); stb...
Második körben valószínűleg a tömbök helyett írnék normálisabb classokat (ez nem biztos).
Harmadik körben pedig valószínűleg elfelejteném ezt az egészet, és használnám a mysqldump-ot.
Mutasd a teljes hozzászólást!

Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd