Ir para o conteúdo

Publicidade

 Estatísticas do Fórum

  • 0 Usuários ativos

    0 membro(s), 0 visitante(s) e 0 membros anônimo(s)

Foto:

PHP Warning: Invalid argument supplied for foreach()

  • Por favor, faça o login para responder
13 respostas neste tópico

#1 michalski

michalski
  • Membros
  • 78 posts

Postado 29 março 2010 - 11:22

Fala pessoal!
Estou terminando um site em joomla e após instalar um componente (DOCman) este erro te aparecido:
PHP Warning: Invalid argument supplied for foreach() in E:\home\augustuspe\bodytraining\Web\site\administrator\modules\mod_docman_logs\mod_docman_logs.php on line 43

Tentei no forum do Joomla mas nada de resposta.
Então achei que vocês pudessem me ajudar.
O erro apresentado nesta linha 43 é:
foreach ($rows as $row)

Caso precisem de mais informação sobre o código deste arquivo me falem que respondo o mais rápido possível.

Desde já agradeço a ajuda.

Abs,
  • 0

#2 Matias Rezende

Matias Rezende

    Consultor Web

  • Moderadores Globais
  • 6.227 posts

Postado 29 março 2010 - 11:36

michalski, evite duplicar seus tópicos pelo fórum. Sugiro que leia o tópico de orientações para uma boa participação. Seu tópico no fórum de Joomla foi excluído.

Sobre a sua dúvida, o PHP está dizendo que a $rows não é um array. Verifique de onde esta variável vem e faça um debug em seu conteúdo.
echo '<pre>';
print_r($rows)
echo '</pre>';

Carlos Eduardo
  • 0

#3 michalski

michalski
  • Membros
  • 78 posts

Postado 29 março 2010 - 13:41

Não estou achando... segue o código do log, quem sabe ajuda:

<?php
defined('_JEXEC') or die('Restricted access');

global $_DOCMAN;
$_DOCMAN->setType(_DM_TYPE_MODULE);
$_DOCMAN->loadLanguage('modules');
require_once($_DOCMAN->getPath('classes', 'utils'));


/*
$query = "SELECT l.log_docid, l.log_ip, l.log_datetime, l.log_user, d.dmname, u.name"
        ."\n FROM #__docman_log l, #__docman d, #__users u"
        ."\n WHERE l.log_docid = d.id"
        ."\n AND (l.log_user = u.id OR l.log_user=0)"
        ."\n ORDER BY l.log_datetime DESC";
        */
$query = "SELECT l.log_docid, l.log_ip, l.log_datetime, l.log_user, d.dmname, u.name"
        ."\n FROM (jos_docman_log AS l LEFT JOIN jos_docman AS d ON l.log_docid = d.id)"
        ."\n LEFT JOIN jos_users AS u ON l.log_user = u.id"
        ."\n ORDER BY l.log_datetime DESC";
$database = JFactory::getDBO();
$database->setQuery($query, 0, $params->get('limit', 10));
$rows = $database->loadObjectList();

?>
<table class="adminlist cpanelmodule">
	<tr>
	    <th><?php echo _DML_MOD_LOGS_TITLE;?></th>
        <th><?php echo _DML_MOD_LOGS_USER;?></th>
        <th><?php echo _DML_MOD_LOGS_IP;?></th>
        <th><?php echo _DML_MOD_LOGS_DATE;?></th>

	</tr><?php
    if (!$_DOCMAN->getCfg('log')) echo '<tr><td colspan="4">' . _DML_MOD_LOGS_DISABLED . '</td></tr>';
    foreach ($rows as $row) {
        if(0==$row->log_user) { $row->name =_DML_MOD_GUEST;}
        ?>
    	<tr>
    	    <td>
                <a href="index.php?option=com_docman&amp;section=documents&amp;task=edit&amp;cid[]=<?php echo $row->log_docid;?>">
                <?php echo $row->dmname;?>
                </a>
    	    </td>
            <td align="right"><?php echo $row->name;?></td>
    	    <td align="right"><a href="http://ws.arin.net/cgi-bin/whois.pl?queryinput=<?php echo $row->log_ip;?>" target="_blank"><?php echo $row->log_ip;?></a></td>
    	    <td align="right"><?php echo $row->log_datetime;?></td>
    	</tr><?php
    }?>
</table>

  • 0

