Autor Zpráva
Pavel Calta
Profil
Dobrý den,
opravdu, opravdu jsem pátral a zkoušel, zda nemám někde chybu a nemohu na nic přijít.

Mám následující:
$Trial = new Obecne_fce();
$Data=$Trial->queryAll("SELECT * from _new_moduly_rel where Id_TypStranky = 1");
$Trial2 = new Obecne_fce();

for ($i=0; $i < 1; $i++) 
{ 
$DataPole = array(
":Id_TypModulu" => $Data[$i]['Id_TypModulu'],
    ":Poradi" => $Data[$i]['Poradi'],
    ":Aktivni" => $Data[$i]['Aktivni']
    );

$Trial2->InsertData("Insert into _new_moduly_rel(Id,Id_TypStranky,Id_TypModulu,Poradi,Aktivni) values (0, 2, :Id_TypModulu,:Poradi,:Aktivni)",$DataPole);
}

Následně:
function InsertData($query,$param=Array())
{
$navrat = $this->spojeni->prepare($query);
$navrat->execute($param);

$navrat->debugDumpParams();

}



  function __construct(){
    $options=array(
      PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
      PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"
      );

    $this->spojeni= @new PDO("mysql:host=$host;dbname=$name",$user,$pass,$options);


a výsledek je, že se provede insert, ale v tabulce nepřibude jeden, ale hned 4 záznamy.

Prosím, co už dělám špatně?


Funkce InsertData a ten konstruktor patří třída Obecne_fce() samozřejmě. Nekopíroval jsem to celé pro přehlednost. Stejně tak jsem nekopíroval loginy do DB.
Kajman
Profil
Zkuste si vrátit id vkládaného záznamu a počet ovlivněných řádků. Ty si pro ladící potřeby vypsat.

Je možné, že vkládáte jeden řádek, ale skript je spuštěn 4x?
Pavel Calta
Profil
Mě to přijde jako chyba někde ovladačích DBO, nebo netuším.
Zkoušel jsem i do té funkce InsertData si vložit jednoduše echo "zapisuji data"; a toto se vypíše jen jednou.

Vypsat Id záznamu, máte na mysli ->lastInsertId(); ?

Pokud ano, tak pak mám funkci takto:
function InsertData($query,$param=Array())
{
$navrat = $this->spojeni->prepare($query);
$navrat->execute($param);
echo $this->spojeni->lastInsertId();
echo "<br>";

}

Vypíše pouze jedno Id a to je to poslední. Poslední, ale před ním jsou již vložené 3 identické záznamy.


Tak přidal jsem ještě echo $navrat->rowCount();
A to vypíše 1.
Tak fakt nevím, co dělám zle.


Tak:
začínám z toho mít pocit nějakých nekompatibilit verzí ovladačů, nebo nevím.
Takže:
Moje prostředí je: PHP Version 7.0.27-0+deb9u1
připojuji s MYSQL u mého hostingu, zde je PHP: 7.1.15

A dělá to tuto chybu.

Dále jsem zkusil druhou instalaci, kde mám PHP Version 5.6.30-0+deb8u1 zde to funguje korektně, zapíše se pouze jeden záznam.
Na hostingu mám ale PHP Version 5.5.38 a zde se to zapisuje špatně.
Je možné, že je to tímto?


Tak ještě jeden posun, vidím, že se nevloží vždy 4, ale náhodně, někdy pouze 2, někdy 3, někdy hned 5 identitických záznamů. Fakt tedy nemám tušení,.


Verze PHP na hostingu, kde běží PHPmyadmin PHP: 7.1.15 s tím samozřejmě nemá co dělat, PDO se připojuje přímo k DB.
Kajman
Profil
Když za insertem zavoláte die, tak se vloží jen jeden řádek? V logu apache není vidět více volání toho skriptu (třeba z cronu)?

Můžete si logovat spouštění toho insertu např. do souboru? Např. mikrosekundy spuštění + getmypid + debug_backtrace?
Pavel Calta
Profil
Kajman:
Dobrý den všem,
sice mi to "zabralo" 4 roky, ale protože stejná chyba může potkat každého, tak možná stojí za to sem svou zkušenost sdílet.

Řekněme, že máme web postaven tak, že nám .htaccess posílá vše na index.php
V takovém případě máme v tomto souboru něco jako toto:
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php?url=$1 [NC,L,QSA]

Mám dokonce pocit, že tento kód je zde někde v tutoriálech na JPW.
A teď si řekněme, že je možné, že na webu užíváte něco, co fakticky jako soubor neexistuje. To mohou být třeba nějaké ikonky, nebo úplně stačí to (což byl můj případ), že máte nějaké zpoždění v synchronizaci dat mezi Vaším lokálním pc (serverem) a hostingem, což byl náš případ, kdy fotky a vše si zpracovávám lokálně a cron na debianovém serveru co 15 minut se podívá do složek s fotkami a pokud je tam nějaká změna, přírůstek atd... tak to na hosting FTPkem nahraje. Funguje to elegantně a roky v kuse. Na webu cronem kontroluji, zda opravdu všechny fotky existují, pokud ne, dostávám o tom emailem notifikaci a asi už tušíte, kam směřuji. Pokud ta fotka neexistuje, tak se zavolá index.php a ten provede to, co by měl provádět. Pokud tedy neexistuje 5 fotek, tak se index zavolá 5x.
atd atd.

Vlastně to samé se stane, když Vás projíždí třeba google robot na obrázky a hledá fotku, kterou jste třeba někdy měli na webu. V takovém případě se jedná třeba o náleže v řádu tisíců fotek a tím pádem i teoreticky tisíce zbytečných zápisů do databáze, pokud si logujete přístupy.

Řešení je úplně snadné a to vyloučit takto "rizikové" formáty souborů, aby se v takovém případě přesměrování nedělo.

RewriteCond %{REQUEST_URI}  !(\.png|\.jpg|\.gif|\.jpeg|\.bmp)$


Smutné je, že pokud máme na stránkách třeba nějakou grafiku, tam pár ikonek, některá třeba chybí, tak to vlastně opakovaně načítá index.php i pro regulerního uživatele webu. Díky tomu se spousta věcí provádí duplicitně a zdržuje to dobu, než se vše ukáže uživateli webu. Tedy velké pozor na toto :-)¨

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0