Jump to content
php.lv forumi

Datu sadalishana no Mysql


Lynx

Recommended Posts

Atkal saskaros ar problemu, ko nesanak atrisinat. Ideja tada ka mysql datubaze man ir saglabats liels ieraktu daudzums, kur katrs ieraksts tiek atdalits ar |. Un man vajag shos visus ierakstus sadalit un parverst par arrays. Pamekleju info pa manualiem, pamekleju paraugus, nesanaca palaist, bet shitik talu tiku:

 

Pedeja versija ko sameistaroju, bet vvz vai labaka:

 

$sektora_dati = mysql_query("SELECT * FROM lietotaji WHERE username ='".$username."'");

while ($row =mysql_fetch_array($sektora_dati)) {

$filedata = $row[pabijis_sektoros];

$filedata = array();

foreach ($filedata as $row){

list($sektori) = explode('|', $row);

$bijis_sektoros[] = array('sektori' => $sektori);

}

}

 

Shita ieprieksheja:

 

list($filedata) = mysql_fetch_row(mysql_query('SELECT pabijis_sektoros FROM lietotaji WHERE username = "'.$username.'"'));

$filedata = array();

foreach ($filedata as $row){

list($sektori) = explode('|', $row);

$bijis_sektoros[] = array('sektori' => $sektori);

}

Link to comment
Share on other sites

ir divas lietas.

 

1) vai esi kaut ko dzirdeejis par datubaazu normaalformaam un datu struktureeshanu? Nudien nedomaaju, ka datubaazee datus vajadzeetu atdaliit ar |

 

2) $filedata = $row[pabijis_sektoros];

$filedata = array();

 

Vai ir jeega pieshkjirt mainiigajam kaadu veertiibu, ja tuuliit naakamajaa rindinjaa tu mainiigo paarveert par tukshu masiivu?

Link to comment
Share on other sites

1)Itka citas iespejas neesmu iedomajies, jo man ir nepiecieshams datubaze ievadit lidz max 10000(pagaidam) ierakstiem katram lietotajam.

 

 

 

2) Nu jaa noobiska kluda, ka neka ar arrats neesmu diezko daudz kodejis, parsvara izgaju uz citiem risinajumiem. Tagad tas viss izskatas shadi:

 

$sektora_dati = mysql_query("SELECT * FROM lietotaji WHERE username ='".$username."'");

while ($row =mysql_fetch_array($sektora_dati)) {

$filedata = $row[pabijis_sektoros];

$filedata2 = array($filedata);

foreach ($filedata2 as $row){

list($sektori) = explode('|', $row);

$bijis_sektoros[] = array('sektori' => $sektori);

}

}

 

Bet atkal nestrada. Isti pat nesaprotu kur meklet kludu...

Link to comment
Share on other sites

Tur vispār kautkas mistisks darās!

$filedata2 = array($filedata);
foreach ($filedata2 as $row){

Kāda jēga uztaisīt vispirms masīvu, un pēc tam izņemt visu ārā? To divu rindiņu vietā nebija vienkāršāk uzrakstīt: $row = $filedata?

 

list($sektori) = explode('|', $row);

Kā jau Venom iesāka teikt: explode atgriež masīvu, bet list piešķir saviem parametriem masīva elementus nevis pašu masīvu. Tātad tev iznāk, ka $sektori saturēs pirmo $row elementu, nevis visu masīvu!

 

Bet kā jau Kaklz sākumā teica, šīs ir galīgi greizs ER modelis. Tev dati jādala divās tabulās: lieotāji(lietotāja_ID, username, ... u.c dati) un sektori(lietotāja_ID, sektora_nosaukums, ... u.c.dati). Un tad ja tu gribi dabūt lietotāja sektorus pēc viņa username, tad jāraksta apmēram šādi (PSEIDOKODS):

 $sekotri = "SELECT sekotra_nosaukums from lietotaji, sekotri WHERE username=$username AND lietotaji.lietotaja_ID = sektori.lietotaja_ID";

Link to comment
Share on other sites

Hmm nu labi atmetu ideju ar to datu sadalishanu, ka neka lietojot visu laiku mysql nekad nebiju meiginajis rakstit shos te brinumus, lai izvilktu datus no txt faila piemeram un sadalitu mainigajos.

Bet ar tiem sektoriem lieta nav tik vienkarsha. Ideja ka viss strada ir ka ir 10000 sektori un vairaki 10miti lietotaju. Un ir japieregistre kuri cilveki ir kura sektora bijushi, lai pec tam to velak varetu atainot uz ta cilveka kartes. Tapec itka paveras 2 iespejas ka veidot: Vai nu izveidot table apmekletie_sektori izveidot rowus id, username, un tad 10000 rowus prieksh katra sektora, lai varetu salikt 1niniekus ja sektors apmeklets. Vai ari meiginat dabut gatavu to failu sadalishanu no viena rowa. Kas ir atrak un efektivak es isti nezinu, tapec jautaju tagad padomu sheit. Un varbut vel ir kads 3ais variants kuru es nevaru iedomaties?

Link to comment
Share on other sites

1) vai esi kaut ko dzirdeejis par datubaazu normaalformaam un datu struktureeshanu? Nudien nedomaaju, ka datubaazee datus vajadzeetu atdaliit ar |

