Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Jeszcze raz: Podwójne działanie INSERT
Forum PHP.pl > Forum > Przedszkole
sada
Witam!
Problem podobny był, przejrzałem wszystkie wątki, nie znalazłem rozwiązania.

  1. if(isset($_GET['kod11'])){
  2. file_put_contents('teksty/k1.txt','DOPISANO',FILE_APPEND);
  3. include('./connections/aaa.php');
  4. $dodaj = "INSERT INTO tabela1 (A,B,C) VALUES ('$a','$b','$c')";
  5. $dodano = mysql_query($dodaj, $aaa);
  6. mysql_close($aaa);
  7.  
  8. }


Taki oto insercik dodaje zawsze dwa identyczne rekordy (różniące się tylko id, jest auto increment).

-ta część programu realizuje się po kliknięciu linku <a href="adres.php?kod11=zmienna">
-w żadnym innym miejscu skryptu nie istnieje inny INSERT,
-nie ma mowy o podwójnym wywołaniu skryptu z poziomu PHP czy JavaScript.
-podwójne żądanie tworzy wg mnie sama przeglądarka bo problem występuje w FF a nie występuje w IE.
-Dodałem file_put_contents dla potwierdzenia , że dwa razy odpala się cały IF (i rzeczywiście odpala się dwa razy).
-nie posiadam tagów <button>,
-nie wklejam CTRL-V (ktoś miał taki przypadek),

Przeinstalowałem FF ,wyczyściłem wszystko co się dało i nic .


Jeśli to wina przeglądarki to jak to spacyfikować?
Nie interesują mnie obejścia problemu.

Proszę o każdą konstruktywną pomoc.
Dominis
Miałem ten sam problem na google Chromie.

Problemem był validator HTML (wtyczka do chrome),
który w tle otwieral mi jeszcze raz tą stronę..

sada
Dzięki spróbuję odinstalować wszystkie wtyczki

Niestety nie pomogło
mortus
Najpierw trzeba by było zweryfikować cały kod, a dopiero później zastanawiać się nad tym, czy jest to wina przeglądarki, czy nie. Zainstaluj sobie Firebug-a pod FF, uaktywnij zakładkę sieć, uruchom skrypt i obserwuj, czy strona wczytuje się dwa razy, czy może wysyła jakieś żądanie asynchronicznie, a może robi to i to, i to w odwrotnej kolejności. Przetestuj tylko ten fragment skryptu zapisany w osobnym pliku, a to powinno naprowadzić Cię na jakiś trop.

Jeśli to nie kłopot/problem to wrzuć gdzieś online cały kod.
ActivePlayer
tam gdzie robsiz file put contents dodaj sobie dumpa $_SERVER etc, bedziesz widział skad dostajesz te dodatkowe requesty.
sada
Zrobiłem jak proponował Mortus.

Są dwa odpalenia strony.
Jeden na początku a drugi identyczny na końcu po wszystkich procesach , nie asynchroniczny.

Dalej jedak nie wiem co jest przyczyną.

Kod który podałem można traktować jako cały bo dodaje podwójnie po odkomentowaniu reszty kodu , odpalając wpisując adres do przeglądarki.
mortus
Skoro twierdzisz, że nie jest to wina kodu, to zrob tak, jak zaproponował ActivePlayer:
  1. if(isset($_GET['kod11'])) {
  2. file_put_contents('teksty/k1.txt','DOPISANO',FILE_APPEND);
  3. echo '<pre>';
  4. var_dump($_SERVER);
  5. include('./connections/aaa.php');
  6. $dodaj = "INSERT INTO tabela1 (A,B,C) VALUES ('$a','$b','$c')";
  7. $dodano = mysql_query($dodaj, $aaa);
  8. mysql_close($aaa);
  9. }


