Marcinekk
7.12.2016, 08:33:07
Witam. Mam taki malutki skrypcik:
$_GET['id'] = (int)clear($_GET['id']);
$wynik23=mysql_query("SELECT * FROM users WHERE `Company_Code` = '{$_GET['id']}'"); $wynik2=mysql_query ("SELECT COUNT(id) AS qnt FROM trasy WHERE `steamid` = '{$result['steamid']}' AND `status` = 'Finished'");
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
7.12.2016, 08:56:01
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
7.12.2016, 08:57:48
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
7.12.2016, 09:03:27
Załóżmy, że robię w ten sposób:
$wynik = mysql_query("SELECT COUNT(id) AS qnt FROM jobs WHERE `status` = 'Finished' AND steamid IN(users)") or
die('Błąd zapytania');
}
}
Zacznie mi zliczać dla każdego użytkownika i wywalać osobno.
Kishin
7.12.2016, 11:45:41
Cytat(Marcinekk @ 7.12.2016, 09:03:27 )

Załóżmy, że robię w ten sposób:
$wynik = mysql_query("SELECT COUNT(id) AS qnt FROM jobs WHERE `status` = 'Finished' AND steamid IN(users)") or
die('Błąd zapytania');
}
}
Zacznie mi zliczać dla każdego użytkownika i wywalać osobno.
to zapytanie zawsze Ci zwróci 1 wynik, musisz po czymś pogrupować, np.:
$wynik = mysql_query("SELECT COUNT(id) as ilosc,status AS qnt FROM jobs WHERE `status` = 'Finished' AND steamid IN(users) group by status")
to wyrzuci Ci ilości dla każdego statusu,
wtedy dajesz
echo 'status: '.$r['status'].'</br>'; echo 'ilosc: '.$r['ilosc'].'</br></br>'; }
Analogicznie sobie wyciągnij co tam potrzebujesz
Marcinekk
7.12.2016, 14:24:33
@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:
$wynik = mysql_query("SELECT COUNT(id) as ilosc,status AS qnt FROM jobs WHERE `status` = 'Finished' AND steamid IN(users) group by status") or
die('Błąd zapytania'); //if(mysql_num_rows($wynik) > 0) {
echo 'ilosc: '.$r['ilosc'].'</br></br>'; //}
}
To co jest jako komentarz też próbowałem, nic nie zmieniło.
kapslokk
7.12.2016, 14:52:59
Do IN() można podać wartości rozdzielone przecinkiem, a nie cala tabele - pisałem już, żebyś użył JOIN'a
Marcinekk
8.12.2016, 08:10:59
$wynik = mysql_query("SELECT COUNT(id) as ilosc FROM jobs WHERE `status` = 'Finished' INNER JOIN users ON jobs.steamid=users.steamid;") or
die('Błąd zapytania'); echo 'ilosc: '.$r['ilosc'].'</br></br>'; }
}
Zrobiłem w taki sposób, nadal nic to nie dało.
kapslokk
8.12.2016, 08:20:39
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
8.12.2016, 08:28:53
No to ja chyba tępy jestem..
$wynik = mysql_query("SELECT COUNT(id) as ilosc,status AS qnt FROM jobs JOIN users ON jobs.steamid=users.steamid WHERE jobs.status = 'Finished' ")
or
die('Błąd zapytania');
echo 'ilosc: '.$r['ilosc'].'</br></br>'; }
}
Żadnych zmian..
kapslokk
8.12.2016, 08:40:44
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
8.12.2016, 08:50:28
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
8.12.2016, 08:52:32
mysql_query() or die(mysql_error())
Marcinekk
8.12.2016, 08:55:48
Column 'id' in field list is ambiguous.
Nie bardzo rozumiem dlaczego taki błąd jest. Dwuznaczne czyli co?
viking
8.12.2016, 09:00:23
Obie tabele które łączysz mają kolumnę id. Musisz wskazać której dotyczy count
Marcinekk
8.12.2016, 10:27:35
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
8.12.2016, 10:30:51
Musi działać, pokaż skrypt, w którym tego używasz. Ofc mysql_insert_id() zwróci Ci id dopiero po wykonaniu inserta.
Marcinekk
8.12.2016, 10:42:29
Chodzi dokładnie o to, że mam powiedzmy:
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
8.12.2016, 10:44:25
No to musisz zrobić UPDATE, swoja droga, po co Ci 2x ta sama wartosc w rekordzie ?
Marcinekk
8.12.2016, 10:46:44
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:
INSERT INTO tabela (`cos`, `cos2`) VALUES ('costam', `costam)
UPDATE tabela SET costam='{$uid}' WHERE ?
No właśnie, WHERE co?
kapslokk
8.12.2016, 10:51:01
WHERE id = {$uid}
przy zalozeniu ze na id masz auto_increment.
Marcinekk
8.12.2016, 10:52:47
uid mam auto increment, a do id chciałbym, żeby weszła wartość z kolumny z auto increment( czyli uid )
kapslokk
8.12.2016, 10:53:56
no to
UPDATE tabela SET id = uid WHERE uid = {$uid};
Marcinekk
8.12.2016, 10:57:29
Wszystko działa, wielkie dzięki za pomoc
viking
8.12.2016, 11:14:44
Możesz bezpośrednio
INSERT INTO TABLE (id,x) VALUES(LAST_INSERT_ID()+1, 'aaa');
LAST_INSERT_ID() zwróci poprzednią wartość dlatego +1
nospor
8.12.2016, 11:20:33
@viking ale LAST_INSERT_ID moze dotyczyc w danym momencie zupelnie innego ID niz z tej tabeli
viking
8.12.2016, 11:27:00
Zakładam że nie bylo tam transakcji.
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.