Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Microsoft SQL Server - podwójne wpisy do bazy
Forum PHP.pl > Forum > Bazy danych > Microsoft SQL Server / MSDE
malisz
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ź.
scanner
php Pro -> Bazy danych
spenalzo
"php Pro: Inżynieria programowania w php, strategie budowy aplikacji." - jesteś pewień że umieściłeś posta w dobrym miejscu?
malisz
sorry, nie pisałem na tym forum chyba od roku
malisz
nikt nic nie wie na ten temat? Ludzie, prosze skupcie sie smile.gif
uboottd
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.
malisz
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.
uboottd
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...
adwol
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)
malisz
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.
adwol
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.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.