Zresztą wystarczy najprostszy test, aby sprawdzić, czy to nie jest wina kodu. Wrzuć plik na serwer i uruchom:
[PHP] test.php - pobierz, plaintext
  1. <?php
  2. include './connections/aaa.php';
  3. $sql = "INSERT INTO tabela1 (A, B, C) VALUES ('1', '2', '3')";
  4. $result = mysql_query($dodaj, $aaa);
  5. ?>
[PHP] test.php - pobierz, plaintext

Jeśli skrypt doda jeden rekord, to będzie to oznaczać, że masz błąd w kodzie.
sada
Przepraszam, ża tak późno ale zawsze to lepiej niż wcale:

Wyizolowałem problem i niestety wziął się z niedbałego kodu tzn:
Wersja zła:
  1. <object width="500" height="360">
  2. <param name="movie" value="<?php if(isset($_GET['film'])) echo 'http://www.xxx.com/'.$_GET['film'];?> " />
  3. <param name="allowFullScreen" value="true" />
  4. <param name="allowscriptaccess" value="always" />
  5. <embed src="<?php if(isset($_GET['film'])) echo 'http://www.xxx.com/'.$_GET['film'];?> " width="500" height="360" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true"></embed>
  6. </object>


Wersja dobra:

  1. <?php if(isset($_GET['film'])){?>
  2. <object width="500" height="360">
  3. <param name="movie" value="<?php echo 'http://www.xxx.com/'.$_GET['film'];?> " />
  4. <param name="allowFullScreen" value="true" />
  5. <param name="allowscriptaccess" value="always" />
  6. <embed src="<?php echo 'http://www.xxx.com/'.$_GET['film'];?> " width="500" height="360" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true"></embed>
  7. </object>
  8. <?php }?>


W wyniku odpalenia linku ze zmienną GET powodującą INSERT do bazy, a wktórym nie było zmiennej $_GET['film'] w kodzie strony tworzył się obiekt z pustymi value i src, i on powodował odświeżenie strony.
  1. <object width="500" height="360">
  2. <param name="movie" value=" " />
  3. <param name="allowFullScreen" value="true" />
  4.  
  5. <param name="allowscriptaccess" value="always" />
  6. <embed src=" " width="500" height="360" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true"></embed>
  7. </object>


Dalej jednak nie wiem dlaczego?
wookieb
Też miałem kiedyś identyczny problem.
Pusta wartość SRC oznacza przyjęcia jako wartość aktualnego adresu strony.
Pobierz Swoją stronę w konsoli za pomocą wget albo funkcji file_get_contents i zobaczysz, że insert nie wykona się 2 razy.
viking
Poza tym, puszczasz jak leci dane z GETa bezpośrednio do strony. Zrób coś z tym.
sada
Wersja dobra nie powoduje podwójnego INSERT-a, więc jest nieźle. Podobny efekt dało dodanie brakującego GET-a do linku , tak by nie powstawały puste src i value.

viking:
mógłbyś doprecyzować, chodzi o bezpieczeństwo (jeśli tak jakie zagrożenia?) czy inne?

wookieb:
odpaliłem za pomocą file_get_contents i dodało podwójnie
mortus
Problem został dokładniej opisany tutaj. Błąd został zgłoszony, ale jak widać jeszcze tego nie poprawiono, w związku z czym element embed musi posiadać niepusty atrybut src. W przeciwnym wypadku wysyłane jest drugie żądanie.

Twoje rozwiązanie jest prawidłowe... jeśli nie podano adresu URL źródła, to pomijasz tworzenie elementu <object>, a w nim <embed>.

EDIT:
Co do bezpieczeństwa, to warto sprawdzić, czy przesłany w adresie adres źródła wskazuje rzeczywiście na plik .swf, choć możliwe, że sam element embed nie przepuści "czegoś" innego (np. skryptu PHP). Powinieneś również użyć urlencode() i urldecode().
sada
Dzięki wszystkim.
Cieszę się , że problem rozwiązany do końca.
mortus: o takie konkrety mi chodziło.Pomógł.(w pierwszej wersji myślałem , że ostatni post napisał viking)
Mam własną funkcję czyszczącą linki.

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.