PHP Mysql UPDATE többször fut le
2017-03-28T20:51:53+02:00
2017-03-29T16:15:51+02:00
2022-08-18T17:10:33+02:00
P. István
Sziasztok!

Végigolvastam a lehető legtöbb témakört, de sajnos nem jutottam megoldásra. 
Adott egy nagyon primitív kód, melynek az lenne a feladata, hogy számolja, a fehasználó hány lapot nyitott meg az adott session-ban.
A gond az, hogy 3-4x fut le betöltésenként. (INT-ben tárolom, alapértelmezett 0).
Remélem, tudtok segíteni. Előre is köszönöm!

<? session_start(); $session = session_id(); include("includes/adatbazis.php"); include("includes/funkciok.php"); $sql = mysql_query("SELECT id FROM felh_session WHERE session = '$session' AND ip_cim = '$ip'"); $db = mysql_num_rows($sql); if ($db != "0") { $ment = mysql_query("UPDATE felh_session SET oldalbetoltes = oldalbetoltes + 1 WHERE session = '$session'"); } else { $ment = mysql_query("INSERT INTO felh_session (id,session,ip_cim,oldalbetoltes) values ('','$session','$ip','1')"); }?>
Mutasd a teljes hozzászólást!
Chrome console megnyit > network > all és megnézed mi az amit esetleg nem talál, mert a rewrite miatt elképzelhető, hogy helyette betölti az oldaladat még 3x a háttérben.
Mutasd a teljes hozzászólást!

  • Elsőre az ötlik a szemembe, hogy az UPDATE csak a session szerint van szűrve. Előtte a lekérdezés session + ip_cim.

    Ezen felül azt kéne tudnom, hogy ez a kódrészlet hol van? Lehet, hogy többször is idejut a program?
    Mutasd a teljes hozzászólást!
  • Tesztként loggold le fájba, hogy milyen kéréseknél futott le többször ($_SERVER tömb): pl. ha van szépurl és a nem létező fájloknál (képek, favicon, scriptek stb) is a php fut le akkor elképzelhető hogy többször fog lefutni a kódod.

    Egyébként megoldható egy sql kéréssel is amit akarsz, ha a sessionid+ip mezőkre egyedi kulcsot raksz majd használod az INSERT INTO ... ON DUPLICATE KEY UPDATE ... formát.
    Mutasd a teljes hozzászólást!
  • Ez az index.php legelegén van.  Még egy teszt oldal, egyenlőre csak én férek hozzá, szóval kizárt, hogy más is ráfrissít. Apache szerver.
    Mutasd a teljes hozzászólást!
  • Még teszt oldal...

    Hát akkor dobd ki. Hogy miért? Olvasd el a Warning részt.
    Mutasd a teljes hozzászólást!
  • Igen, még teszt. Valójában egy modul szeretne majd lenni. 
    Szóval erre jutottam eddig:
    Ha nem töltöm be a külső .JS és .CSS file-okat, akkor jól számol.
    jQuery kivételével mindegyiket (.JS-t) async-el töltöm be az oldal alján.
    Mutasd a teljes hozzászólást!
  • Beírtam log-ba a következők szerint:

    $tartalom.=$_SERVER['PHP_SELF']; $tartalom.=" - "; $tartalom.=$_SERVER['SERVER_NAME']; $tartalom.=" - "; $tartalom.=$_SERVER['HTTP_HOST']; $tartalom.=" - "; $tartalom.=$_SERVER['HTTP_REFERER']; $tartalom.=" - "; $tartalom.=$_SERVER['HTTP_USER_AGENT']; $tartalom.=" - "; $tartalom.=$_SERVER['SCRIPT_NAME']; $tartalom.=" - "; $tartalom.=$ip; $tartalom.=" - "; $tartalom.=$session;
    Az adatbázisba 4x UPDATE-ol, a log-ba viszont 3 sor kerül. Mindhárom sor teljesen ugyanaz a log file-ban.
    .htaccess-ben használok rewrite-ot az index.php-re, de ez még nem okozott gondot.
    Ami számomra érdekes (amit az előző hozzászólásomban irtam), hogy ha eltávolítom a .js és .css file-okat, akkor tökéletesen működik.

    .htaccess így néz ki:

    <IfModule mod_rewrite.c> RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php?q=$1 [QSA] </IfModule> # Enable Compression <IfModule mod_deflate.c> AddOutputFilterByType DEFLATE application/javascript AddOutputFilterByType DEFLATE application/rss+xml AddOutputFilterByType DEFLATE application/vnd.ms-fontobject AddOutputFilterByType DEFLATE application/x-font AddOutputFilterByType DEFLATE application/x-font-opentype AddOutputFilterByType DEFLATE application/x-font-otf AddOutputFilterByType DEFLATE application/x-font-truetype AddOutputFilterByType DEFLATE application/x-font-ttf AddOutputFilterByType DEFLATE application/x-javascript AddOutputFilterByType DEFLATE application/xhtml+xml AddOutputFilterByType DEFLATE application/xml AddOutputFilterByType DEFLATE font/opentype AddOutputFilterByType DEFLATE font/otf AddOutputFilterByType DEFLATE font/ttf AddOutputFilterByType DEFLATE image/svg+xml AddOutputFilterByType DEFLATE image/x-icon AddOutputFilterByType DEFLATE text/css AddOutputFilterByType DEFLATE text/html AddOutputFilterByType DEFLATE text/javascript AddOutputFilterByType DEFLATE text/plain </IfModule> <IfModule mod_gzip.c> mod_gzip_on Yes mod_gzip_dechunk Yes mod_gzip_item_include file .(html?|txt|css|js|php|pl)$ mod_gzip_item_include handler ^cgi-script$ mod_gzip_item_include mime ^text/.* mod_gzip_item_include mime ^application/x-javascript.* mod_gzip_item_exclude mime ^image/.* mod_gzip_item_exclude rspheader ^Content-Encoding:.*gzip.* </IfModule> # Leverage Browser Caching <IfModule mod_expires.c> ExpiresActive On ExpiresByType image/jpg "access 1 year" ExpiresByType image/jpeg "access 1 year" ExpiresByType image/gif "access 1 year" ExpiresByType image/png "access 1 year" ExpiresByType text/css "access 1 month" ExpiresByType text/html "access 1 month" ExpiresByType application/pdf "access 1 month" ExpiresByType text/x-javascript "access 1 month" ExpiresByType application/x-shockwave-flash "access 1 month" ExpiresByType image/x-icon "access 1 year" ExpiresDefault "access 1 month" </IfModule> <IfModule mod_headers.c> <filesmatch "\.(ico|flv|jpg|jpeg|png|gif|css|swf)$"> Header set Cache-Control "max-age=2678400, public" </filesmatch> <filesmatch "\.(html|htm)$"> Header set Cache-Control "max-age=7200, private, must-revalidate" </filesmatch> <filesmatch "\.(pdf)$"> Header set Cache-Control "max-age=86400, public" </filesmatch> <filesmatch "\.(js)$"> Header set Cache-Control "max-age=2678400, private" </filesmatch> </IfModule> <IfModule mod_headers.c> <FilesMatch "\.(ico|x-icon|js|css|jpg|jpeg|png|gif|swf|pdf)$"> Header unset Cookie Header unset Set-Cookie Header unset ETag FileETag MTime Size </FilesMatch> </IfModule>
    Mutasd a teljes hozzászólást!
  • Chrome console megnyit > network > all és megnézed mi az amit esetleg nem talál, mert a rewrite miatt elképzelhető, hogy helyette betölti az oldaladat még 3x a háttérben.
    Mutasd a teljes hozzászólást!
  • Nagyon köszönöm! Valóban volt 404-es státuszú link, amiket JS hívott meg.
    Most már mindegyik 200-as, viszont így is 2x tölt be:

    katalogus.html?page=6 200 document Other 24.8 KB 77 ms katalogus.html?page=6 200 xhr jquery.min.js:4 24.8
    Mint látszik, másodszor jquery kérés történik, erre még nem találtam megoldást.
    Mutasd a teljes hozzászólást!
  • Nehéz kérdés, de az ajax hívás nem véletlenül ugyanarra a fájlra mutat?  Ugyanabban a fájlban történik az ajax kérések feldolgozása is mint ami a query-t futtatja?
    Mutasd a teljes hozzászólást!
  • .htaccess-ben használok ugyebár rewrite-ot, szóval elvileg minden az index.phpben fut le.

    1. index.php-ben ellenörzöm az url-t, ennek alapján töltöm be majd a tartalmat (a file elején adatbázis kapcsolat, url ellenőrzés, majd ezután futna a kérdésben említett kódsor)
    2. index.php végén include-al töltöm be a témát
    3. a témán belül include-al töltöm be azt a tartalmat, amit az index.php szerint aktuális
    4. a téma alján </body> előtt szerepelnek a .JS file-ok.

    Miközben ezt a hozzászólást írtam, megtaláltam a problémás .js file-t, ez egy pár soros "infinity scroll" része, amely keresőbaráttá teszi az url-t scrollozás közben.
    Ha látsz benne fantáziát, nyitok egy új kérdést és felteszem a kódot. A segítségedért pedig hálás vagyok!
    Mutasd a teljes hozzászólást!
abcd