Janis Kalejs Posted February 23, 2010 Report Share Posted February 23, 2010 Sveiki visiem! No CSV faila jādabū vērtības datubāzē. $query = " INSERT INTO datatable2(`key`, `count`, `price`,`date`) VALUES "; while ($val = fgetcsv($res, 9999999, ' ')) { if ($c > 0) { if ($c > 1) $query = $query . " , "; $query = $query . " ('$val[0]','$val[1]','$val[2]','$val[3]') "; } $c ++; } fclose($res); echo $query . " ;"; mysql_query($query . " ;",$marketdb); `count` ir int(11) `price` ir decimal(6,4) Problēma ir tā, ka abi lauki aizpildās ar 0, int ar 0 , decimal ar 0.0000 No ekrāna izkopēto izdruku palaižot, inserts nostrādā, korekti saglabājas korekti daļskaitļi. Kas jāizdara, lai mysql_query() liek pareizas vērtības? Quote Link to comment Share on other sites More sharing options...
Grey_Wolf Posted February 23, 2010 Report Share Posted February 23, 2010 idejiski nekas nav jadara Mysql lieliski ar to tiek galaa a parejie lauki aizpildas korekti ?? Quote Link to comment Share on other sites More sharing options...
Aleksejs Posted February 24, 2010 Report Share Posted February 24, 2010 Varbūt nevajag likt skaitliskās vērtības pēdiņās... Varbūt uzģenerētais INSERT vaicājums par garu PHPiskajam mysql_query()... Quote Link to comment Share on other sites More sharing options...
2easy Posted February 24, 2010 Report Share Posted February 24, 2010 (edited) skaitļu likšana apostrofos ir lamerīga, taču kļūdas tā nerada kad testēju performanci, mysql_query() sākās problēmas ar kverijiem, kas ir vairākus desmitus megabaitu lieli, neskatoties uz to, ka my.ini bija max_allowed_packet=100M (by default ir tikai 1M). tāpēc tie inserti ir jāsadala pa mazākām porcijām, ja grib barot iekšā mysql_query() (~10MB laikam vēl bija ok). anyway, ja query būtu par lielu, tad tu vnk ieraudzītu erroru "MySQL server has gone away" :D:D:D un tabulās vsp neviena rinda neierakstītos :P un šāds query arī ieraksta 0, nevis 123,456? mysql_query('INSERT datatable2 (`key`, `count`, `price`, `date`) VALUES (1, 123, 456, NOW())'); Edited February 24, 2010 by 2easy Quote Link to comment Share on other sites More sharing options...
Janis Kalejs Posted February 24, 2010 Author Report Share Posted February 24, 2010 $query = " INSERT INTO datatable2(`key`, `count`, `price`,`date`) VALUES ( ?, ?, ?, ?)"; $stmt = mysqli_prepare($link,$query); while ($val = fgetcsv($res, 9999999, ' ')) { if ($c > 0) { $d = 1.2; $i = 1; //$d = ()$val[8]; //$i = ()$val[16]; $stmt->bind_param('sdii',convert($val[0]),$d,$i,$indate); $stmt->execute(); } } Ar un bez pēdiņām nav starpības. Ja tieši uzliek skaitļus viss strādā. Sāku domāt kaut, kā tās vērtības jā apstrādā no array. Vai nav tā, ka ja CSV fails ir radīts UNIX vai kur citur kodējums kaut kā jāmaina, lai PHP spētu konvertēt uz pareizo formātu. $d = (string) $val[8]; $i = (int) $val[16]; Vienkārši konversācija nepalīdz ja kas :). Quote Link to comment Share on other sites More sharing options...
bubu Posted February 24, 2010 Report Share Posted February 24, 2010 Tabulu laukiem count un price tiešām ir pareizi datu tipi? Quote Link to comment Share on other sites More sharing options...
Janis Kalejs Posted February 24, 2010 Author Report Share Posted February 24, 2010 Datu tipus skriptā rakstu sekojoši: `count` int(11) unsigned NOT NULL, `price` decimal(6,4) NOT NULL, Īsti nezinu vai pareizi. Cenai vajag 4 zimes aizkomata. Skaits iespējas pietiktu ar int bez garuma norādīšanas Quote Link to comment Share on other sites More sharing options...
2easy Posted February 24, 2010 Report Share Posted February 24, 2010 Ja tieši uzliek skaitļus viss strādā. značit pirms tam nebija uzlikti skaitļi. btw stringu konvertējot par skaitli, var viegli dabūt 0 Quote Link to comment Share on other sites More sharing options...
Janis Kalejs Posted February 24, 2010 Author Report Share Posted February 24, 2010 značit pirms tam nebija uzlikti skaitļi. btw stringu konvertējot par skaitli, var viegli dabūt 0 Kā lai no šī array dabū konvertāciju PHP neuztaisa kautkādu pointeri uz objektu ? $d = $val[8]; $i = $val[16]; Izmēģināju jau n variantus konvertācijai nepalīdz :-). Kādas idejas? Quote Link to comment Share on other sites More sharing options...
Janis Kalejs Posted February 24, 2010 Author Report Share Posted February 24, 2010 Starp citu ja ar echo $d; printē vērtības drukājas uz ekrāna normālas, tas tādas kādas tās ir CSV. Quote Link to comment Share on other sites More sharing options...
2easy Posted February 24, 2010 Report Share Posted February 24, 2010 (edited) beigās jau atklāsies tas prikols... Edited February 24, 2010 by 2easy Quote Link to comment Share on other sites More sharing options...
xPtv45z Posted February 25, 2010 Report Share Posted February 25, 2010 Ko izvada echo '_'.$d.'_'; ? Quote Link to comment Share on other sites More sharing options...
Janis Kalejs Posted February 25, 2010 Author Report Share Posted February 25, 2010 Ko izvada echo '_'.$d.'_'; ? Echo izvada: _2.47__0.23__0.70__7.30__1.27__5.78__4.75__2.46__2.37__2.36__0.48__5.35__1.42__3.96__0.72__ Ja $d = (double) $val[8]; tad _0__0__0__0__0__0__0_; Es saprotu ka 0 nozīmē ka konversācija nav sanākusi(false). Tāpēc arī pie inserts visur saliek 0. No kā izriet nākamais jautājums :). Kā var droši nokonvertēt string uz number. Jeb tam PHP kautkāda globalizācija nav iestādīta ( analogi kā .NET) ? Daļskaitlis ir "." vai "," un pēc tā konvertē? Quote Link to comment Share on other sites More sharing options...
2easy Posted February 25, 2010 Report Share Posted February 25, 2010 Es saprotu ka 0 nozīmē ka konversācija nav sanākusi(false). nē, neko nevajag speciāli konvertēt. vnk nejauši kkādā veidā tev dati ir kļuvuši pa nullēm. kkā vajag to debugot. katrā rindiņā taisīt echo, līdz atrodi vietu, kur bija normāls skaitlis un kur parādījās 0 Quote Link to comment Share on other sites More sharing options...
Janis Kalejs Posted February 25, 2010 Author Report Share Posted February 25, 2010 (edited) Tā ir konvertācija echo $val[8]; ---> 1.2 $d = (float)$val[8]; echo $d; ---> 0; Jāpastudē setlocale un LC_CTYPE for character classification and conversion, for example strtoupper() LC_MONETARY for localeconv() Edited February 25, 2010 by Janis Kalejs Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.