Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MySQL] Zliczanie rekordów
Forum PHP.pl > Forum > Przedszkole
desavil
Witam, poszukuję skryptu na zliczanie rekordów. Chodzi mi o to, że mam tabele o nazwie "players", a w niej są kolumny. Jedna z kolumn nazywa się "online", domyślna wartość jej to 0. Gdy ktoś jest zalogowany to wartość z liczny 0 zmienia się na 1. Chodzi mi o to żeby skrypt zliczał te rekordy z liczbą 1. Pozdrawiam.
Kuzry
Musisz zmodyfikować zapytanie żeby pobierało liczbę rekordów:

Coś w tym stylu bo nie wiem jaką masz strukturę tabeli:
  1. SELECT count(online) FROM players WHERE online = 1;
desavil
Proszę o pomoc co jest tutaj źle zamiast wyniku pokazuje mnie się biała strona, pusta.
  1. <?
  2. mysql_connect('127.0.0.1', 'XXX', 'XXX') or
  3. die (' Niepoprawne po??Ä?czenie z bazÄ? danych ');
  4. mysql_select_db('XXX') or die (' Z??a baza danych ');
  5.  
  6. $wynik = mysql_query ("SELECT count(online) FROM players WHERE online = 1");
  7.  
  8. while ($rekord = mysql_fetch_assoc($wynik)) {
  9. $online = $rekord['online'];
  10.  
  11. print "$online";
  12. }
  13. ?>


A gdy w bazie przez opcję "SQL" wywołam to:
  1. SELECT count(online) FROM players WHERE online = 1

To pokazuje poprawnie ilość rekordów zliczonych.
wookieb
  1. $wynik =mysql_query("SELECT count(online) as ile FROM players WHERE online = 1");
  2. $wiersz=mysql_fetch_assoc($wynik);
  3. print_r($wiersz);
desavil
Teraz to mi pisze takie coś:
Cytat
Array ( [count(online)] => 0 )


A ja chcę żeby pisała sama cyfra, a nie takie coś...
wookieb
A zobacz moje zapytanie
desavil
Ma pisać sama cyfra a nie takie coś.

Z twoim takie coś jest:
Cytat
Array ( [ile] => 0 )
wookieb
No to to sama cyfre wyciagnij.
  1. $wiersz['ile']

To az TAKI problem?
TrevorGryffits
To są podstawy... Dostęp do zmiennych tablicy.
desavil
Teraz to jest pusta strona i nic nie pisze...

Mój kod:
  1. <?
  2. mysql_connect('127.0.0.1', 'XXX', 'XXX') or
  3. die (' Niepoprawne po??Ä?czenie z bazÄ? danych ');
  4. mysql_select_db('XXX') or die (' Z??a baza danych ');
  5.  
  6. $wynik =mysql_query("SELECT count(online) as ile FROM players WHERE online = 1");
  7. $wiersz=mysql_fetch_assoc($wynik);
  8. $wiersz['ile']
  9. ?>
wookieb
Tragedia. NIC NIE MYŚLISZ!
  1. echo $wiersz['ile'];

Podałem ci tylko jak się dobrać do tej wartości.
Włącz raportowanie błędów i w rekę jakiś kurs php bo nic nie umiesz.
8_pasarzer_NOSTROMO
Podepnę się pod temat bo szkoda nowego zakładać.

Mam bazę danych z następującymi kolumnami :
id|miesiac|rok|1|2|3|4|5|6|7|8|9|10


Dla przykładu powiedzmy że baza danych ma tylko jeden wpis :
id = 1
miesiac = 06
rok = 2012
1 = 10
2 = 7
3 = W
4 = W
5 = 7
6 = 10
7 = 7
8 = W
9 = W
10 = W

Chciałbym zliczyć ile jest kolumn z wpisem "W" w polach od 1-10, i gdy miesiac=06 i rok=2012.

Chce otrzymać wynik = 5.

Jak to uczynić ?
8_pasazer_NOSTROMO
Co, nikt nie pomoże, czy aż tak trudne ? Choć słowo nakierujące ?
IProSoft
Podpowiedź
Kod
SELECT COUNT(id) AS ile FROM tabele WHERE  3='W' OR 4='W'

Nie wiem czy chcesz zliczać czy tylko w polu 3 jest W czy inaczej.

EDIT:
Nie doczytałem dokładnie, że ma być wynik 5 czyli zliczenie w komórkach, lepiej to wykonać w PHP - if z $i++
8_pasazer_NOSTROMO
Baza wyglada tak:
id|miesiac|rok|p1|p2|p3|p4|p5|p6|p7|p8|p9|p10

