Autor Zpráva
yenkee
Profil *
Ahoj.

Mám implementovanou třídu s metodou _update. Tato metoda provede následující příkazy:

mysqli_query($_SESSION['mysql'],"UPDATE produkty__vlastnosti SET poradi=0 WHERE (poradi='2')");
mysqli_query($_SESSION['mysql'],"UPDATE produkty__vlastnosti SET poradi='2' WHERE (poradi='1')");
mysqli_query($_SESSION['mysql'],"UPDATE produkty__vlastnosti SET poradi='1' WHERE (poradi='0')");

Nevíte jak je možné, že metoda po zavolání provede tyto příkazy dvakrát? Díky za pomoc s tímto zapeklitým problémem..
zero0x
Profil
si to skus odladit nejakym echo "calling _update"
yenkee
Profil *
Jo zkusil sem..zobrazí se to jenom jednou.
Sem tam napsal místo UPDATE jeden příkaz INSERT a vloží se mi dva řádky, přitom to vypíše "calling_update" jen jednou..

A i když hned tady za ty příkazy napíšu exit(), stejně se to do DB vloží dvakrát. Divné.
souki
Profil
a nespouští se ti to někde v iframu, ajaxem nebo tak?
yenkee
Profil *
Iframe tam nemám..a ajax taky nepoužívám (nevím úplně co to je).
yenkee
Profil *
Jo a nevadí tomu třeba to, že mám připojení k databázi pomocí funkce, kterou volám před každým dotazem do DB? Takže se vlasně připojuju znovu, aniž bych ukončil předchozí spojení..
souki
Profil
A proč se připojuješ před každým dotazem?
yenkee
Profil *
Protože po nějaké době připojení spadne, tak se připojuju před každým dotazem..samozřejmě že před dotazy, které následují po sobě v jednom dokumentu se nepřipojuju pokaždé..

Jak se to teda řeší? A je vůbec vhodné ukládat si připojení do proměnné SESSION?
bukaj
Profil
nejmenuje se i třída _update? pak je možné, že php pokládá fci _update() za constructor...
jinak bych ověřil, jestli není volána někde jinde, nebo nějakou jinou metodou již předtím.
zkusil bych si tam doplnit vypsání aktuálního souboru (__FILE__) a řádku (__LINE__) potom by se chyby mohly odhalovat jednodušeji
yenkee
Profil *
Je to pro mě fakt záhada..nikde jinde metodu nevolám. Ani metoda '_update' není constructor..
Jenom ještě taková poznámka:

Když zavolám metodu '_update', a pak zavolám další metodu, která vybere z databáze data, tak se data vypíší správně. A když script skončí, tak se podívu do DB přes phpMyAdmin a data sou zase jak předtím(to znamená, jako bych metodu '_update' spustil dvakrát)..vypadá to jako by PHP poslalo příkazy MySQL dvakrát, protože příkaz echo se vykoná jen jednou..

No nevím. Je toto možné?
souki
Profil
neukážeš nám celou tu třídu? reps kus důležitého kódu?
yenkee
Profil *
class c_products{
function _update(){
echo __FILE__;
echo __LINE__;
mysqli_query(CMysql(),"INSERT INTO produkty__vlastnosti (poradi,nazev,jednotka) VALUES ('0','delka','m')");
exit();
}
}

Tuto metodu když spustím, tak se vypíše cesta a řádek, a v databázi se objeví dva záznamy..
bukaj
Profil
yenkee
takže to vypíše cestu a řádek jen jednou? v tom případě se metoda spustí jen jednou a chyba musí být někde uvnitř
yenkee
Profil *
jo..nebo mezi PHP a MySQL..
yenkee
Profil *
A nevadí že neuzavírám připojení k MySQL?
bukaj
Profil
nebo mezi PHP a MySQL..
taky možnost. jiné dotazy se také vykonávají dvakrát?

A nevadí že neuzavírám připojení k MySQL?
nemělo by

btw. co dělá fce CMysql()? vrací link na spojení?
yenkee
Profil *
Jo..CMysql() vrací link.
Všechny MySQL příkazy se provedou dvakrát.

A něco mi přijde trochu podezřelé. Když vytvořím spojení s MySQL a spustím funkci mysqli_stat(CMysql()); tak to vypíše THREADS: 2
Nevím úplně co to znamená, ale v dokumentaci k PHP je při spuštění fce vypsáno: THREADS: 1
bukaj
Profil
tak to vypíše THREADS: 2
jsou spuštěna dvě vlákna. proto se to udělá vícekrát.
yenkee
Profil *
Tak sem na to došel..asi to není tím THREADS: 2
Je to tím tagem <img src="" /> (těma prázdnýma uvozovkama), který sem měl před volání metody '_update'. Když ho s tama smažu, tak vše funguje jak má. Kyž ho tam nechám, dělá to o čem sem tu psal..
Když ale umístím do uvozovek adresu, tak to začne fungovat. Taky když omylem napíšu: <img src=" /> tak to nefunguje. Mám takový dojem, nebo spíš už sem přesvěčen, že v PHP je chyba.

<html>
<head>
<title>page_1</title>
</head>
<body>
<img src="" />
<?php
require_once("c_produkty.php");

$obj = new c_products;
$obj->_update();
echo mysqli_stat(CMySQL());
echo mysqli_stat(CMySQL());
?>
</body>
</html>

Zajímalo by mě, jestli to tak blbne jen mě, nebo i někomu jinému..
koudi
Profil
sem přesvěčen, že v PHP je chyba
Není.

Zajímalo by mě, jestli to tak blbne jen mě, nebo i někomu jinému..
Za daných okolností to tak bude u každého.


Je to jasny, protože jak to browser načitá, tak narazí na obrázek. Podívá se na adresu (která je prázdná - vezme tedy adresu aktuální stránky) a požádá o ni server. Tudiž se to provede dvakrát. Není to nijak nepochopitelné a rozhodně to není žádná chyba.
yenkee
Profil *
Jo..to je pravda..
Kurnik, ale dojit na tu chybu mi trvalo pul dne..úžasné.:)
Díky chlapi za pomoc.
Pavel Strejček
Profil
yenkee
SET poradi=0 WHERE poradi='2'
SET poradi='1' WHERE poradi='0'


Nebylo by lepší rovnou provést SET poradi='1' WHERE poradi='2'?
souki
Profil
Pavel Strejček
Nešlo. Páč IMHO jsou ty pořadí jen 2 a on je potřebuje prohodit
Pavel Strejček
Profil
Sry, nebylo, už to vidím

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