PHP i MySQL problem dupliranja slogova

PHP i MySQL problem dupliranja slogova

offline
  • Pridružio: 01 Jul 2010
  • Poruke: 3

Zna li neko zasto se desava duplo upisivanje slogova u MySQL bazu?
Imam jednu skriptu u kojoj upisujem novi slog u bazi (tablici) sa popunjenim jednim podatkom (sifrom), zatim u istoj skripti otvaram formu i nakon submit-a vrsim UPDATE ostalih podataka na upisani slog. Nakon toga u istoj skripti u drugu tablicu upisujem novi slog sa podacima iz submitane forme. Kao rezultat najcesce dobijem u prvoj tablici slog sa prvotno upisanim podatkom (sifrom) te duplirani slog sa upisanim svim podacima (sifrom i podacima iz forme). U drugoj tablici takodje dobijem duplo upisani slog.
U cemu je problem ?!!!



Registruj se da bi učestvovao u diskusiji. Registrovanim korisnicima se NE prikazuju reklame unutar poruka.
offline
  • Pridružio: 15 Maj 2006
  • Poruke: 333
  • Gde živiš: Babušnica

Pozdrav i dobrodošao na forum!

Na koji način vršiš update tj. kako si postavio uslov za update? Da li ti je bitno da sam unosiš šifru ili ne (zbog toga što prvo upisuješ slog samo sa šifrom) ?



offline
  • Peca  Male
  • Glavni Administrator
  • Predrag Damnjanović
  • SysAdmin i programer
  • Pridružio: 17 Apr 2003
  • Poruke: 23211
  • Gde živiš: Niš

verovatno dva puta izvrsavas query Confused
postavi php skript ovde, da vidimo.

offline
  • Pridružio: 01 Jul 2010
  • Poruke: 3

Napisano: 01 Jul 2010 20:44

