Autor Zpráva
MP
Profil *
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
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 *
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 *
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
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 *
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
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 *
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
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 *
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
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 *
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
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 *
Ano,lenze ja zaroven potrebujem tu konkretnu spravu aj zobrazit.
Joker
Profil
Mp:
No a? To zařídí ten SELECT.
SwimX
Profil
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
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 :-)

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: