Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MySQL]Problem z pobieraniem i zliczaniem danych.
Forum PHP.pl > Forum > Przedszkole
Marcinekk
Witam. Mam taki malutki skrypcik:

  1. $_GET['id'] = (int)clear($_GET['id']);
  2. $wynik23=mysql_query("SELECT * FROM users WHERE `Company_Code` = '{$_GET['id']}'");
  3. $result=mysql_fetch_array($wynik23);
  4. $wynik2=mysql_query ("SELECT COUNT(id) AS qnt FROM trasy WHERE `steamid` = '{$result['steamid']}' AND `status` = 'Finished'");
  5. $result2=mysql_fetch_array($wynik2);
  6.  
  7.  
  8. echo 'Trasy: '.$result2[qnt].'';


Ma to działać tak, że z tabeli users_company pobiera mi informacje o użytkownikach spełniających warunek Company_ID = '{$_GET['id']}'. Drugie zapytanie ma zliczać liczbę tras użytkowników spełniających warunek steamid = '{$result['steamid']}'

Niestety pobiera tylko jednego użytkownika, który ma najmniejsze id (spełniającego w/w warunek). Proszę o pomoc.
viking
fetch array zwraca tablicę. Musisz po niej iterować tworząc np ciąg 1,2,3 który możesz użyć w zapytaniu WHERE steamid IN(twojaTablica)
kapslokk
1.
  1. $_GET['id'] = (int)clear($_GET['id']);

Nadpisywanie danych w tablicach superglobalnych to zły nawyk.

2. http://php.net/manual/en/function.mysql-connect.php :
Cytat
This extension was deprecated in PHP 5.5.0, and it was removed in PHP 7.0.0.

3. Pobiera Ci jednego użytkownika, bo nie odbierasz danych w pętli - zajrzyj do manuala
4. Nie potrzebujesz 2 zapytań, możesz zrobić jedno i wykorzystać JOIN. http://dev.mysql.com/doc/refman/5.7/en/join.html
Marcinekk
Załóżmy, że robię w ten sposób:

  1. $wynik = mysql_query("SELECT COUNT(id) AS qnt FROM jobs WHERE `status` = 'Finished' AND steamid IN(users)")
  2. or die('Błąd zapytania');
  3. if(mysql_num_rows($wynik) > 0) {
  4. while($r = mysql_fetch_assoc($wynik)) {
  5.  
  6. echo ' '.$r['cos'].' ';
  7.  
  8. }
  9. }


Zacznie mi zliczać dla każdego użytkownika i wywalać osobno.
Kishin
Cytat(Marcinekk @ 7.12.2016, 09:03:27 ) *
Załóżmy, że robię w ten sposób:

  1. $wynik = mysql_query("SELECT COUNT(id) AS qnt FROM jobs WHERE `status` = 'Finished' AND steamid IN(users)")
  2. or die('Błąd zapytania');
  3. if(mysql_num_rows($wynik) > 0) {
  4. while($r = mysql_fetch_assoc($wynik)) {
  5.  
  6. echo ' '.$r['cos'].' ';
  7.  
  8. }
  9. }


Zacznie mi zliczać dla każdego użytkownika i wywalać osobno.


to zapytanie zawsze Ci zwróci 1 wynik, musisz po czymś pogrupować, np.:

  1. $wynik = mysql_query("SELECT COUNT(id) as ilosc,status AS qnt FROM jobs WHERE `status` = 'Finished' AND steamid IN(users) group by status")
  2.  

to wyrzuci Ci ilości dla każdego statusu,
wtedy dajesz
  1. while($r = mysql_fetch_assoc($wynik)) {
  2. echo 'status: '.$r['status'].'</br>';
  3. echo 'ilosc: '.$r['ilosc'].'</br></br>';
  4. }
  5.  


Analogicznie sobie wyciągnij co tam potrzebujesz
Marcinekk
@up Nie działa to. Błąd zapytania wywala. Ogólnie status nie gra tam jakiejś większej roli, chodzi o to, żeby zliczał te zapytania, które mają status Finished i pasują do wszystkich użytkowników z danej firmy i wtedy ma wyświetlać wszystkie zliczone trasy. Nie dla każdego pojedynczo.

Zrobiłem tak:

  1. $wynik = mysql_query("SELECT COUNT(id) as ilosc,status AS qnt FROM jobs WHERE `status` = 'Finished' AND steamid IN(users) group by status")
  2. or die('Błąd zapytania');
  3. //if(mysql_num_rows($wynik) > 0) {
  4. while($r = mysql_fetch_assoc($wynik)) {
  5. echo 'ilosc: '.$r['ilosc'].'</br></br>';
  6. //}
  7. }


To co jest jako komentarz też próbowałem, nic nie zmieniło.
kapslokk
Do IN() można podać wartości rozdzielone przecinkiem, a nie cala tabele - pisałem już, żebyś użył JOIN'a

Marcinekk
  1. $wynik = mysql_query("SELECT COUNT(id) as ilosc FROM jobs WHERE `status` = 'Finished' INNER JOIN users ON jobs.steamid=users.steamid;")
  2. or die('Błąd zapytania');
  3. if(mysql_num_rows($wynik) > 0) {
  4. while($r = mysql_fetch_assoc($wynik)) {
  5. echo 'ilosc: '.$r['ilosc'].'</br></br>';
  6. }
  7. }


Zrobiłem w taki sposób, nadal nic to nie dało.
kapslokk
Gdybyś wstawił JOIN'a w odpowiednie miejsce - czyli przed WHERE to może by coś dało...
Jeśli już się tak upierasz przy tym mysql_ to chociaż użyj http://php.net/manual/en/function.mysql-error.php do wyświetlania błędów
Marcinekk
No to ja chyba tępy jestem..

  1. $wynik = mysql_query("SELECT COUNT(id) as ilosc,status AS qnt FROM jobs JOIN users ON jobs.steamid=users.steamid WHERE jobs.status = 'Finished' ")
  2.  
  3. or die('Błąd zapytania');
  4.  
  5.  
  6. if(mysql_num_rows($wynik) > 0) {
  7. while($r = mysql_fetch_assoc($wynik)) {
  8. echo 'ilosc: '.$r['ilosc'].'</br></br>';
  9. }
  10. }


Żadnych zmian..
kapslokk
No to z łaski swojej może wyświetlisz sobie błąd i jeśli nic Ci on nie będzie mówił to może go wrzucisz tutaj? Sorry, nikt z fusów nie wywróży jakie masz struktury tabeli itd.
Marcinekk
A w jaki sposób mam podpiąć tą funkcję, skoro korzystam z funkcji db_connect() i nie mam w każdym skrypcie danych do połączenia?
viking
mysql_query() or die(mysql_error())
Marcinekk
Column 'id' in field list is ambiguous.

Nie bardzo rozumiem dlaczego taki błąd jest. Dwuznaczne czyli co?
viking
Obie tabele które łączysz mają kolumnę id. Musisz wskazać której dotyczy count
Marcinekk
Dobra. Wszystko działa, dziękuje za pomoc.

Jeszcze mam mały problem. Jak pobrać id AKTUALNIE dodawanego rekordu?

Próbowałem z tym $uid = mysql_insert_id(); ale nie bardzo się to spisuje.
kapslokk
Musi działać, pokaż skrypt, w którym tego używasz. Ofc mysql_insert_id() zwróci Ci id dopiero po wykonaniu inserta.
Marcinekk
Chodzi dokładnie o to, że mam powiedzmy:

  1. INSERT INTO tabela (`cos`, `cos2`, `id`) VALUES ('costam', `costam, `tu id tego rekordu)


Czyli po prostu w tym zapytaniu chce drugi raz pobrać id tego samego rekordu (który właśnie idzie do bazy w zapytaniu wyżej). Auto increment nie ma znaczenia, bo potrzebne byłoby 2 razy, a można tylko raz.
kapslokk
No to musisz zrobić UPDATE, swoja droga, po co Ci 2x ta sama wartosc w rekordzie ?
Marcinekk
Z lenistwa. Musiałbym przerabiać praktycznie wszystkie skrypty pod kolumne z auto increment, wcześniej nie było potrzebne, ale teraz jest i jakoś musze to zrobić.

Czyli robię tak:

  1. INSERT INTO tabela (`cos`, `cos2`) VALUES ('costam', `costam)
  2. $uid = mysql_insert_id();
  3. UPDATE tabela SET costam='{$uid}' WHERE ?


No właśnie, WHERE co? co_jest.gif
kapslokk
WHERE id = {$uid}
przy zalozeniu ze na id masz auto_increment.
Marcinekk
uid mam auto increment, a do id chciałbym, żeby weszła wartość z kolumny z auto increment( czyli uid )
kapslokk
no to
  1. UPDATE tabela SET id = uid WHERE uid = {$uid};
Marcinekk
Wszystko działa, wielkie dzięki za pomoc wink.gif
viking
Możesz bezpośrednio

  1. INSERT INTO TABLE (id,x) VALUES(LAST_INSERT_ID()+1, 'aaa');


LAST_INSERT_ID() zwróci poprzednią wartość dlatego +1
nospor
@viking ale LAST_INSERT_ID moze dotyczyc w danym momencie zupelnie innego ID niz z tej tabeli
viking
Zakładam że nie bylo tam transakcji.

  1. INSERT INTO TABLE (id,x) VALUES((SELECT AUTO_INCREMENT FROM `information_schema`.`tables` WHERE `table_name` = 'table'), 'aaa');


Chociaż w takim użyciu obie metody mogą być zawodne. PHPowa funkcja to był tylko wrapper. Więc zdaje się, że gdy po drodze nastąpiło by dodanie innego rekordu wynik może nie być poprawny.
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.