Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PDO] dublowanie zapytań
Forum PHP.pl > Forum > PHP
r4xz
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)
by_ikar
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
r4xz
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źć
Dominis
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
abort
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"
Crozin
@by_ikar, @abort: PDOStatement::bindParam() jako drugi argument przyjmuje referencję, nie wartość zmiennej. Kod sam w sobie jest poprawny.
nospor
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.
r4xz
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
Crozin
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.
by_ikar
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
r4xz
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
Crozin
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.
phpion
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?
Uriziel01
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]
r4xz
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
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.