Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PDO] dublowanie zapytań
r4xz
post 29.11.2011, 21:12:24
Post #1





Grupa: Zarejestrowani
Postów: 673
Pomógł: 106
Dołączył: 31.12.2008

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


witam,
posiadam dziwny problem (choć śmiem wątpić, że jednak go nie posiadam... ani słowa na ten temat w google)

wysyłam polecenie
  1. INSERT INTO users ( name, password ) VALUES ( 'test1', 'test1' )


no i szlak by to trafił - zawsze wykonuje się 2 razy.
dam 2 zapytania pod rząd - wykona się jedno, wykona się drugie - a potem lecą duplikaty...

jakieś pomysły?

aha... pewno spytacie o kod.
postanowiłem przekopiować z manuala:
  1. <?php
  2. $dsn = "mysql:host=localhost;dbname=test";
  3. $username = 'root';
  4. $password = null;
  5. $dbh = new PDO( $dsn, $username, $password );
  6. $stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)");
  7. $stmt->bindParam(':name', $name);
  8. $stmt->bindParam(':value', $value);
  9.  
  10. // insert one row
  11. $name = 'one';
  12. $value = 1;
  13. $stmt->execute();
  14.  
  15. // insert another row with different values
  16. $name = 'two';
  17. $value = 2;
  18. $stmt->execute();
  19. ?>

otrzymuję 4 nowe wpisy, one => 1 (id 1), two => 2 (id 2), one => 1 (id 3), two => 2 (id 4)


--------------------
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 14)
by_ikar
post 29.11.2011, 23:38:13
Post #2





Grupa: Zarejestrowani
Postów: 1 798
Pomógł: 307
Dołączył: 13.05.2009
Skąd: Gubin/Wrocław

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


Generalnie to powinieneś dostać notice o niezdefiniowanej zmiennej $value i $name w lini 7 oraz 8. Druga sprawa to jest to że wykonujesz ten execute dwa razy, nie wiem jak ten kod wygląda dalej, no ale właśnie te 2x execute powodują dwukrotne wykonanie tego samego zapytania. Jak chcesz poczytać o PDO, to poczytaj tutaj: http://pl.wikibooks.org/wiki/PHP/Biblioteka_PDO
Go to the top of the page
+Quote Post
r4xz
post 30.11.2011, 16:51:53
Post #3





Grupa: Zarejestrowani
Postów: 673
Pomógł: 106
Dołączył: 31.12.2008

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


Cytat(by_ikar @ 29.11.2011, 23:38:13 ) *
Druga sprawa to jest to że wykonujesz ten execute dwa razy, nie wiem jak ten kod wygląda dalej, no ale właśnie te 2x execute powodują dwukrotne wykonanie tego samego zapytania

tak, tylko wykonuje się najpierw zapytanie z 13 (linii), potem 18 i znów z 13 i 18

PS to jest cały kod - specjalnie dałem do testów jak najprostszy aby błąd znaleźć


--------------------
Go to the top of the page
+Quote Post
Dominis
post 30.11.2011, 17:15:49
Post #4





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

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


Może glupia sprawa, ale miałem ten sam problem z przeglądarka Chrome i dodatkiem do niego (htmlValidator) niestety już nie pamiętam, jaka była pelna nazwa tego validatora i ktora to była wersja. Ale może w tym lezy błąd...wink.gif


--------------------
www.maxcode.pl
Go to the top of the page
+Quote Post
abort
post 30.11.2011, 20:54:49
Post #5





Grupa: Zarejestrowani
Postów: 590
Pomógł: 107
Dołączył: 25.10.2011

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


Może jestem głupi, bo obiektówki się dopiero uczę i wszystko robię jeszcze z wykorzystaniem funkcji mysql_*, ale...
w linii 18 masz "$stmt->execute();" - ale nie widzę, abyś po zmianie parametrów wykonywał ponownie "$stmt->bindParam"
Go to the top of the page
+Quote Post
Crozin
post 30.11.2011, 20:58:05
Post #6





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


@by_ikar, @abort: PDOStatement::bindParam() jako drugi argument przyjmuje referencję, nie wartość zmiennej. Kod sam w sobie jest poprawny.
Go to the top of the page
+Quote Post
nospor
post 30.11.2011, 21:02:44
Post #7





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Cytat
no i szlak by to trafił - zawsze wykonuje się 2 razy.
dam 2 zapytania pod rząd - wykona się jedno, wykona się drugie - a potem lecą duplikaty...

jakieś pomysły?
Odpowiedź jest banalnie prosta. Wykonujesz kod 2 razy. Albo strona ci się odswieza, albo kupa innych rzeczy powodujących wykonanie tego kodu dwa razy.

Były dziesiatki takich "problemów" na forum, ludzie zawsze się zastrzegali że robią to tylko raz, ale zawsze się okazywalo, że robią to jednak dwa razy, zazwyczaj nieswiadomie, posrednio z jakiegoś innego powodu.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
r4xz
post 30.11.2011, 22:21:23
Post #8





Grupa: Zarejestrowani
Postów: 673
Pomógł: 106
Dołączył: 31.12.2008

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


Cytat(nospor @ 30.11.2011, 21:02:44 ) *
Albo strona ci się odswieza, albo kupa innych rzeczy powodujących wykonanie tego kodu dwa razy.