Skripta je podugacka, ali evo detaljnije cu opisati kako radi i delove koda koji bi mogli biti problematicni.
Radi se o skripti kojom vrsim uclanjenje novih clanova u jedan klub. Kada posetilac popuni pristupnicu podaci iz te forme se upisuju u privremenu bazu (tablicu). Nakon toga ja pomocu sporne skripte vrsim prepis tih podataka u stalnu MySQL tablicu, generisem lozinku te vrsim UPDATE na prepisani slog i na kraju saljem email sa korisnickim imenom i lozinkom.
if ($_GET['action'] == "COPY")    {       uclani($_GET['slog'],$_GET['znak']); } elseif ($_GET['action'] == "DELETE")    {       obrisi($_GET['slog']); } elseif ($_GET['action'] == "KRAJ")    {       mysql_close($db);       die("<br> ZATVARAM BAZU !!!"); }    Prepis i update vrsim u funkciji uclani(). function uclani($brojID,$znak)   {    /*    ovde pozvati funkciju za generisanje   KORISNICKOG IMENA i  LOZINKE       i funkciju  koja  salje EMAIL    sa cestitkom uputstvom za Logiranje   i podacima    korisnicko ime i lozinku   i napomena da to moze promeniti u    PROFILI    */    $sql = "SELECT * FROM klub_tmp WHERE id='$brojID'";    if (!$q=mysql_query($sql)) {       echo "Greška u izvršenju upita - uclani - SELECT klub_tmp!!!";      // greska u izvrsenju upita       die();    }    $red = mysql_fetch_array($q); /* zatim prebacim podatke u varijable te vrsim prepis */    $upis_login = "INSERT INTO login (nadimak,email,status,broj_f,pitanje,odgovor,datum_u,ip_u)          VALUES ('$nadimak','$email','$status','$broj','$pitanje','$odgovor','$datum_u','$ip_u')";    if ($q1 = mysql_query($upis_login)) {       echo "<br> Uspešno izvršen - INSERT login!!!";      // greska u izvrsenju upita    }    else   {       echo "Greška u komunikaciji sa bazom - INSERT login!!!";      // greska u izvrsenju upita       die();       }    $citaj_login = "SELECT * FROM login WHERE nadimak='$nadimak'";    if ($log=mysql_query($citaj_login)) {       $red2 = mysql_fetch_array($log);       $id_clana = $red2['id'];    }    else   {       echo "Greška u izvršenju upita - SELECT  login  !!!";      // greska u izvrsenju upita       die();       }    /*  upis u tablicu     foto    */    $tip = "1";    $javnost = "4";    $upis_foto = "INSERT INTO foto (id,foto,opis,tip,javnost) VALUES ('$id_clana','$foto','$opis_f','$tip','$javnost')";    if ($f = mysql_query($upis_foto)) {       echo "<br> Uspešno izvršen  - INSERT u foto!!!";      // greska u izvrsenju upita    }    else   {       echo "<br> Greška u izvršenju upita - INSERT u foto!!!";      // greska u izvrsenju upita       die();       }    /*    upis   u     klub     */    $upis_klub = "INSERT INTO klub (id,ime,prezime,spol,brak,seks,mesto_s,drzava_s,zanimanje,vera,im,web,profil,datum_r,sat_r,mesto_r,drzava_r)       VALUES ('$id_clana','$ime','$prezime','$spol','$brak','$seks','$mesto_s','$drzava_s','$zanimanje','$vera','$im','$web','$profil','$datum_r','$sat_r','$mesto_r','$drzava_r')";    mysql_query($upis_klub);               /*      UPDATE    login  (kor_ime   i lozinka)   i   klub  (znak)  tablica    */       $uslov = 0;       while ($uslov == 0)   {             $x = rand(100,999);          if (strlen($ime) >= 5)   {             $user = substr($ime, 0,5);             $kor_ime = $user . $x;          }          else   {             $kor_ime = $ime . $x;          }          $sql_upit = "SELECT * FROM login WHERE kor_ime='$kor_ime'";          if (!$uq = mysql_query($sql_upit)) {             echo "Greška u komunikaciji sa bazom, nisu upisani kor_ime, lozinka (login) i znak (klub) i nije poslan email!!!";      // greska u izvrsenju upita             die();          }          if (mysql_num_rows($uq) == 0)   {   // generisano kor_ime je slobodno             $uslov = 1;          }          }       /*  generisanje   lozinke  i   UPDATE    login       */    $lozinka = lozinka_gen();    $azur = "UPDATE login SET kor_ime='$kor_ime', lozinka='$lozinka' WHERE id='$id_clana'";    if ($uqu = mysql_query($azur)) {          echo "<br> Uspešno - UPDATE login kor_ime, lozinka  poslan je email!!!";      // greska u izvrsenju upita    }    else   {          echo "Greška u komunikaciji sa bazom - UPDATE login kor_ime, lozinka  i nije poslan email!!!";      // greska u izvrsenju upita          die();       }    /* UPDATE   polja        znak         u tablici     klub   */    $azur1 = "UPDATE klub SET znak='$znak' WHERE id='$id_clana'";    if ($uq1 = mysql_query($azur1)) {       echo "<br> Član $nadimak  je uspešno učlanjen!!!";       }    else   {          echo "Greška u komunikaciji sa bazom - UPDATE klub  (znak) i nije poslan email!!!";      // greska u izvrsenju upita          die();       } /* zatim ide slanje emaila i kraj funkcije */    return; }   // kraj funkcije    uclani()

Problem je sto u tablici login dobijem slog sa upisanim svim podacima i jos jedan slog u kojem budu upisani svi podaci osim korisnickog imena i lozinke te u ta polja bude upisano NULL.
U tablici foto (podaci o upload fotografiji) u 99 % slucajeva dobijem duplirani slog.
To mi stvara problem jer nakon svakog uclanjenja moram brisati duple slogove i menjati novu vrednost za id jer mi je to autoincrement polje.

Dopuna: 01 Jul 2010 20:53

Mislim da su uslovi za update ok jer mi se slican problem povremeno pojavljuje i u drugim skriptama samo mnogo redje. U nekim skriptama dupliranje slogova (nema update-a vec samo obican upis novog sloga) se desava otprilike u 5% slucajeva, a ostalih 95% bude sve ok.
Da li problem moze biti u serveru na kojem je hostan sajt, ako ima previse sajtova prema hardware-skom potencijalu (memoriji) pa recimo izvrsi upis u MySQL na zahtev iz skripte i jos jednom po izlasku iz skripte kada prazni buffer za MySQL.

offline
  • Pridružio: 15 Maj 2006
  • Poruke: 333
  • Gde živiš: Babušnica

Meni se čini da ovde ništa nije problematično Bebee Dol

U tabeli klub_tmp na koji način se dodeljuje ID?

offline
  • Pridružio: 01 Jul 2010
  • Poruke: 3

Napisano: 01 Jul 2010 23:18

U klub_tmp ID se dodeljuje autoincrementom, ali kod prepisa u tablicu klub takodje se ID formira autoincrementom i nije potrebno da bude isti kao i u klub_tmp. U klub_tmp ID koristim iskljucivo za pozivanje skripti za prepis ili brisanje dok u tablici klub ID mora biti jedinstven jer ga koristim kao poveznicu sa drugim tablicama.

Dopuna: 01 Jul 2010 23:23

Najvise me muci cinjenica da mi se dupliranje zapisa ne desava stalno. Ako je skripta sa greskom ta bi se greska se kod istih operacija i istih uslova trebala stalno ponavljati, ali kod mene to nije slucaj. U skripti ciji sam bitni deo koda napisao zapis u tablicu foto duplira se gotovo u 99% slucajeva.

offline
  • Pridružio: 15 Maj 2006
  • Poruke: 333
  • Gde živiš: Babušnica

Drugi red, umesto

uclani($_GET['slog'],$_GET['znak']);

neka bude

if(isset($_GET['slog']) && isset($_GET['znak'])) { uclani($_GET['slog'],$_GET['znak']); } else { echo 'upisi slog i znak'; }

Ko je trenutno na forumu
 

Ukupno su 895 korisnika na forumu :: 2 registrovanih, 0 sakrivenih i 893 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: Milometer, nenad81