Reizeem tas ir visai noderiigi / izdeviigi / aatrdarbiigi.

Piemeeram ja nepiecieshams kaadam ierakstam piekaartot dinamiska daudzuma viena tipa laukus/veertiibas - teiksim indeksus.

Protams var taisiit papildus tabulu kura satur katraa ierakstaa savu indeksu un noraadi uz ierakstu kursh to satur. Tad pie daudz ierakstiem un indeksiem shii tabula sanaak vienkaarshi milzoniiga un lai atrastu kautvai ierakstu(s) kursh(i) satureetu divus indeksus sanaak paarlasiit un taisiit intersectu diezgan lielam datu apjomam, kas ir leenu. Turpretii peec '|' sadaliishanas sheemas shaadu pieprasiijumu var diezgan viegli un aatri veikt ar parastaam string mekleeshanas funkcijaam (like, substring utt).

 

Protams dazhaadu datu glabaashana vienaa laukaa nav diezko jeedziiga. Lai arii no cita aspekta, ja veelaak nav nepiecieshama atlasiishana/mekleeshana peec konkreeta lauka, tad shaadi var ieguut db kurai dati aiznjem vismazaak vietas.

Proti ja defineejam konkreetu lauku seciibu teiksim Vards|Uzvards|Dzimums|Vecums|Unveelchupaardazhaadiem

tad gadijumaa ja lietotaajs(i) nebuus aizpildiijushi kaadu no laukiem tad db ievietojamaa datu virkne buus vienkaarshi iisaaka preteeji tuksham / NULL laukam ja katrai veertiibai buus defineets savs lauks.

Link to comment
Share on other sites

Vai nu izveidot table apmekletie_sektori izveidot rowus id, username, un tad 10000 rowus prieksh katra sektora, lai varetu salikt 1niniekus ja sektors apmeklets. Vai ari meiginat dabut gatavu to failu sadalishanu no viena rowa.

 

Te jaizskjir divi varianti: Vai tev nepiecieshams zinaat vai lietotaajs vispaar ir bijis sektooraa vai arii konkreeti jaazin kad un cik reizes tas ir noticis?

 

Ja apmekleejuma laiks nav buutisks tad var meegjinaat jau tevis saakotneeji iecereeto atdaliishanu ar '|'

Proti nepiecieshams tikai viens kverijs.

UPDATE tabula SET apmeklejums = CONCAT(apmeklejums,'|',$sektora_id) WHERE uid = '$uid' kur teiksim sektora_id ir apmekleetais sektors un uid lietotaaja id, un sektori tikai kraasies galaa, peec tam diezgan vienkaarsho noselecteet visus lietotaaja apmekleetos sektorus.

 

Otrs variants ir kaa bubu saka izmantot atseviskju tabulu kur ir lietotaaja ID un Sektora id (opcionaali arii citi lauki kaa apmekleejuma laiks utt) un katrs apmekleejums tiek ielikts kaa jauns ieraksts.

 

Katram veidam ir savas priekshrociibas un miinusi - izveele tavaa zinjaa :)

 

Es izveleetos otro, jo tad pastaav iespeeja arii kaadaa briidii tiiriit kaut kaadu ljoti vecu veesturi kaa arii peciizaak izsekot kad un kas ir noticis.

Link to comment
Share on other sites

×
×
  • Create New...