Jump to content
php.lv forumi

par faliem un DB


bra

Recommended Posts

drši vien ka stūlbs jautājums, bet lieta sekojoša

fails ip.sql vajg dabūt ieš db faila saturs izskatās aptuveni šāds:

INSERT INTO iptocountry VALUES

(33996344,33996351,'GB','GBR','UNITED KINGDOM'),

(50331648,69956103,'US','USA','UNITED STATES'),

(69956104,69956111,'BM','BMU','BERMUDA'),

....................

un vel dafiga daudz rindiņu

kāds varētu izskatīties kods, kurš palīdzētu faila saturu dabūt manīgajā un tad attiecīgi izpildīt visas nepieciešamās darbības (INSET .....)

Link to comment
Share on other sites

Ja failā sql pieprasījumi beidzas ar ";" zīmi, kā tas pienāktos, tad varētu mēģināt šādi:

 

$root = getcwd();
$filename = $root.'ip.sql';
$handle = fopen($filename, 'r');
$filecontents = fread($handle, filesize($filename));

$query_array = explode(";", $filecontents);

foreach ($query_array as $val)
   @mysql_query($val);

 

Tas ir ļoti elementārs veids, bet tam ir trūkumi, ja kaut kur laukos tiek iekļauta ";" zīme, bet izskatījās, ka tev te nav...

Link to comment
Share on other sites

bubu varianc -> ņā itkā laikam šancē tikai

tas gan ir labs errors MYSQL ERROR MYSQL SED:MySQL server has gone away

 

$db = new db;
$db->connect(DbUser, DbPass, DbName); #DB conect
$db->query(file_get_contents('ip.sql'))or die("MYSQL ERROR MYSQL SED:".mysql_error());

Edited by bra
Link to comment
Share on other sites

sadali pieprasiijumus pa gabaliem, nesuuti visus insertus uzreiz, bet pa kaadiem 5k ar pauzeem
nu tas ir diezgan neriāli fails ~1,4 MB, bat ideja nav slikta, tagad rodas jautājums vai pastāv iespēja nolasīt tikai noteiktu rindu skaitu insertot tad nolasīt nākamo un tā līdz viss fails inclūdoc iekš DB jo pieņemu ka tas krietni atvieglotu lielu DB Dumpu updeitošanu.

 

īsāk vai ir iespējams ar php nolasīt piem 500 rindiņas -> izpildīt qeriju un sākt visu no 501 rindiņas.

 

Ideja varētu būt sekojoša

nolasam cik kopā rindas ir failā izdalam ar 500 -> iegūstam blogu skaitu (piem 1000 / 500 = 2 tātad divi bloki) = divi qyeriji

nezinu vai šī ideja darbosies, bet ja darbosies tad nezinu kā to panākt.

 

Varbūt jums ir idejas kā to panākt, vai arī kāds labāks risinājums.

Link to comment
Share on other sites

papildinaats Robis variants

$root = getcwd();
$filename = $root.'ip.sql';
$handle = fopen($filename, 'r');
$filecontents = fread($handle, filesize($filename));
$i=0;
$query_array = explode(";", $filecontents);

foreach ($query_array as $val) {
if($i % 500 == 0){ sleep(2); }
  @mysql_query($val); $i++;}

Link to comment
Share on other sites

<?php
$fails = file("sql.sql");
for($i=0;$i<count($fails);$i++){
$failss = substr($fails[$i], 0, -3);
echo $failss.'<br/>';
mysql_query("INSERT INTO iptocountry VALUES $failss");
}

 

Man strādā ideāli....

P.S. tikai izdzēs pirmo rindinju un pedejai beigas padzees, liksies tev pa vienam query, tikai nezinu cik tas ātri, bet tomēr labāk nekā ar roku...

ko domājat pa vienam query iet ilgāk vai pa pusi sadalot būtu ātrāk ?

Link to comment
Share on other sites

papildinaats Robis variants

$root = getcwd();
$filename = $root.'ip.sql';
$handle = fopen($filename, 'r');
$filecontents = fread($handle, filesize($filename));
$i=0;
$query_array = explode(";", $filecontents);

foreach ($query_array as $val) {
if($i % 500 == 0){ sleep(2); }
  @mysql_query($val); $i++;}

20469[/snapback]

 

hmm izskatās interesanti, tikai viena lieta tāda tur ir vairāk kā 100000 rindiņu :P tādēļ viss_kedaas varianc vilksies vairāķ kā mūžību, bet laikam ātrāk nevarēs

Link to comment
Share on other sites

×
×
  • Create New...