Autor Zpráva
Ameopro
Profil
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
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
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
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
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
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í.

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: