Autor Zpráva
capricorn
Profil
Zdravim,

mam tabulku, ktera se automaticky nekolikrat denne aktualizuje. Cislovani radku jsem resil pomoci cyklu a insert nebo update jsem resil pres ON DUPLICATE KEY UPDATE. Vse funguje bez problemu, ale za podminky, ze se vzdy aktualizuje stejny pocet radku. Mam 5 cyklu a kdyz jeden cyklus je preskocen z duvodu, ze data pro ten cyklus nejsou momentalne k dispozici, tak to dela neplechu. Dalo by se to vyresit tim, ze bych zadal pocet radku, ktere se maji pricist a dalsi cyklus by to bral na zretel, ale potiz je v tom, ze ja nevim, kolik bude radku. Takze jsem premyslel, jak to vyresit, napadlo mne, ze na zacatku scriptu si do promenne ulozim time() a udelam normalne insert a potom vsechny radky, ktere maji mensi time, nez ktere je v promenne, tak vymazu. Ale otazkou je, jestli je to elegantni reseni, jestli by to neslo vyresit jinym pusobem. Me osobne se to zna nejrychlejsi zpusob, ktery vlozi nove radky a ty co nemaji v db co delat tak se vymazou, ale potiz je v tom, ze do doby nez ty radky budou smazany, tak budou v db porad figurovat. Dal bych do scriptu, ktery ty data cte podminku, ale kdyz tam dam time() a dam ze se maji vybrat jen radky, ktere se rovnaji time(), tak db nevybere zadny radek, protoze time je uz jine. A mne nenapada jine reseni.

Mate nekdo prosim napad, jak to elegantnim a rychlych zpusobem vyresit?
Kajman_
Profil *
Takže hledáte jiné vypočítávání pořadí?
Mastodont
Profil
Nepochopil jsem. Můžete dát ukázku, jak ta data vlastně vypadají, co vkládáte a co mažete?
capricorn
Profil
Kajman_

Ono nejde az tak o vypocitavani poradi, protoze ted se trefim do toho poradi, ale treba za tri tydny to muze byt jinak, muze byt mensi nebo vetsi. Proste ted ten script testuji na urcite veci, ktere mohou, ale i nemusi nastat. Potreboval bych spise jine voditko, ktere by nebylo zalozeno na zaklade unikatni hodnoty.

Dam radeji priklad:

Uplne prazdna tabulka a spusteni scriptu, ktery ulozi data z pole, ktere vzniklo 5-ti cykly

unique | data | cyklus
1 | Anna | 1
2 | Renata | 1
3 | Jana | 2
4 | Tomas | 3
5 | Pavel | 4
6 | Jan | 5

Ted se za x hodin spusti script znovu a prvni cyklus bude preskocen, takze se spatne prepisi radky, ale mely by se prepsat jen radky z toho pole, takze unique 1, 2 se musi preskocit a zacit prepisovat od unique 3 a unique 1, 2 prepsat az budou data k dispozici (napr. u dalsiho spusteni scriptu za x hodin). Jak jsem napsal, na tento postup se neda na 100% spolehnout.
capricorn
Profil
Mastodont

Ukazka je ve ctvrtem prispevku. Ja prave nic nemazu, ale potrebuji mazat v tom take neni problem, ale jedna se mne o to, ze kdyz v dobe behu toho scriptu probehne SELECT, tak db vrati i radky, ktere se momentalne mazou.

Ono by to slo vyresit uzamknutim tabulky a SELECT povolit az se tabulka odemkne, ale ja nechapu princip uzamknuti tabulky, aby to nehazelo error. ;-) Nikdy jsem to nedelal, takze nevim.
Kajman_
Profil *
Tak si uděleteje primární klíč na dvou sloupcích (cyklus,id_v_ramci_cyklu).
capricorn
Profil
Kajman_

Kdyz si udelam primarni klice, tak to treba vyresi ten problem, ze se prepisou spravne radky i v pripade preskoceni nejakeho cyklu, ale v pripade, ze treba prvni cyklus bude mit 100 radku a za x hodin jen 99 radku, tak ten jeden tam porad bude a v SELECTu se take promitne, protoze ja pro DELETE nijak nezjistim klic toho radku, ktery tam nema co delat a z toho duvodu ho take nemuzu vymazat.

Ceho ja se muzu jedine chytnout, tak je promenna

$upgrade = time();
$sql = 'INSERT INTO ......... VALUE($uprade) ';
$sql = 'DELETE ................. WHERE upgrade != $upgrade';

Timto zpusobem budou v tabulce vzdy aktualni data, ale kdyz db bude 5 sekund mazat radky a v 3 sekunde probehne nahodou SELECT a bude v nem zahrnut i posledni radek, ktery ma byt smazan, tak db vrati spatny vysledek.
Kajman_
Profil *
Tak si ty dva příkazy dejte do transakce.
http://dev.mysql.com/doc/refman/5.1/en/sql-syntax-transactions.html
capricorn
Profil
Kajman_

