Drukowana wersja tematu

Kliknij tu, aby zobaczyć temat w orginalnym formacie

Forum PHP.pl _ Microsoft SQL Server / MSDE _ Microsoft SQL Server - podwójne wpisy do bazy

Napisany przez: malisz 2.10.2003, 12:02:36

Witam,
Pierwszy raz spotykam się z tym problemem, i nie potrafię go racjonalnie wytłumaczyć. Żeby było śmieszniej nie dzieje się to za każdym razem, ale co 5 - 10 raz.
Teraz o co chodzi.

taki krótki kod:
...
$sql = "INSERT INTO temptable (nazwa) values ('abc')";
$result = mssql_query($sql, $DB);
...

czasem wstawia od razu 2 takie same rekordy, mimo ze wywolanie nastepuje tylko raz. Siedziałem nad tym całą noc i testowałem wszelakie rozwiązania, ze sprawdzaniem czy istnieje, z indeksami na nazwe... wszystko co mi przyszło na myśl. Jeżeli mam założony indeks na nazwe to przy wstawieniu rekordu (oczywiście nie zawsze) baza zgłasza błąd : rekord o podanym indeksie już istnieje, ale dlatego, że rekord został wstawiony, a błąd wyświetlany jest przy drugiej samoczynnej próbie wstawienia rekordu. Dlaczego tak się dzieje. Mam też SQL Server na drugim kompie i jest dokładnie tak samo. Czy ktokolwiek domyśla się w czym problem? To dla mnie bardzo ważne.
Mam nadzieje ze z tego co napisalem chociaz troche wiadaomo o co chodzi smile.gif

Z góry dzięki za odpowiedź.

Napisany przez: scanner 2.10.2003, 12:09:25

php Pro -> Bazy danych

Napisany przez: spenalzo 2.10.2003, 12:09:53

"php Pro: Inżynieria programowania w php, strategie budowy aplikacji." - jesteś pewień że umieściłeś posta w dobrym miejscu?

Napisany przez: malisz 2.10.2003, 12:13:50

sorry, nie pisałem na tym forum chyba od roku

Napisany przez: malisz 2.10.2003, 18:12:40

nikt nic nie wie na ten temat? Ludzie, prosze skupcie sie smile.gif

Napisany przez: uboottd 2.10.2003, 19:08:08

Dlaczego mamy sie skubac ?

Przy tak malych informacjach ciezko powiedziec.

Ja bym stawial na to, ze dwa razy wykonujesz kod wstawiania dla tych samych danych, bo np. osoba wpisujaca zrobila reload podczas wpisywania i wyslales sobie po raz drugi te same dane z tego samego formularza. Zreszta poniewaz mysle ze nawet MS MSQL nie jest tak durny zeby na wszelki wypadek powtarzac komende, to winy bym szukal w skrypcie.

Napisany przez: malisz 2.10.2003, 19:34:29

Kod ma 3 linijki, błąd nie zachodzi za każdym razem (jak pisałem wcześniej)
Zaobserwowałem, że sytuacja pojawia się w momencie gdy zbyt szybko po sobie następują operacje INSERT. Nie ma żadnego przeładowania strony. Raz wykonana komenda mssql_query() wsatwia 2 takie same rekordy (oczywiście nie zawsze). Powiem więcej, połączyłem sie do MSSQL'a przez odbc i jest dokładnie to samo.
Wstwiam rekord za rekordem i czasem rekord jest wpisywany dwukrotnie.
Jak wspominalem dzieje sie to na dwoch maszynach, zmieniałem wersje php'a, probowalem przez ODBC... i wydaje mi się ze jest to jakas wlasciwosc MS SQL'a. Jakiś parametr w bazie? Nie wiem, dlatego prośba o pomoc. Proszę też żeby nie podsuwać takich uwag jak ta powyżej, ze kod wykonuje sie 2 razy, albo klient przeladowuje strone i tak dalej. Pisalem juz pod roznymi bazami i troche doswiadczenia w tym mam. Pod MSSQL pisze pierwszy raz i nie rozumiem dlaczego wystepuje taki problem. Z gory dzieki za pomoc.

Napisany przez: uboottd 2.10.2003, 20:00:47

Nie wierze zeby baza sama z siebie podwojnie wykonywala jakies zapytanie, bo jesli by tak robila to juz dawno by to ktos wytknal developerom tej bazy i juz by nie robila czegos tak glupiego.

Ja bym zalozyl ze baza jednak dostaje to zapytanie dwa razy i zaczal od analizy skryptu kiedy moze taka sytuacja wystapic. A zasugerowalem podwojne zaladowanie strony bo to najczestsza pulapka z jednej strony, a z drugiej skad mam wiedziec ze rozmawiam z ekspertem ? Skoro jestes tego pewien to ok. Znaczy ze blad jest ciekawszy, ale dales za malo danych zeby go znalezc. Byc moze jest jakis drobny haczyk w uzywaniu tablic tymczasowych lub ogolnie w interfejsie do bazy. Trzeba by dokladnie zbadac juz szczegoly mssqlowe...

Napisany przez: adwol 2.10.2003, 22:34:46

Moje sugestie:
:arrow: Wstaw sobie tuż przed wysłaniem zapytania jakiegoś debuga, który będzie Ci wypisywał coś na ekran. To tak żeby na 100% wykluczyć ew. wykonanie dwa razy tego kodu.
:arrow: Zobacz czy nie masz zdefiniowanego w bazie jakiegoś zrąbanego triggera, który wyzwalany Twoim insertem dokłada dodatkowy wiersz (o ile MSSQL ma takie coś jak triggery, nie znam się na tym DBMSie więc jeśli nie ma to ten punkt odpada)

Napisany przez: malisz 2.10.2003, 22:46:46

mam debuga, kod jest wykonywany tylko raz, na BANK!
MSSQL ma trigery, ale nie mam zadnych zdefiniowanych.
Najdziwniejsze w tym wszystkim jest to, że problem nie pojawia się za każdym razem.

Napisany przez: adwol 2.10.2003, 22:57:05

Cytat
mam debuga, kod jest wykonywany tylko raz, na BANK!
MSSQL ma trigery, ale nie mam zadnych zdefiniowanych.
Najdziwniejsze w tym wszystkim jest to, że problem nie pojawia się za każdym razem.

Ok, czy jesteś w stanie przeprowadzić dość powtarzalne eksperymenty? Znaczy, czy zdarza się to na tyle często, że po kilku/kilkunastu próbach jesteś w stanie stwierdzić czy dalej jest błąd czy sie poprawiło?

Jeśli tak, to spróbuj wyizolować problem. Okastrowuj ten kod ze zbędnych rzeczy tak długo aż ograniczysz się do kilku zapytań lub problem nagle zniknie. Dążę do tego, aby pozostało jak najmniej kodu i żeby dało się wtedy testować każde zapytanie po kolei.

Problem może być kontekstowy, będzie istniał tylko jeśli zostaną wydane konkretne zapytania i to w konkretnej kolejności. Spróbuj więc jak już okastrujesz ten kod wydać te zapytania bezpośrednio z konsoli administracyjnej MSSQL lub innego programu tego typu do bezpośredniej interakcji z bazą. To pozwoli określić gdzie jest błąd, bo może sterownik PHPowy do MSSQLa jest wadliwy.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)