Avaleht
uus teema   vasta Tarkvara »  Programmeerimine »  MySql insert läbi for()'i märgi kõik teemad loetuks
märgi mitteloetuks
vaata eelmist teemat :: vaata järgmist teemat
Hinnavaatlus :: Foorum :: Uudised :: Ärifoorumid :: HV F1 ennustusvõistlus :: Pangalink :: Telekavad :: HV toote otsing
autor
sõnum Saada viide sõbrale.  :: Teata moderaatorile teata moderaatorile
otsing:  
Janno1991
HV vaatleja

liitunud: 20.04.2010



Autoriseeritud ID-kaardiga

sõnum 23.05.2012 15:57:55 MySql insert läbi for()'i vasta tsitaadiga

Tervist!

Olen mitu päeva üritanud tööle saada lehte kus läbi for() lisatakse mingi hulk kirjeid tabelisse.
Probleem on selles, et tabelisse jõuab ainult viimane kirje. Äkki keegi targem oskab seda probleemi siin lahendada.
$countid on kolm..
php:
  1. for ($i =1; $i <= $countid; $i++) {
  2.                                 $sql="SELECT * FROM korter where id = $i";
  3.                                         $result=mysql_query($sql);
  4.                                                 while($rows=mysql_fetch_array($result)){
  5.                                                                 $kid = $rows['id'];
  6.                                                                         }
  7.                                         $sql= "INSERT INTO karved (kid,elekter,vesi) VALUES
  8.                                                         ('$kid','$eround',(select (k_kylmvesi-kylm_vana)*kylm from hinnad, k_naidud where k_naidud.id =$kid));";
  9.  }
Kommentaarid: 3 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 1
tagasi üles
vaata kasutaja infot saada privaatsõnum
infidel
HV kasutaja
infidel

liitunud: 31.01.2004




sõnum 23.05.2012 16:16:44 vasta tsitaadiga

Nagu näha, saadetakse tsükli sees baasi ainult SELECT päring. INSERT päring läheb muutujasse $sql, kuid sellega ei tehta tsükli jooksul enam midagi. Ilmselt toimub selle baasi lükkamine tsükli järel (seetõttu jõuabki baasi ainult viimane).
Lahendus nt selline:
    for ($i =1; $i <= $countid; $i++) {
                                    $sql="SELECT * FROM korter where id = $i";
                                            $result=mysql_query($sql);
                                                    while($rows=mysql_fetch_array($result)){
                                                                    $kid = $rows['id'];
                                                                            }
                                            $sql= "INSERT INTO karved (kid,elekter,vesi) VALUES
                                                            ('$kid','$eround',(select (k_kylmvesi-kylm_vana)*kylm from hinnad, k_naidud where k_naidud.id =$kid));";
                                            $result=mysql_query($sql);
     }


EDIT: Sellise variandi puhul tuleb tsükli järel olev baasiühendus eemaldada, muidu tuleb viimane kirje topelt.
Kommentaarid: 36 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 35
tagasi üles
vaata kasutaja infot saada privaatsõnum
Janno1991
HV vaatleja

liitunud: 20.04.2010



Autoriseeritud ID-kaardiga

sõnum 23.05.2012 16:39:44 vasta tsitaadiga

infidel, Hakkas tööle. Tänud!
Kommentaarid: 3 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 1
tagasi üles
vaata kasutaja infot saada privaatsõnum
serk
HV kasutaja

liitunud: 24.05.2003




sõnum 01.06.2012 14:30:38 vasta tsitaadiga

Ära kasuta sellist lähenemist andmete sisestamiseks, enam ebaeffektiivsemat moodust olemas ei ole.
Hea kirjeldus ja õpetus natuke paremaks lähenemiseks:
http://stackoverflow.com/questions/779986/insert-multiple-rows-via-a-php-array-into-mysql - ilusti kirjeldatud mitu erinevat viisi kuidas andmeid sisestada.

Kui kõik muu tundub liiga keeruline, siis vähemalt auto commit pane falseks batch inserdi ajal.
Kommentaarid: 8 loe/lisa Kasutajad arvavad:  :: 1 :: 0 :: 7
tagasi üles
vaata kasutaja infot saada privaatsõnum
Janno1991
HV vaatleja

liitunud: 20.04.2010



Autoriseeritud ID-kaardiga

sõnum 02.06.2012 02:07:02 vasta tsitaadiga

infidel kirjutas:

EDIT: Sellise variandi puhul tuleb tsükli järel olev baasiühendus eemaldada, muidu tuleb viimane kirje topelt.