To zni zajimave, kazdopadne dekuji.
capricorn
Profil
Jeste bych se vratil k tem transakcim. Funguji paradne a podle mych predstav, ale nechapu proc se dotaz na lokalu provede a ulozi data do databaze na serveru, ale kdyz ten script provedu na serveru, tak se INSERT neprobehne, ale probehne jen DELETE. Zkousel jsem to dat do jednoho retezce oddelene strednikem, tak jako v klauzuli, ale bez vysledku, hodilo to error. Nechapu to. Nevite prosim v cem by mohl byt problem?

$result = my_query("START TRANSACTION");
$result = my_query($sql);
$result = my_query("DELETE FROM date_get WHERE code IN($control) AND upgrade != $upgrade");
$result = my_query("COMMIT");
Kajman_
Profil *
Vypište si výsledné sestavené dotazy a případné mysql_error každého z nich. (Při chybě v některém z dotazů pak přeci nechcete commit ale rollback).

Máte v kladení dotazů docela rezervy. Zkuste se vcítit do čtenářů, jak poznají, co je v $sql?
capricorn
Profil
Kajman_

Zadny error dotazy nevypsaly a tak jsem zkusil vypsat si co vlastne INSERT vklada do databaze, kdyz ten script spustim na lokalu a na serveru. Chyba je pri tvorbe INSERTu a ja zatim neprisel kde, protoze se mne to zda zvlastni, ze na lokalu je INSERT spravne a na serveru tam chybi hodnoty.
Transakce jsou pro mne neco noveho, bude chvilku trvat nez to pochopim. Vcera jsem cetl o nich clanky a neda se rict, ze bych je chapal a Vy jste to take naznacil, ze se musi myslet na chyby, takze tam musi byt nejake podminky.
Co se tyka tech mych dotazu, tak mate pravdu, nekdy je to docela silenost se v tom vyznat, s tim plne souhlasim. Ale v tomto pripade pozorny cternar zjisti, ze kdyz INSERT neni uveden v te transakci, tak INSERT obsahuje promenna $sql. Soudim to podle sebe, ale kritiku beru, protoze je opravnena.
capricorn
Profil
Tak z toho jsem vazne jelen, protoze jsem si myslel, ze chyba bude nekde jine. :-)

Serveru vadi tohle a na lokalu to nevadi, takze nechapu.

$export = array(1 => 'http://www.example.com');
$file = file($export[1]);

Nevi prosim nahodou nekdo, proc tomu tak je? I kdyz tento dotaz nepatri do teto kategorie, ale nechci kvuli tomu zbytecne zakladat nove vlakno v php. A hrozne mne to zajima, protoze stejna funkce, ale rozdilne chovani.
tiso
Profil
capricorn: zakázaná direktíva allow_url_fopen, takže máš smolu. Iba že by si si vybavil aby ti to na hostingu povolili, prípadne si to skús povoliť v .htaccess
capricorn
Profil
tiso

Asi jsi mne spatne pochopil. Funkce file() na serveru normalne funguje, ale serveru vadi ty jednoduche uvozovky, pokud tam dam dvojte, tak to funguje bez problemu. A ja nechapu proc, tomu tak je.
tiso
Profil
capricorn: - to je nejaká blbosť. Píše ti to nejakú chybu? Alebo čo ti vypíše var_dump($export);?
capricorn
Profil
tiso

Take na to hledim jako puk. ;-) Nevypisuje to zadnou chybu. A na serveru i na lokalu mne to vypise tohle:

$export = array(1 => 'http://www.example.com');
var_dump($export);

array(1) { [1]=> string(22) "http://www.example.com" }

A jinde nemuze byt problem, jen v tech uvozovkach. Misto toho, abych se ucil transakce, tak mne brdi takova nepochopitelna zahada.
tiso
Profil
capricorn: - v tom prípade nie je problém v tých uvodzovkách, ale v tom čo som písal.
capricorn
Profil
tiso

Ver nebo never, ale chyba je vazne pouze v tech uvozovkach, pokud mam pole

$export = array(1 => "http://www.example.com");

tak funkce file() nacte soubor do pole. Pokud jsou tam jednoduche, tak smula.
tiso
Profil
capricorn: neverím...
capricorn
Profil
tiso

Mam tu milion oken otevrenych, takze jsi mel pravdu, na serveru je allow_url_fopen off. A kdyz dam do .htaccess php_flag allow_url_fopen on, tak mne to hodi 500 . Takze se omlouvam. Jsem proste jelen. ;-) Musim ten script bud spoustet z lokalu nebo to prepsat, tak aby i soubory typu *.txt nacital pomoci curl.

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