Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Problem z foreach
Forum PHP.pl > Forum > PHP
Karoll
Witam, mam problem z moim botem napisanym w php na wczesniejszym serwerze chodził bez problemu, aktualnie wywala błąd foreach :
Cytat
PHP Warning: Invalid argument supplied for foreach() in /home/ts3/ts3/pokebot/core.php on line 38

38,39,40 linijka kodu
  1. foreach ($users as $client) {
  2. if ($client['client_nickname'] != $config['bot']['name']) {
  3. $w = 0;

Wersja PHP na nowej maszynie (php -v)
Cytat
PHP 5.4.4-14+deb7u8 (cli) (built: Feb 17 2014 09:18:47)
Copyright © 1997-2012 The PHP Group
Zend Engine v2.4.0, Copyright © 1998-2012 Zend Technologies
with the ionCube PHP Loader v4.2.2, Copyright © 2002-2012, by ionCube Ltd.

Wersja PHP na starej maszynie(php-v)
Cytat
PHP 5.4.27-1~dotdeb.1 (cli) (built: Apr 6 2014 01:32:22)
Copyright © 1997-2014 The PHP Group
Zend Engine v2.4.0, Copyright © 1998-2014 Zend Technologies

Może to być wina innej wersji PHP?

Za rozwiąznie oczywiście ręka królewny i pół królestwa;D
nospor
$users nie jest tablicą
Karoll
Cytat(nospor @ 24.04.2014, 15:07:09 ) *
$users nie jest tablicą

Czyli mam błąd w kodzie?
nospor
jejkus.... Napisz skad sie bierze te $users to bedziemy ci mogli cos powiedziec... No chyba nie sadzisz, ze wywrozymy z fusow jak wyglada Twoj kod?
Napisz skad sie bierze, pokaz kod
Karoll
  1. <?php
  2.  
  3. /*
  4. * PokeBOT on TeamSpeak 3
  5. * Przemysław Thel || admin@thel.pl
  6. * If you wont more info check: <a href="http://www.thel.pl/" target="_blank">http://www.thel.pl/</a>
  7. */
  8.  
  9. date_default_timezone_set('Europe/Warsaw');
  10.  
  11. require_once 'configs/global_config.php';
  12. require_once 'configs/lib/ts3admin.class.php';
  13. require_once 'configs/lib/helper.php';
  14.  
  15. $query = new ts3admin($config['connect']['address'], $config['connect']['tcp']);
  16.  
  17. $cache = array();
  18. $welcome = array();
  19.  
  20. if($query->getElement('success', $query->connect())) {
  21.  
  22. $query->login($config['connect']['login'],$config['connect']['password']);
  23.  
  24. $query->selectServer($config['connect']['udp']);
  25.  
  26. $query->setName($config['bot']['name']);
  27.  
  28. while (true) {
  29.  
  30. $core = $query->getElement('data',$query->whoAmI());
  31. $query->clientMove($core['client_id'],$config['bot']['default_channel']);
  32.  
  33. $users = $query->getElement('data',$query->clientList('-groups -voice -away -times'));
  34.  
  35. $pokes = array();
  36. $admins = array();
  37.  
  38. foreach ($users as $client) {
  39. if ($client['client_nickname'] != $config['bot']['name']) {
  40. $w = 0;
  41. if ($client['cid'] == $config['message']['channel_id'] && !in_array($client['clid'],$welcome)) {
  42. $info = $query->getElement('data',$query->clientInfo($client['clid']));
  43. $welcomeMsg = str_replace('{IP}', $info['connection_client_ip'], file_get_contents('messages/welcome.txt', true));
  44.  
  45. $query->sendMessage(1, $client['clid'], $welcomeMsg);
  46. $welcome[time()-$w] = $client['clid'];
  47. $w++;
  48. }
  49.  
  50. $user_groups = explode(',',$client['client_servergroups']);
  51.  
  52. if (isInGroup($user_groups,$admins_groups) && !in_array($client['clid'],$cache)) {
  53. $admins[$client['clid']] = $user_groups;
  54. }
  55.  
  56. if (array_key_exists($client['cid'],$messages) && !isInGroup($user_groups, $admins_groups) && !$client['client_is_talker']) {
  57.  
  58. $pokes[] = $client['cid'];
  59.  
  60. if (!in_array($client['clid'],$cache)) {
  61. $query->sendMessage(1, $client['clid'], file_get_contents('messages/'.$messages[$client['cid']]['user_poke'],true));
  62. $cache[time()-1] = $client['clid'];
  63. }
  64. }
  65. }
  66. }
  67.  
  68. $counter = 0;
  69.  
  70.  
  71. foreach ($pokes as $poke) {
  72. foreach ($admins as $clid => $admin) {
  73. if (isInGroup($admin, $messages[$poke]['groups'])) {
  74. if (!in_array($clid,$cache)) {
  75. $cache[time()+$counter] = $clid;
  76. $query->clientPoke($clid, file_get_contents('messages/'.$messages[$poke]['admin_poke']));
  77. $counter++;
  78. }
  79. }
  80. }
  81. }
  82.  
  83.  
  84. foreach ($cache as $time => $user) {
  85. if (time() - $time > $config['delete']['cache']) {
  86. unset($cache[$time]);
  87. }
  88. }
  89.  
  90. if (date('H') == '23') {
  91. foreach ($welcome as $time => $user) {
  92. if (time() - $time > 60*60*24) { //1 day
  93. unset($welcome[$time]);
  94. }
  95. }
  96. }
  97.  
  98. $admins = array();
  99. sleep(1);
  100. }
  101. }
  102. ?>
nospor
$users = $query->getElement('data',$query->clientList('-groups -voice -away -times'));
Tu masz pobierane $users. Z jakiegos powodu $query->getElement źle zwraca dane. Dlaczego? nie wiem. Nie mam bladego pojecia co robi klasa ts3admin.

Wlacz wyswietlanie wszystkich bledow, to moze pojawią się jakies dodatkowe informacje. Tu masz napisane jak
Temat: Jak poprawnie zada pytanie
Karoll
Warning: Invalid argument supplied for foreach() in /home/ts3/ts3/pokebot/core.php on line 40
i tylko tylko pokazuje screen -r czyli w sumie nic się po wklejeniu na początek kodu tych paru linijek nie zmieniło oprócz tego że naturalnie linijka z błędem poleciała w dół...
nospor
A daj jeszcze
var_dump($users);
przed FOREACH i pokaz co wyswietli

Od biedy mozesz zrobic tak:
if (is_array($users))
foreach ($users as $client) {
.....

Dzieki temu nie bedziesz mial bledu. Ale czy to rozwiaze twoj problem?
Karoll
Cytat(nospor @ 24.04.2014, 15:30:01 ) *
A daj jeszcze
var_dump($users);
przed FOREACH i pokaz co wyswietli

Od biedy mozesz zrobic tak:
if (is_array($users))
foreach ($users as $client) {
.....

Dzieki temu nie bedziesz mial bledu. Ale czy to rozwiaze twoj problem?


Cytat
Warning: Invalid argument supplied for foreach() in /home/ts3/ts3/pokebot/core.php on line 41
bool(false)

Po zmianie na :
Cytat
if (is_array($users))
foreach ($users as $client) {

Rzeczywiście nie ma błędu, ale bot w dalszym ciągu nie działa
nospor
No to niestety bardziej ci nie pomogę. Nie wiem co mają robić funkcje ktorych uzywasz ani jak działają. A ze nie pojawiły się żadne dodatkowe bledy, pomimo ze wlaczyles ich wyswietlanie, wiec pech....
Karoll
Cytat(nospor @ 24.04.2014, 15:39:41 ) *
No to niestety bardziej ci nie pomogę. Nie wiem co mają robić funkcje ktorych uzywasz ani jak działają. A ze nie pojawiły się żadne dodatkowe bledy, pomimo ze wlaczyles ich wyswietlanie, wiec pech....

Ale na poprzedniej maszynie z inną wersją PHP bot działał bez problemu, może w tym tkwi problem?
nospor
Moze. ALe jak juz mowilem: skoro nie wyswietlają sie zadne dodatkowe bledy i nie mam bladego pojecia jak dzialają twoje funkcje, wiec nie wiem jakaz zmiana konfiguracji moze miec na to wplyw.
Turson
nospor widzę stracił cierpliwość i się nie dziwię.
Inna możliwość, to $clients jest tablicą, ale jest puste.

Jak już wspomniano
Cytat
A daj jeszcze
var_dump($users);
przed FOREACH i pokaz co wyswietli

jeśli i tym razem zrobisz coś innego, to nie oczekuj więcej odpowiedzi
nospor
@Turson nie stracilem cierpliwosci. Poprostu naprawde nie wiem co robią te funkcje i naprawde nie jestem w stanie pomóc

Zas var_dump($users); autor juz zrobil i pokazal. Tez bys zobaczyl, jakbys nie byl slepy wink.gif
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.