#4 Matias Rezende

Matias Rezende

    Consultor Web

  • Moderadores Globais
  • 6.227 posts

Postado 29 março 2010 - 13:48

A linha está aqui.

$rows = $database->loadObjectList();

Ela está acessando o método loadObjectList(), que é, provavelmente, o método que resgata os valores do banco de dados. O que provavelmente está acontecendo é que não está retornando estes dados. Faça o que eu falei, adicionando o código antes de disparar o erro. Deve imprimir o array $rows. Além disto, habilite todas as mensagens de erro, para ver se aparece mais alguma coisa.

Carlos Eduardo
  • 0

#5 michalski

michalski
  • Membros
  • 78 posts

Postado 29 março 2010 - 13:52

Deixa ver se entendi... devo colocar este código:
echo '<pre>';
print_r($rows)
echo '</pre>';

Antes deste?
foreach ($rows as $row)

  • 0

#6 Matias Rezende

Matias Rezende

    Consultor Web

  • Moderadores Globais
  • 6.227 posts

Postado 29 março 2010 - 14:08

Isto

Carlos Eduardo
  • 0

#7 michalski

michalski
  • Membros
  • 78 posts

Postado 29 março 2010 - 21:24

Isto

Carlos Eduardo


Ola Carlos,
O código ficou assim:
<?php
defined('_JEXEC') or die('Restricted access');

global $_DOCMAN;
$_DOCMAN->setType(_DM_TYPE_MODULE);
$_DOCMAN->loadLanguage('modules');
require_once($_DOCMAN->getPath('classes', 'utils'));


/*
$query = "SELECT l.log_docid, l.log_ip, l.log_datetime, l.log_user, d.dmname, u.name"
        ."\n FROM #__docman_log l, #__docman d, #__users u"
        ."\n WHERE l.log_docid = d.id"
        ."\n AND (l.log_user = u.id OR l.log_user=0)"
        ."\n ORDER BY l.log_datetime DESC";
        */
$query = "SELECT l.log_docid, l.log_ip, l.log_datetime, l.log_user, d.dmname, u.name"
        ."\n FROM (jos_docman_log AS l LEFT JOIN jos_docman AS d ON l.log_docid = d.id)"
        ."\n LEFT JOIN jos_users AS u ON l.log_user = u.id"
        ."\n ORDER BY l.log_datetime DESC";
$database = JFactory::getDBO();
$database->setQuery($query, 0, $params->get('limit', 10));
$rows = $database->loadObjectList();

?>
<table class="adminlist cpanelmodule">
	<tr>
	    <th><?php echo _DML_MOD_LOGS_TITLE;?></th>
        <th><?php echo _DML_MOD_LOGS_USER;?></th>
        <th><?php echo _DML_MOD_LOGS_IP;?></th>
        <th><?php echo _DML_MOD_LOGS_DATE;?></th>

	</tr><?php
    if (!$_DOCMAN->getCfg('log')) echo '<tr><td colspan="4">' . _DML_MOD_LOGS_DISABLED . '</td></tr>';
echo '<pre>';
print_r($rows)
echo '</pre>';
    foreach ($rows as $row) {
        if(0==$row->log_user) { $row->name =_DML_MOD_GUEST;}
        ?>
    	<tr>
    	    <td>
                <a href="index.php?option=com_docman&amp;section=documents&amp;task=edit&amp;cid[]=<?php echo $row->log_docid;?>">
                <?php echo $row->dmname;?>
                </a>
    	    </td>
            <td align="right"><?php echo $row->name;?></td>
    	    <td align="right"><a href="http://ws.arin.net/cgi-bin/whois.pl?queryinput=<?php echo $row->log_ip;?>" target="_blank"><?php echo $row->log_ip;?></a></td>
    	    <td align="right"><?php echo $row->log_datetime;?></td>
    	</tr><?php
    }?>
</table>

Agora apareceu isso:
PHP Parse error: syntax error, unexpected T_ECHO in E:\home\augustuspe\bodytraining\Web\site\administrator\modules\mod_docman_logs\mod_docman_logs.php on line 45
  • 0

#8 Evandro Oliveira

Evandro Oliveira

    leia ali -->

  • Membros
  • 4.540 posts

Postado 29 março 2010 - 23:55

você esqueceu o ponto-e-vírgula no fim de print_r($rows)
  • 0