Kusjuures enne seda viga ei tekkinud, kuid nüüd hakkas jamama jah. Mis täpsemalt ära võtma peaks, et viimane ID topelt ei läheks?

serk, Tänud info eest aga hetkel tundub see natuke keeruline minu jaoks ja ega enam polegi aega seda muuta.
Kommentaarid: 3 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 1
tagasi üles
vaata kasutaja infot saada privaatsõnum
Le Inc
HV Guru
Le Inc

liitunud: 06.09.2002



Autoriseeritud ID-kaardiga

sõnum 03.06.2012 12:59:26 vasta tsitaadiga

Võid kasutada näiteks php array'd. Valid midagi baasist kirjutad massivi ja sealt kirjutad for tagasi baasi. Peale igat insert pole vist mõttekas commit vajutada, teed oma tsükli ära ja siis kinnitad.

Ehk on selline ülesehitus loogilisem.
Kommentaarid: 56 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 54
tagasi üles
vaata kasutaja infot saada privaatsõnum
andrusny
Kreisi kasutaja
andrusny

liitunud: 20.03.2006




sõnum 03.06.2012 13:57:35 vasta tsitaadiga

Aga kas siis ei või tekkida selline olukord, et vahepeal jõuab mõni mats baasi uuendada ja sa kirjutad uuendused üle.
_________________
Kommentaarid: 7 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 7
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
Fukiku
Kreisi kasutaja
Fukiku

liitunud: 06.11.2003




sõnum 03.06.2012 15:04:53 vasta tsitaadiga

andrusny kirjutas:
Aga kas siis ei või tekkida selline olukord, et vahepeal jõuab mõni mats baasi uuendada ja sa kirjutad uuendused üle.
Kui sa transaktsiooni ei commiti iga päringu järel, siis ei saa nii juhtuda. php puhul ma saan aru, et vaikimisi on auto-commit peal iga päringu järel - see tuleks käsitsi maha võtta ja lõpus käsitsi commitida.
_________________
Foxic is just a simple fox
Enne kui sa küsid oma küsimuse - küsi seda vannipardilt! Rangelt soovitatav enne programmeerimise alafoorumisse uue teema tegemist.
Kommentaarid: 2 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 2
tagasi üles
vaata kasutaja infot saada privaatsõnum
infidel
HV kasutaja
infidel

liitunud: 31.01.2004




sõnum 04.06.2012 07:57:09 vasta tsitaadiga

Janno1991 kirjutas:
infidel kirjutas:

EDIT: Sellise variandi puhul tuleb tsükli järel olev baasiühendus eemaldada, muidu tuleb viimane kirje topelt.

Kusjuures enne seda viga ei tekkinud, kuid nüüd hakkas jamama jah. Mis täpsemalt ära võtma peaks, et viimane ID topelt ei läheks?

Üks variant on teha nii:
    for ($i =1; $i <= $countid; $i++) {
                                    $sql="SELECT * FROM korter where id = $i";
                                            $result=mysql_query($sql);
                                                    while($rows=mysql_fetch_array($result)){
                                                                    $kid = $rows['id'];
                                                                            }
                                            $sql= "INSERT INTO karved (kid,elekter,vesi) VALUES
                                                            ('$kid','$eround',(select (k_kylmvesi-kylm_vana)*kylm from hinnad, k_naidud where k_naidud.id =$kid));";
                                            $result=mysql_query($sql);
                                            $sql= "";
     }

Kuna ei tea, kus kohas ja millises kontekstis järgmine baasi poole pöördumine on, siis aitab ka muutuja tühjendamine.

Efektiivsuse teemal väga sõna ei tahaks võtta. Kui hakata optimeerima enne asjadest arusaamist, on tulemuseks veel suurem segadus kui enne.
Kommentaarid: 36 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 35
tagasi üles
vaata kasutaja infot saada privaatsõnum
näita postitusi alates eelmisest:   
uus teema   vasta Tarkvara »  Programmeerimine »  MySql insert läbi for()'i
[vaata eelmist teemat] [vaata järgmist teemat]
 lisa lemmikuks
näita foorumit:  
 ignoreeri teemat 
sa ei või postitada uusi teemasid siia foorumisse
sa ei või vastata selle foorumi teemadele
sa ei või muuta oma postitusi selles foorumis
sa ei või kustutada oma postitusi selles foorumis
sa ei või vastata küsitlustele selles foorumis
sa ei saa lisada manuseid selles foorumis
sa võid manuseid alla laadida selles foorumis



Hinnavaatlus ei vastuta foorumis tehtud postituste eest.