Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]Jeszcze raz: Podwójne działanie INSERT
sada
post 1.02.2012, 20:02:59
Post #1





Grupa: Zarejestrowani
Postów: 302
Pomógł: 24
Dołączył: 6.12.2008

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
Dominis
post 1.02.2012, 20:35:38
Post #2





Grupa: Zarejestrowani
Postów: 77
Pomógł: 19
Dołączył: 13.02.2010

Ostrzeżenie: (0%)
-----


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ę..



--------------------
www.maxcode.pl
Go to the top of the page
+Quote Post
sada
post 1.02.2012, 21:04:32
Post #3





Grupa: Zarejestrowani
Postów: 302
Pomógł: 24
Dołączył: 6.12.2008

Ostrzeżenie: (0%)
-----


Dzięki spróbuję odinstalować wszystkie wtyczki

Niestety nie pomogło
Go to the top of the page
+Quote Post
mortus
post 2.02.2012, 09:52:10
Post #4





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

Ostrzeżenie: (0%)
-----


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.

Ten post edytował mortus 2.02.2012, 09:53:40
Go to the top of the page
+Quote Post
ActivePlayer
post 2.02.2012, 09:59:28
Post #5





Grupa: Przyjaciele php.pl
Postów: 1 224
Pomógł: 40
Dołączył: 6.07.2004
Skąd: Wuppertal

Ostrzeżenie: (0%)
-----


tam gdzie robsiz file put contents dodaj sobie dumpa $_SERVER etc, bedziesz widział skad dostajesz te dodatkowe requesty.
Go to the top of the page
+Quote Post
sada
post 2.02.2012, 17:27:39
Post #6





Grupa: Zarejestrowani
Postów: 302
Pomógł: 24
Dołączył: 6.12.2008

Ostrzeżenie: (0%)
-----


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.

Ten post edytował sada 2.02.2012, 17:29:57
Go to the top of the page
+Quote Post
mortus
post 2.02.2012, 19:59:53
Post #7





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

Ostrzeżenie: (0%)
-----


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.

Ten post edytował mortus 2.02.2012, 20:06:15
Go to the top of the page
+Quote Post
sada
post 18.02.2012, 09:35:06
Post #8





Grupa: Zarejestrowani
Postów: 302
Pomógł: 24
Dołączył: 6.12.2008

Ostrzeżenie: (0%)
-----


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?

Ten post edytował sada 18.02.2012, 09:51:56
Go to the top of the page
+Quote Post
wookieb
post 18.02.2012, 09:42:13
Post #9





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




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.
Powód edycji: [wookieb]:


--------------------
Go to the top of the page
+Quote Post
viking
post 18.02.2012, 09:44:16
Post #10





Grupa: Zarejestrowani
Postów: 6 380
Pomógł: 1116
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


Poza tym, puszczasz jak leci dane z GETa bezpośrednio do strony. Zrób coś z tym.


--------------------
Go to the top of the page
+Quote Post
sada
post 18.02.2012, 10:14:07
Post #11





Grupa: Zarejestrowani
Postów: 302
Pomógł: 24
Dołączył: 6.12.2008

Ostrzeżenie: (0%)
-----


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

Ten post edytował sada 18.02.2012, 10:28:52
Go to the top of the page
+Quote Post
mortus
post 18.02.2012, 10:47:41
Post #12





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

Ostrzeżenie: (0%)
-----


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().

Ten post edytował mortus 18.02.2012, 10:52:44
Go to the top of the page
+Quote Post
sada
post 18.02.2012, 11:21:57
Post #13





Grupa: Zarejestrowani
Postów: 302
Pomógł: 24
Dołączył: 6.12.2008

Ostrzeżenie: (0%)
-----


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.



Ten post edytował sada 18.02.2012, 18:06:09
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 14.08.2025 - 04:41