trafne spostrzeżenie, tylko teraz pytanie czemu przy otwieraniu strony przez przeglądarkę wykonuje się 2 razy (testowane pod Operą, IE, FF), ale jak już wyśle żądanie w sposób "inszy" (bez ingerencji okna przeglądarki) działa poprawnie?

póki co mam przynajmniej zajęcie na nudne wieczory aby to wyczaić - a nóż ustawienia apache/php czy jeszcze inne cuda tworzą takie herezje... tego to pewno najstarsze kaszuby nie wiedzą wink.gif

-edit-
tak mnie jeszcze zastanawia, gdyby mi odświeżało to id tych rekordów (PDO::lastInsertId) dostałbym najświeższe - a tak się jednak nie dzieje

Ten post edytował r4xz 30.11.2011, 22:24:34


--------------------
Go to the top of the page
+Quote Post
Crozin
post 30.11.2011, 22:23:33
Post #9





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


Przeglądarki dosyć często próbują na ślepo wczytać plik favicon.png, być może to jest przyczyną - sprawdź w narzędziach deweloperskich przeglądarki, logach serwera, albo zapisuj do bazy zrzut danych z $_SERVER.
Go to the top of the page
+Quote Post
by_ikar
post 30.11.2011, 22:28:56
Post #10





Grupa: Zarejestrowani
Postów: 1 798
Pomógł: 307
Dołączył: 13.05.2009
Skąd: Gubin/Wrocław

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


Cytat(Crozin @ 30.11.2011, 20:58:05 ) *
@by_ikar, @abort: PDOStatement::bindParam() jako drugi argument przyjmuje referencję, nie wartość zmiennej. Kod sam w sobie jest poprawny.


Oj wiem że przyjmuje, tyle że parametry które podał 7 i 8 linijce, nie są wcześniej zdefiniowane, normalnie dostałby notica. To nie jest powód wykonywania tych samych zapytań 2x, tylko wskazałem że wcześniej nie jest zdefiniowany wink.gif
Go to the top of the page
+Quote Post
r4xz
post 30.11.2011, 22:44:17
Post #11





Grupa: Zarejestrowani
Postów: 673
Pomógł: 106
Dołączył: 31.12.2008

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


a jest możliwe że najpierw zostanie otwarty plik index.php i częściowo wykonany, a dopiero potem htaccess wykonany?
htaccess:
Kod
RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^(.*)$ index.php?rt=$1 [L,QSA]

po usunięciu w/w pliku działa poprawnie


--------------------
Go to the top of the page
+Quote Post
Crozin
post 30.11.2011, 23:04:39
Post #12





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


Cytat
Oj wiem że przyjmuje, tyle że parametry które podał 7 i 8 linijce, nie są wcześniej zdefiniowane, normalnie dostałby notica.
Nie, nie dostałby, ponieważ tam użyta jest referencja, nie wartość zmiennej. Kod jest w pełni poprawny - odpal sobie z raportowaniem błędów ustawionym na -1 jeśli nie wierzysz.

Cytat
a jest możliwe że najpierw zostanie otwarty plik index.php i częściowo wykonany, a dopiero potem htaccess wykonany?
Musiałby istnieć jakiś bardzo poważny błąd w Apache'u - ale taki raczej nie istnieje.

Ten post edytował Crozin 30.11.2011, 23:04:54
Go to the top of the page
+Quote Post
phpion
post 1.12.2011, 08:16:19
Post #13





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




To jest pewnie to o czym pisał ~Crozin. Mając przekierowanie wszystkich żądań do index.php w przypadku braku pliku favicon żądanie to również leci do index.php. Tak więc wczytując stronę wczytujesz index.php, a przeglądarka szukając favicon.ico również ładuje index.php. Niekoniecznie jest to favicon.ico, może jakiś inny plik wczytujesz, którego nie ma?
Go to the top of the page
+Quote Post
Uriziel01
post 1.12.2011, 10:55:11
Post #14





Grupa: Zarejestrowani
Postów: 307
Pomógł: 37
Dołączył: 9.11.2010
Skąd: Zielona Góra

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


Nie możesz tak przekierowywać zapytań w przypadku braku jakiegokolwiek pliku, zamiast dostać jakikolwiek błąd strona wczyta ci się poprostu po raz kolejny w tle, musisz dodać sprawdzanie czy plik nie jest przypadkiem plikiem graficznym/stylem/skryptem, na przykład tak:
  1. RewriteCond %{REQUEST_FILENAME} !(.gif|.jpg|.jpeg|.txt|.png|.js|.css) [NC]


Ten post edytował Uriziel01 1.12.2011, 10:55:54
Go to the top of the page
+Quote Post
r4xz
post 1.12.2011, 15:59:58
Post #15





Grupa: Zarejestrowani
Postów: 673
Pomógł: 106
Dołączył: 31.12.2008

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


Cytat(Crozin @ 30.11.2011, 22:23:33 ) *
Przeglądarki dosyć często próbują na ślepo wczytać plik favicon.png, być może to jest przyczyną - sprawdź w narzędziach deweloperskich przeglądarki, logach serwera, albo zapisuj do bazy zrzut danych z $_SERVER.

przyczyną było, ale favicon.ico

Kod
RewriteCond %{REQUEST_FILENAME} ![^\?]*\.(jpg|png|css|js|ico)$
RewriteRule ^(.*)$ index.php?rt=$1 [L,QSA]

i po kłopocie.. smile.gif

temat zakończony


--------------------
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 - 14:37