Autor | Zpráva | ||
---|---|---|---|
Ameopro Profil |
#1 · Zasláno: 30. 4. 2015, 18:59:46
Ahoj prosím vás kde mám chybu chci aby čerpal z obou mysql tabulek : SELECT * FROM sms_cisla cross join sms_cisla WHERE numbers='0' LIMIT 20 vůbec nechce čerpat ani z jedné
|
||
lionel messi Profil |
Ameopro:
„Ahoj prosím vás kde mám chybu chci aby čerpal z obou mysql tabulek : SELECT * FROM sms_cisla cross join sms_cisla WHERE numbers='0' LIMIT 20“ Si si vedomý toho, že joinuješ tú istú tabuľku? Za istých okolností to nie je chyba (práve naopak, často je to žiaduce), premýšľam však, či má takýto CROSS JOIN zmysel a nejde o akýsi nesprávny návrh databázy. „vůbec nechce čerpat ani z jedné“ Čo to bližšie znamená? Čo presne dotaz robí? Opäť si nepopísal problém práve najšťastnejšie. Syntakticky je dotaz správny, viac informácií nemám. |
||
Ameopro Profil |
#3 · Zasláno: 30. 4. 2015, 19:32:02
Pardon
Celí script vypadá takto : <?php include_once "view/config/config.php"; function getRightControl($newsperpage, $page_number, $array){ return ($page_number == ceil(count($array)/$newsperpage) - 1) ? ceil(count($array) / $newsperpage) - 1 : $page_number + 1; } function getLeftControl($page_number){ return ($page_number == 0) ? $page_number : $page_number - 1; } function cislaZDb() { $query = "SELECT * FROM sms_cisla cross join sms_cisla WHERE numbers='0' LIMIT 20"; $result = mysql_query($query); $arr = array(); while($item = mysql_fetch_array($result)) { $arr[count($arr)] = $item; } zmenDb(); return $arr; } function zmenDb() { $query = "UPDATE sms_cisla cross join sms_cisla SET numbers='1' WHERE numbers='0' LIMIT 20"; $result = mysql_query($query); if(!$result) { return false; } } $cisla = cislaZDb(); $newsperpage = 20; ?> <?php foreach ($cisla as $key => $value) { $cislo = $value['input_telephone']; echo "" . $cislo . ", "; } ?> má to vlasně vypsat čísla z db po 20 z obou databází. |
||
Kajman Profil |
#4 · Zasláno: 30. 4. 2015, 23:37:58
Ameopro:
„má to vlasně vypsat čísla z db po 20 z obou databází.“ Z jakých databází? Zkuste prosím jasně slovně popsat o co vám jde. Kód smysl nedává. |
||
Keeehi Profil |
#5 · Zasláno: 1. 5. 2015, 06:52:49
Ameopro:
Víš, že to CROSS neznamená napříč dvěmi databázemi ale něco úplně jiného? A ještě malá poznámka, teď ti to možná bude fungovat ale jakmile na to pustíš více uživatelů zároveň, tak to začne dělat psí kusy. Protože updatuješ prvních 20 záznamů. Nikde nemáš zaručeno, že je těch 20 stejných záznamů které jsi před chvílí vybral. |
||
Ameopro Profil |
#6 · Zasláno: 1. 5. 2015, 10:23:31
v databází jsou sloupce ID input_telephone a numbers
Pokud maji numbers="0" tak se vypíší po vypsání dají numbers="1" a ty již vypisovat nebude. protože má podmínku vypisovat numbers="0" a limit 20 |
||
Keeehi Profil |
#7 · Zasláno: 1. 5. 2015, 19:16:17
Je mi jasné co vidíš a že si nedokážeš představit situaci, kde by to mohlo ne fungovat ale jsem si jistý že tam problém je.
1. Nemáš tam garantované pořadí. Tudíž databáze může vrátit 20 jakýchkoli záznamů. To že většinou vrací pořád těch 20 stejných je normální. Problém je s tím slůvkem většinou. Ty se spoléháš na to, že vždycky ale žádná taková garance neexistuje. 2. problém s pararelním souběhem. Toto je mnohem větší problém. Ukážu to na příkladu kde pro zjednodušení budu místo 20ti záznamů vybírat jen 2. Mějme v databázi 7 záznamů ID 1-7 a numbers = 0 1. Návštěvník 1 požádá o stránku výpis.php 2. Kód se provede až po ten select where numbers=0 limit 2 a vytvoří se pole $arr s {1, 2} 3. Návštěvník 2 také požádá o stránku výpis.php 4. Procesor přeruší vykonávání scriptu pro Návštěvníka 1 a začne se starat o Návštěvníka 2 5. Návštěvníkův(2) kód se taky dostane k selectu a jelikož ještě žádný update neproběhl, budou mu zase vráceny záznamy 1 a 2. 6. Nyní se počítač rozhodne, že se Návštěvníkovi 2 věnoval už dost a tak se vrátí k Návštěvníkovi 1. Pokračuje tam, kde předtím skončil takže updatem. 7. Provede se update, v databázi mají teď záznamy 1 a 2 v numbers hodnotu 1 a záznamy 3-7 mají v numbers 0 8. Tím práce pro Návštěvníka 1 končí a zobrazí se mu záznamy 1 a 2 9. Zbývá nám ještě doobsloužit Návštěvníka 2. Tam se skončilo taky před updatem tak se provede. 10. Stav databáze je teď 1-4 number=1, 5-7 number=0. 11. Script pro návštěvníka 2 taky končí a vypíše se mu 1 a 2 přestože teď updatoval 3 a 4. Takže ač je databáze na konci ve stavu v jakém by byla kdyby návštěvníci přišli po sobě, zobrazil se jim něco jiného, než bylo zamýšleno. Záznamy 1 a 2 byly zobrazeny 2x a záznamy 3 a 4 nikdo neviděl a nikdy je neuvidí. A to je ten problém který při pararelním zpracování nastane. Problém je, že se to těžko testuje protože nemáš kontrolu nad tím kdy a jestli vůbec provede procesor přerušení. |
||
Časová prodleva: 9 let
|
0