#9 michalski

michalski
  • Membros
  • 78 posts

Postado 30 março 2010 - 10:01

Nossa cara que coisa lôca... está dando o mesmo erro de antes:
PHP Warning: Invalid argument supplied for foreach() in E:\home\augustuspe\bodytraining\Web\site\administrator\modules\mod_docman_logs\mod_docman_logs.php on line 46
  • 0

#10 Matias Rezende

Matias Rezende

    Consultor Web

  • Moderadores Globais
  • 6.227 posts

Postado 30 março 2010 - 10:40

Isto não vai arrumar o problema. Apenas vai imprimir na tela o conteúdo de $rows. Só isto. Aí, com isto, podemos ver se $rows é realmente um array, como deveria ser. Mas já te adianto. O problema provavelmente está nos dados de conexão com o banco de dados.

Carlos Eduardo
  • 0

#11 Evandro Oliveira

Evandro Oliveira

    leia ali -->

  • Membros
  • 4.540 posts

Postado 30 março 2010 - 11:41

troque esta linha
$rows = $database->loadObjectList();

por
var_dump($database->loadObjectList());

(isso não vai resolver o problema [2]) O nome disso é debug.

Poste a saída
  • 0

#12 michalski

michalski
  • Membros
  • 78 posts

Postado 30 março 2010 - 13:01

Apareceu a mesma coisa.
  • 0

#13 Evandro Oliveira

Evandro Oliveira

    leia ali -->

  • Membros
  • 4.540 posts

Postado 30 março 2010 - 13:14

então o problema está na maneira como a classe está tratando os erros sql
  • 0

#14 Cyntia

Cyntia
  • Membros
  • 2 posts

Postado 16 agosto 2010 - 21:19

Oi pessoal.Estou tendo a mesma mensagem que o colega inicial.Acontece que no meu caso, o problema está relacionado à checkbox.
Estou validando um formulário com ckeckbox, onde são separados por grupos de produtos. A lógica é que a pessoa pode marcar qtos produtos quiser, de todos os grupos ou de apenas 1, mas pelo menos 1 é necessário. Isso é para solicitar orçamento.
Acontece que se deixo de marcar algum grupo, aparece esta mensagem - Invalid argument supplied for foreach(), juntamente que a variável está indefinida.A mensagem é enviada, mas dá esse erro..
Abaixo, o codigo:

$acessorios = "";
$transfm = "";
$transvhf = "";
$transuhf = "";
$link = "";

if( (isset($_POST['ac'])) || (isset($_POST['fm'])) || (isset($_POST['vhf'])) || (isset($_POST['uhf'])) || (isset($_POST['link'])) )//Aqui ele verifica se tem algum valor preenchido no grupo
{

$ac = $_POST['ac'];//a variavel ac recebe os campos com name = ac
foreach($ac as $print)//$print recebe os dados do vetor ac, como se fosse $print[1] = $ac[1]
{
$acessorios = $acessorios. $print . "\n" ; //esta variavel está juntando todos os dados marcados.
}

$fm = $_POST['fm'];//a variavel protudo recebe os campos com name = produto
foreach($fm as $print)//$print recebe os dados do vetor produto, como se fosse $print[1] = $produto[1]
{
$transfm = $transfm. $print . "\n" ; //esta variavel está juntando todos os dados marcados.
}

$vhf = $_POST['vhf'];//a variavel protudo recebe os campos com name = produto
foreach($vhf as $print)//$print recebe os dados do vetor produto, como se fosse $print[1] = $produto[1]
{
$transvhf = $transvhf. $print . "\n" ; //esta variavel está juntando todos os dados marcados.
}

$uhf = $_POST['uhf'];//a variavel protudo recebe os campos com name = produto
foreach($uhf as $print)//$print recebe os dados do vetor produto, como se fosse $print[1] = $produto[1]
{
$transuhf = $transuhf. $print . "\n" ; //esta variavel está juntando todos os dados marcados.
}

// $link = $_POST['link'];//a variavel protudo recebe os campos com name = produto
echo '<pre>';
print_r($link);
echo '</pre>';
foreach($link as $print)//$print recebe os dados do vetor produto, como se fosse $print[1] = $produto[1]
{
$translinks = $translinks. $print . "\n" ; //esta variavel está juntando todos os dados marcados.
}

}
  • 0




Publicidade

/ins>