Autor | Zpráva | ||
---|---|---|---|
MP Profil * |
#1 · Zasláno: 26. 10. 2009, 21:11:38
Zdravím.
Pre výpis údajov z DB používam nasledujúci kód: do { $sql = "SELECT * FROM tabulka WHERE vek = '$vek' LIMIT 10"; mysql_query("SET NAMES 'UTF8'"); $vysledek = mysql_query("$sql"); while($riadok = mysql_fetch_array($vysledek)) { $riadok = $riadok["riadok"]; }} while (false); Problém je v tom, že po časti $riadok = $riadok["riadok"]; znova pristupujem k databázy pre overenie inej podmienky a tým pádom sa pre každý SELECT znovu pristúpy k databáze, čo spôsobuje prekročenie limitu prístupov k DB z jedného scriptu. Potreboval by som niečo, čím jeden krát pristúpim k DB a až následne budem overovať ďalšie podmienky. |
||
SwimX Profil |
#2 · Zasláno: 26. 10. 2009, 21:14:17
MP:
řekni co máš v DB, jakou potřebuješ tu podmínku atd. a dáme dohromady jeden dotaz, protože mít dotaz uvnitř cyklu je fuj. |
||
MP Profil * |
#3 · Zasláno: 26. 10. 2009, 21:22:28
v DB mám tabuľku SPRAVY (id, datum, odosielatel, prijimatel, sprava, precitana)
- v SELECTe vyberiem iba správy kde ODOSIELATEL = prihlaseny, PRIJIMATEL = partner a tiež ODOSIELATEL = partner, PRIJIMATEL = prihlaseny teda všetky správy ktoré odoslal alebo prijal prihlásený užívateľ od konkrétneho partnera. - potom potrebujem overiť či prihlásený užívateľ je PRIJIMATEL -> v tedy nastavím konkrétnej správe PRECITANA=ANO -vypíšem dátum, správu a v prípade že prihlásený úžívateľ=PRIJIMATEL zmením farbu tohoto textu |
||
MP Profil * |
#4 · Zasláno: 26. 10. 2009, 21:27:05
Lenže pokiaľ PARTNER poslal PRIHLASENEMU, a/alebo naopak 100 správ, každá správa sa najskôr otvorí, prípadne označí za prečítanú a tak to máme dohromady:
partner odoslal 100 správ - 100 prístupov do DB prijímatel odoslal 100 správ - 100 prístupov do DB polovica správ neprečítaných - 100 prístupov do DB celkom 300 prístupov do DB v priebehu 1 sekundy, možno dvoch. v prípade že toto urobí naraz 100 prihlásených užívateľov do systému - problém... |
||
Joker Profil |
#5 · Zasláno: 26. 10. 2009, 21:37:50
MP:
„každá správa sa najskôr otvorí, prípadne označí za prečítanú“ Proč každá? Půjde vrátit všechny zprávy jedním dotazem, ne? A jaká je podmínka pro to, aby se označily za přečtené? |
||
MP Profil * |
#6 · Zasláno: 26. 10. 2009, 22:03:47
podmienka je:
if ($prihlaseny<>$partner AND $precitana<>"ano"){ include ("config.php"); mysql_query("SET NAMES 'UTF8'"); mysql_query("UPDATE spravy SET precitana = 'ano' WHERE id = '$id_spravy';", $link); }else{} |
||
Joker Profil |
#7 · Zasláno: 26. 10. 2009, 23:01:11
MP:
1. Čili všechny existující nepřečtené zprávy se označí za přečtené? To jde přece udělat hromadně jedním dotazem a není třeba to dělat zprávu po zprávě. 2. SET NAMES stačí nastavit jednou na začátku spojení, není třeba to dělat před každým dotazem 3. Jakého datového typu je sloupec precitana? |
||
MP Profil * |
#8 · Zasláno: 26. 10. 2009, 23:08:50
Joker:
1) všetky neprečítané,ktorých príjemca je PRIHLASENY a odosielateľ je PARTNER (ide o to aby sa za prečítanú označila každá z týchto správ iba v tedy,ak bola práve zobrazená) 2) ok, ale tu problém myslím nieje 3) VARCHAR |
||
Joker Profil |
#9 · Zasláno: 27. 10. 2009, 07:38:21
MP:
1) Takže přijemce je přihlášený, odesilatel je partner a zpráva byla právě zobrazená? Podle čeho se pozná, že zpráva byla právě zobrazená? Mimochodem, nestačila by prostě ta poslední podmínka? 2) Asi ne, protože SET NAMES je velmi rychlý. Přesto, jestli má server limit na počet databázových dotazů, tohle sníží počet dotazů o 50% (skoro). 3) Tajně jsem doufal, (když už to má hodnotu "ano") že to bude alespoň SET. K čemu VARCHAR, pokud jsou jen dvě možné hodnoty ("ano" a "ne")? Dal bych buď SET, nebo TINYINT (s 0 a 1 pro ne a ano) |
||
MP Profil * |
#10 · Zasláno: 27. 10. 2009, 22:16:25
1) správne, správa sa otvorí pomocou požiadavky, ktorá je ešte nad tou overovacou, t.j. zobrazím všetky správy ktoré patria prihlásenému a ak správa ešte nebola nikdy zobrazená (načítaná), zmením hodnotu PRECITANA na áno.
2) dobre, vynechám SET NAMES 3) je v tom veľký rozdiel? čo sa týka napr. do rýchlosti, záťaže pre DB... |
||
Joker Profil |
#11 · Zasláno: 27. 10. 2009, 23:05:44
MP:
„správne, správa sa otvorí pomocou požiadavky, ktorá je ešte nad tou overovacou, t.j. zobrazím všetky správy ktoré patria prihlásenému a ak správa ešte nebola nikdy zobrazená (načítaná), zmením hodnotu PRECITANA na áno.“ No já se stále marně snažím dopátrat tohohle: Všem zprávám, kde odesílatel je A a příjemce je B a nebyly ještě přečtené se v tu chvíli nastaví, že byly přečtené. - je toto pravda, nebo ne? „3) je v tom veľký rozdiel? čo sa týka napr. do rýchlosti, záťaže pre DB...“ Ve sloupci nemůže být jakýkoliv text, ale jen jedna z hodnot "ano" a "ne". Pak je zbytečné použít VARCHAR. Navíc VARCHAR zabere víc paměti- budu-li předpokládat, že v tabulce bude poměrně hodně záznamů a skoro všechny budou přečtené (tj. hodnota "ano"), sníží typ SET oproti VARCHAR potřebnou paměť na uložení hodnot daného sloupce zhruba na polovinu, TINYINT zhruba na čtvrtinu. I když uznávám, že v tomhle případě asi nejsou až tak důležité takovéhle optimalizace. V tomhle případě jsou totiž podle mě ty stovky SQL dotazů zbytečné a půjde je nahradit jedním nebo několika. |
||
Mp Profil * |
#12 · Zasláno: 28. 10. 2009, 07:25:23
Ano,to je pravda. V strucnosti by to malo vyzerat asi takto:
Klasickou poziadavkou DO-WHILE vypisujem postupne vsetky spravy ktore sa tykaju konkretneho uzivatela a prijimatela. Zaroven zistim ci ma ta sprava nastavene precitanie na ANO a ak nema,tak ho nastavim,lebo sa prave nacitala a zobrazila... |
||
Joker Profil |
#13 · Zasláno: 28. 10. 2009, 08:18:39
Mp:
Fajn, tak na to stačí jeden UPDATE dotaz, když ho popíšu slovně: Pro všechny zprávy, kde příjemce je X, odesílatel je Y a přečtené = ne nastav přečtené = ano |
||
Mp Profil * |
#14 · Zasláno: 28. 10. 2009, 08:43:26
Ano,lenze ja zaroven potrebujem tu konkretnu spravu aj zobrazit.
|
||
Joker Profil |
#15 · Zasláno: 28. 10. 2009, 08:57:38
Mp:
No a? To zařídí ten SELECT. |
||
SwimX Profil |
#16 · Zasláno: 28. 10. 2009, 08:58:01
Mp:
nečetl jsem celé vlákno, ale pokud chceš jeden UPDATE a zároveň ho zobrazit (SELECT) tak to jsou 2 dotazy, a ne několik stovek kolik jsi říkal :) |
||
Joker Profil |
#17 · Zasláno: 28. 10. 2009, 09:08:14
SwimX:
„pokud chceš jeden UPDATE a zároveň ho zobrazit (SELECT) tak to jsou 2 dotazy, a ne několik stovek kolik jsi říkal :)“ To se mu snažím vysvětlit :-) |
||
Časová prodleva: 14 let
|
0