Ja to zrobiłem tak, ale muli strasznie gdy jest wiecej danych w bazie.

  1. for(x=1;$x<11;$x++)
  2. {
  3. SELECT p$i FROM tabela WHERE (p$i='W' && miesiac='05' && rok='2012')
  4. }
  5. $suma_ile=array_sum($ile);


Czy jest inna metoda by nie pętlować 10x. Bo mój sposób mieli wyniki około 30 sekund.
czychacz
może to nie jest perfekcyjne rozwiązanie, ale nie chce mi się myśleć.
spróbuj dodać indeksy dla pól miesiac, rok i wszystkich tych p-numerowanych, bo raczej indeksów tam chyba nie ma.
oczywiście na pewno jest jeszcze jakieś rozwiązanie, ale napiszę dopiero, gdy na nie wpadnę tongue.gif

//edit: indeksy INDEX najlepiej, bo raczej masz tam powtórzenia tongue.gif

//edit2: inną, bardziej oczywistą opcją, jest wysłanie tylko jednego zapytania, a później obrobienie wyniku w samym php. co nie wyklucza oczywiście użycia indeksów. wysyłasz zapytanie wybierające rekordy z określonej daty (miesiac, rok), pakujesz wszystko do tablicy dwuwymiarowej, przelatujesz pętlą, sprawdzając, czy podany rekord spełnia określone warunki.
8_pasazer_NOSTROMO
Dzięki za pomoc, ale chciałem zrobić to bez pętlowania, jeśli oczywiście się da. Pętlowanie wyników w tym wypadku bardzo spowolniają działanie całego skryptu. Jakby ktoś miał inne pomysły bardzo proszę.
IProSoft
Spowalnia bo źle kombinujesz.
Najpierw pobierasz cały wiersz, a następnie obrbiasz go w PHP, teraz 11 razy wykonujesz zapytanie, a wystarczy raz.
(polegając na pierwszym posicie, że masz jeden wiersz wypełniony.)

  1. $row = SELECT * FROM tabela WHERE miesiac='05' && rok='2012' LIMIT 1
  2. $i = 0;
  3. for($x=1;$x<11;$x++)
  4. {
  5. if($row['p'.$i] == 'W')
  6. {
  7. $i++;
  8. }
  9. }

a jeśli więcej
  1. $row = SELECT * FROM tabela WHERE miesiac='05' && rok='2012'
  2.  
  3. foreach($row as $s => $r){
  4.  
  5. for($x=1;$x<11;$x++)
  6. {
  7. if($r['p'.$i] == 'W')
  8. {
  9. $i++;
  10. }
  11. }
  12. }

kefirek
  1. $result = mysql_query("SELECT CHAR_LENGTH(CONCAT(1, 2, 3, 4, 5, 6, 7, 8, 9, 10))-CHAR_LENGTH(REPLACE(CONCAT(1, 2, 3, 4, 5, 6, 7, 8, 9, 10),'w','') AS num FROM tabela WHERE miesiac=06 AND rok=2012");
8_pasarzer_NOSTROMO
@ kefirek

Mam pytanko, czy mógłbyś mi wytłumaczyć mniej więcej co robi takie zapytanie. Chciałbym to zrozumieć a nie tylko przekopiować i wkleić.
IProSoft
A wywołałeś jes przez PHPMyAdmin??

CONCAT łączy stringi, czyli np masz pola Imie i Nazwisko:
  1. SELECT CONCAT(Imie, Nazwisko) AS dane FROM tabela

da Ci wynik ImieNazwisko(AdamKowalski)
http://www.mysqltutorial.org/sql-concat-in-mysql.aspx

CHAR_LENGTH i REPLACE chyba nie muszę tłumaczyć bo ich nazwa wskazuje na funkcję.

Radzę wykonać zapytanie w MySQL, w tej formie, podzielić na części, wtedy będzie najłatwiej poznać działanie.
8_pasarzer_NOSTROMO
Cytat(kefirek @ 29.05.2012, 16:29:40 ) *
  1. $result = mysql_query("SELECT CHAR_LENGTH(CONCAT(1, 2, 3, 4, 5, 6, 7, 8, 9, 10))-CHAR_LENGTH(REPLACE(CONCAT(1, 2, 3, 4, 5, 6, 7, 8, 9, 10),'w','') AS num FROM tabela WHERE miesiac=06 AND rok=2012");



A czy jest możliwość zastosowania w pytaniu --> (LIKE '%w%') gdyż "W" występuje również w postaci "Wn".
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.