molim pomoc

1

molim pomoc

offline
  • Pridružio: 15 Jul 2009
  • Poruke: 150

Pozdrav svima! Imam jedan problem ne znam kako da ga resim nikako. Hocu jednan backup file baze podataka da prepravim ali mi je veliki problem da to sve rucno radim jer je preko 100mb, pa sam to hteo da uradim pomocu php. Ali tu nastaje problem. Kako to da uradim nekako pomocu preg_match_all ili kako vec, da pomerim id svakog clana za poziciju 300 unapred. Ajde molim vas resite mi to da se ne mucim vise ceo dan pokusavam i nemogu nikako u glavi da konstruisem nikako. Znaci da ovo
VALUES('1'
VALUES('2'
VALUES('3' .......itd itd


bude

VALUES('300'
VALUES('301'
VALUES('302' .......itd itd


Primer sql fajla:

DELETE FROM smf_members; INSERT INTO smf_members VALUES('1', 'Agjhghjin', '1250361911', '0', '1', '', '1255206407', 'Aghghn', '0', '0'); INSERT INTO smf_members VALUES('2', 'rgjhjt', '1250414806', '11682', '0', '', '1252684270', 'rghght', '0', '0'); INSERT INTO smf_members VALUES('3', 'AgjhgjG', '1226057940', '661', '0', '', '1246639076', 'AffghG', '0', '0'); INSERT INTO smf_members VALUES('3960', 'gghjk', '1236791630', '0', '0', '', '1239578062', 'Lhghghk', '0', '0'; INSERT INTO smf_members VALUES('5', 'Rggjhgh8', '1226272200', '0', '0', '', '1226272200', 'Raghgh18', '0', '0'; INSERT INTO smf_members VALUES('7', 'Mhkjhkke', '1226435460', '0', '0', '', '1251683991', 'Misgjhjhe', '0', '0'); INSERT INTO smf_members VALUES('6', 'ozhkjkj2', '1226352600', '0', '0', '', '1227220906', 'oghtghg', '0', '0'); INSERT INTO smf_members VALUES('8', 'pihhjuyji8', '1226442060', '7', '0', '', '1250418859', 'pihhhh', '0', '0'); INSERT INTO smf_members VALUES('9', 'Dattytyvr', '1226515740', '19', '0', '', '1253568254', 'Danihhhh', '0', '0'; INSERT INTO smf_members VALUES('10', 'jfhfghtc', '1226516858', '0', '0', '', '1251504814', 'jyuyuyc', '0', '0'); INSERT INTO smf_members VALUES('18', 'tatyhtguy', '1226715660', '0', '0', '', '1240696645', 'tauyuy', '0', '0'); INSERT INTO smf_members VALUES('13', 'pefgtfy8', '1226583960', '129', '0', '', '1255037233', 'hhhhh', '0', '0');

php sam zamislio na ovaj nacin:

<?php $url = "backup56565654.sql"; $file = file_get_contents($url);  preg_match_all("/(VALUES\(')(.*?)(',)/is",$file,$patterns);   foreach($patterns[2] as $key => $val){     echo $val."<br />\n";   } $myFile2 = "/hdd/novi.sql"; $fh2 = fopen($myFile2, 'w+') or die("ne mogu da otvorim"); fwrite($fh2, str_replace("","",$file)) or die("ne mogu da sacuvam"); fclose($fh2); ?>



Registruj se da bi učestvovao u diskusiji. Registrovanim korisnicima se NE prikazuju reklame unutar poruka.
offline
  • PHP Developer
  • Pridružio: 02 Okt 2005
  • Poruke: 546

a sto to ne uradis u MySQL
update `smf_members` set id=id+300 order by `id` desc;
nije mi jasno sta hoces da postignes, posto ako pomeris id poremetice ti se veze unutar smf koje zavise od njega



offline
  • Pridružio: 15 Jul 2009
  • Poruke: 150

Napisano: 12 Okt 2009 14:46

pokusavam da shvatim princip u ovom slucaju preko php jer mi treba za neke druge stvari

Dopuna: 12 Okt 2009 14:47

brate mili pa zar niko GUZ - Glavom U Zid

offline
  • PHP developer
  • Pridružio: 22 Mar 2006
  • Poruke: 3745
  • Gde živiš: 127.0.0.1

Polako, ima ovde i ljudi koji rade preko dana Wink

Ajd da krenemo od problema prvo: tvoj kod, pod pretpostavkom da je ispravan, nema sanse da ti radi ako je backup od 100 MB u pitanju - barem ne bez da cackas php.ini (sto ne mozes na shared hostingu). Php.ini ima jedno "nezgodno" podesavanje, memory_limit, i po defaultu je ono 32 MB. Ukoliko prekoracis tu cifru, fatal error.

Sledece na redu su greske u razmisljanju: toliki fajl ni u ludilu ne uzimas sa file_get_contents() - ja se i za daleko manje fajlove razmisljam sta je bolje, i brze od toga. Dalje, povuces ogromni fajl, primenis neki RegExp za koji (verovatno) ni sam ne znas kako radi, i onda, kao slag na tortu, koristeci str_replace menjas nista nicime i to upisujes u novi fajl.

Dakle, |_MeD_| ti je lepo rekao: najlaksi nacin za ovo je direktno komuniciranje sa MySQL serverom. Pretpostavimo da ti je to nemoguce, i da moras da ga izmenis koristeci PHP.

<?php    // otvoris fajl iz koga citas    // ukoliko nisi na Win-u, skloni b iz "rb"    $file = fopen("./old.sql", "rb");    // otvoris fajl u koji pises    $handle = fopen("new.sql","w");    // dok god ne dodjes do kraja fajla    while (!feof($file)) {       // procitaj samo jednu liniju tog fajla       $line = fgets($file, 8192);       // uzimas ID clana iz linije, zapisujes u $out[1]       preg_match("@INSERT INTO smf_members VALUES\('([0-9]+)'@Ui", $line, $out);       // svaki ID clana menjas povecanim za 300       $line = str_replace($out[1],$out[1]+300,$line);       // ne znam sta ce ti echo ;)       echo $line;       //upises u fajl       fwrite($handle,$line);    }    // zatvoris fajl iz koga citas    fclose($file);    // zatvoris fajl u koji pises    fclose($handle); ?>

Ukoliko pretpostavimo da si zaobisao memory_limit: a pretpostavka je inace majka svih zaj**a....

<?php     // "uzmes" ceo fajl, ali u niz, ne u string     // i preskocis prazne linije, jer ti verovatno ne trebaju    $file = file("./old.sql",FILE_SKIP_EMPTY_LINES);    // otvoris novi fajl u WRITE modu - W+ je WRITE AND READ    $handle = fopen("new.sql","w");    //za svaku liniju iz prvobitnog fajla    foreach ($file as $line) {       // uzimas ID clana iz linije, zapisujes u $out[1]       preg_match("@INSERT INTO smf_members VALUES\('([0-9]+)'@Ui", $line, $out);       // svaki ID clana menjas povecanim za 300       $line = str_replace($out[1],$out[1]+300,$line);       // ne znam sta ce ti echo ;)       echo $line;       //upises u fajl       fwrite($handle,$line);    }    // nakon sto sve linije fajla prodju kroz pretlju    // zatvoris novi fajl    fclose($handle); ?>

Drugi nacin, slican ali bez RegExp. Sve je isto, osim linije u kojoj je:

preg_match("@INSERT INTO smf_members VALUES\('([0-9]+)'@Ui", $line, $out);

Umesto nje mozes i :

$out = explode("'",$line);

i da dobijes apsolutno isti rezultat.

offline
  • Pridružio: 15 Jul 2009
  • Poruke: 150

Napisano: 13 Okt 2009 19:06

eh sta reci nego svaka cast Ziveli Hvala puno covek se uci dok je ziv tako da ne zameri na nervozi bilo mi je hitno a nisam nasao nacin kako a inace skriptu sto sam okacio je bezveze nema veze sa vezom na njoj sam samo izvlacio pregmatchom ono u zagradi i iscitavao echom i nisam puno obracao paznju kad sam je uploadovao

Dopuna: 13 Okt 2009 19:16

e da zaboravio sam pitati ono sto me najvise muci od svega toga. Na primer uzecu ovaj code



<?php $url = "backup56565654.sql"; $file = file_get_contents($url);  preg_match_all("/(VALUES\(')(.*?)(',)/is",$file,$patterns);   foreach($patterns[2] as $key => $val){     echo $val;   } ?>

e sad kad otvorim browserom izlista mi sve to. Ali ono sto me muci kad echo $val; stavim posle zagrada {} ovako

<?php $url = "backup56565654.sql"; $file = file_get_contents($url);  preg_match_all("/(VALUES\(')(.*?)(',)/is",$file,$patterns);   foreach($patterns[2] as $key => $val){       } echo $val; ?>


icita mi samo poslednju liniju. Kako da napravim funkciju najprostiju da $val prebacim u nju da bi posle echom mogao iscitati sve te linije ako me razumes

offline
  • PHP developer
  • Pridružio: 22 Mar 2006
  • Poruke: 3745
  • Gde živiš: 127.0.0.1

Uf... reci mi, gde bas nadje da se igras sa RegExp-om kad ti i osnove php-a ne idu bas najbolje...

'Ajmo opet: funkcija file_get_contents() ceo fajl smesta u jedan string, odnosno u jednu promenljivu. Dakle, tu nemas vise linija - samo jednu (koja doduse moze da ima linebreaks u sebi).

Dalje, pazi sta radis:

  foreach($patterns[2] as $key => $val){       } echo $val;

Prvo, imas gresku u startu: ako $patterns[2] nije niz, nego obicna promenljiva, ovde dobijas warning. Zasto: zato sto je foreach komanda koja doslovno kaze "za svaki element niza uradi...".

Drugo, i ne manje vazno: ono sto zelis da se ponavlja za svaki element niza smestis izmedju { i }, a ne van petlje. Ako je van petlje, onda nece da se izvrsi unutar petlje, zar ne?

offline
  • Pridružio: 15 Jul 2009
  • Poruke: 150

ok nije ni bitno nismo se razumeli. Ja ustvari i hocu da smestim van petlje pa zato pitam kako to da izvedem. Dali moze da se smesti u neku funkciju na primer

offline
  • PHP developer
  • Pridružio: 22 Mar 2006
  • Poruke: 3745
  • Gde živiš: 127.0.0.1

Cek, cek polako Smile da bi resio neki problem, moras prvo da ga definises, a to ti, cini mi se, nisi uradio.

Dakle, pitanje je: Sta zelis da uradis?

offline
  • Pridružio: 15 Jul 2009
  • Poruke: 150

pozdrav svima, evo ovako najjednostavnije. Znaci imam textualni fajl sa 5 linija, naprimer:

eeeeeeeeeeeeeeeeeeeeeee
ddddddddddddddddddddddd
tttttttttttttttttttttttttttttttttttttttt
yyyyyyyyyyyyyyyyyyyyyyy
iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii

kada ovako stavim:

$providers = file ("txt.txt");
foreach ($providers as $currentline){
echo $currentline;
}

rezultat bude:

eeeeeeeeeeeeeeeeeeeeeee
ddddddddddddddddddddddd
tttttttttttttttttttttttttttttttttttttttt
yyyyyyyyyyyyyyyyyyyyyyy
iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii

ali kada ovako stavim:

$providers = file ("txt.txt");
foreach ($providers as $currentline){
$list = $currentline;
}
echo $list;

rezultat bude:

iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii

To sto meni treba je da shvatim princip kako da uradim da $list ne bude u petlji a da rezultat bude kao onaj prvi sa svih 5 linija.

offline
  • Pridružio: 20 Dec 2004
  • Poruke: 2887
  • Gde živiš: Na Balkanu

U prvom primeru ispisuješ liniju po liniju, a u drugom linije smestaš u $list.
Smestiš prvu liniju, pa onda drugu. Odnosno, drugu snimiš preko prve i tako dalje. Na kraju prikažež promenljivi $list koja zapravo sadrži samo poslednju liniju, a trebalo bi da prikazuješ liniju po liniju.

$providers = file ("txt.txt"); foreach ($providers as $currentline){ $list = $currentline; echo $list; }

Ko je trenutno na forumu
 

Ukupno su 918 korisnika na forumu :: 47 registrovanih, 3 sakrivenih i 868 gosta   ::   [ Administrator ] [ Supermoderator ] [ Moderator ] :: Detaljnije

Najviše korisnika na forumu ikad bilo je 3466 - dana 01 Jun 2021 17:07

Korisnici koji su trenutno na forumu:
Korisnici trenutno na forumu: 8u47, _Rade, Asparagus, babaroga, Bobrock1, bokisha253, Boris Bosiljčić, BORUTUS, Brana01, comi_pfc, cvrle312, darcaud, DENIRO, Dimitrise93, DPera, dragoljub11987, dragon986, dule10savic, FileFinder, Georgius, h8propaganda, hooraay, ikan, ILGromovnik, JOntra, Kubovac, Lieutenant, mercedesamg, mile23, milenko crazy north, misa1xx, novator, opt1, pera bager, prle122, repac, Ripanjac, stegonosa, vathra, VJ, Vladko, vladulns, Volkhov-M, VP6919, wolverined4, zziko, 125