Hinnavaatlus
:: Foorum
:: Uudised
:: Ärifoorumid
:: HV F1 ennustusvõistlus
:: Pangalink
:: Telekavad
:: HV toote otsing
|
autor |
|
Janno1991
HV vaatleja
liitunud: 20.04.2010
|
23.05.2012 15:57:55
MySql insert läbi for()'i |
|
|
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:
|
for ($i =1; $i <= $countid; $i++) { $sql="SELECT * FROM korter where id = $i"; $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));"; }
|
|
|
Kommentaarid: 3 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
1 |
|
tagasi üles |
|
 |
infidel
HV kasutaja

liitunud: 31.01.2004
|
23.05.2012 16:16:44
|
|
|
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 |
|
 |
Janno1991
HV vaatleja
liitunud: 20.04.2010
|
23.05.2012 16:39:44
|
|
|
infidel, Hakkas tööle. Tänud!
|
|
Kommentaarid: 3 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
1 |
|
tagasi üles |
|
 |
serk
HV kasutaja
liitunud: 24.05.2003
|
|
Kommentaarid: 8 loe/lisa |
Kasutajad arvavad: |
   |
:: |
1 :: |
0 :: |
7 |
|
tagasi üles |
|
 |
Janno1991
HV vaatleja
liitunud: 20.04.2010
|
02.06.2012 02:07:02
|
|
|
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 |
|
 |
Le Inc
HV Guru

liitunud: 06.09.2002
|
03.06.2012 12:59:26
|
|
|
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 |
|
 |
andrusny
Kreisi kasutaja

liitunud: 20.03.2006
|
03.06.2012 13:57:35
|
|
|
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 |
|
 |
Fukiku
Kreisi kasutaja

liitunud: 06.11.2003
|
03.06.2012 15:04:53
|
|
|
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 |
|
 |
infidel
HV kasutaja

liitunud: 31.01.2004
|
04.06.2012 07:57:09
|
|
|
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 |
|
 |
|
lisa lemmikuks |
|
|
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
|
|