valtinho 0 Denunciar post Postado Janeiro 31, 2008 Boa tarde pessoal do fórum, Preciso de um help de vocês, seguinte, fizemos um site todo em php 4 e agora o cliente mudou a versão do php 4 para 5 e as variáveis que antes funcionavem perfeitamente não funcionam e já tentei quase de tudo mas não consegui resolver. Observação - ao tentar inserir o produto ocorre o seguinte erro "Fatal error: Call to a member function AdicionarItem() on a non-object in /home/www/romagnole-cd.com.br/cd/orcamento.php on line 40" O cliente fará um orçamento, incluindo os produtos no carrinho, tarefa fácil, antes do php 5, agora nem por decreto consigo inserir, consigo resgatar as variáveis, mas não consigo adiciona-las ao meu carrinho, vejam o codigo da página que "insere o produto no carrinho": CODE <?php /* Esta função irá ativar o buffer de saída. Enquanto o buffer de saída estiver ativo, não é enviada a saída do script (outros que não sejam cabeçalhos), ao invés a saída é guardada em um buffer interno.*/ ob_start(); /* Autor - Valter Ferreira Martins Data - Setembro/2006 Objetivo - Carrinho que abastece orçamento */ $id_prod = $_GET["id_prod"]; $op = $_GET["op"]; include("config.php"); include("TMySQL.php"); include("TCarrinho.php"); session_start(); //Verificando se a variavel de sessão foi criada if (!session_is_registered("MeuCarrinho")){ session_register("MeuCarrinho"); $MeuCarrinho = new TCarrinho(); } $MySQL = new TMySQL(); $MySQL->connect($host, $db, $user, $pass); if (!empty($op)){ switch ($op) { case "adicionar": if (!empty($id_prod)){ $Query = "select * from roma_produto where id_prod = $id_prod "; $R_Query = $MySQL->query($Query); if (mysql_num_rows($R_Query) > 0){ $MeuCarrinho->AdicionarItem($id_prod,1); } } break; case "excluir": $MeuCarrinho->RemoverItem($id_prod); break; case "atualizar": $MeuCarrinho->AtualizarCarrinho($HTTP_POST_VARS); break; case "finalizar": if ($MeuCarrinho->QuantosItens()>0) { header("Location:OrcamentoFinal.php"); } break; } } $QuerySQL = " select id_prod, codigo, descricao, medida from roma_produto " . $MeuCarrinho->QuerySQL_ObtemListaDeItens(); //echo $QuerySQL; $Resultado = $MySQL->query($QuerySQL); ?> Aqui estão os includes da página: TMySQL CODE <? class TMySQL { var $host; var $db; var $user; var $pass; var $soquete; function connect($host,$db,$user,$pass) { $this->host = $host; $this->db = $db; $this->user = $user; $this->pass = $pass; $this->soquete=mysql_connect($this->host,$this->user,$this->pass); if (!$this->soquete) { echo "Não foi possível conectar-se ao Banco de Dados MySQL"; } else { if (!mysql_select_db($this->db,$this->soquete)) { echo "Banco de dados não encontrado"; } } } function query ($string) { $myquery = mysql_query($string,$this->soquete); if (!$myquery) { echo "Erro na consulta da query<br>" . $string; } else { return $myquery; } } } ?> TCarrinho CODE <?php include("config.php"); class TCarrinho { var $item_codigo = array(); var $item_quantidade = array(); /* Obtem Posicao, este metodo obtem a posicao de um item mediante ao seu codigo, retornando um valor booleano e gravando a posicao na variavel de referencia $posicao, caso o codigo do item esteja no carrinho. */ function ObtemPosicao($codigo,&$posicao){ //Percorrendo o vetor for($i=0;$i<count($this->item_codigo);$i++) { if ($this->item_codigo[$i] == $codigo) { $posicao = $i; return TRUE; } } }/* ObtemPosicao() */ /* AdicionarItem Este metodo adiciona um item no carrinho */ function AdicionarItem($codigo,$quantidade) { //Inicializando parametro $posicao = -1; $achou = $this->ObtemPosicao($codigo,$posicao); if (!$achou){ $this->item_codigo[] = $codigo; $this->item_quantidade[] = $quantidade; } } /* AdicionarItem() */ /* RemoverItem Este metodo remove um item do carrinho de compra, passando o codigo do produto */ function RemoverItem($codigo) { //Inicializando parametro $posicao = -1; $achou = $this->ObtemPosicao($codigo,$posicao); if ($achou){ //Removendo o elemento do vetor array_splice($this->item_codigo, $posicao, 1); array_splice($this->item_quantidade, $posicao, 1); } } /* RemoveItem() */ /* QuantosItens Este metodo retorna a quantidade de itens incluidas no carrinho de compras */ function QuantosItens() { return count($this->item_quantidade); } /* QuantosItens() */ /* ExcluirTodosItens Este metodo retira todos os itens contidos no carrinho de compras */ function ExcluirTodosItens(){ $this->item_quantidade = null; $this->item_codigo = null; } /* ExcluirTodosItens() */ /* QuerySQL_ObtemListaDeItens Este metodo gera uma parte do codigo SQL que sera usado para buscar os dados do carrinho de compra (id_prod, NOME e PREÇO). O comando SQL final tera como finalidade de buscar no banco de dados apenas os dados dos itens incluidos no carrinho. */ function QuerySQL_ObtemListaDeItens(){ $itens = "where "; $STR = ""; if ($this->QuantosItens()>0) { $fixo = " id_prod ="; for ($i=0;$i<$this->QuantosItens();$i++){ $STR = $STR . $fixo . " " . $this->item_codigo[$i]; if ($i+1<$this->QuantosItens()) { $STR = $STR . " or "; } } } if (!$STR == "") { return $itens . $STR; }else{ //Caso não exista nenhum item no carrinho o codigo final SQL, procurara por um item que não existe na tabela de produtos, neste caso -1. return " where id_prod = -1"; } } /* QuerySQL_ObtemListaDeItens() */ /* ObtemQuantidadeItem Este metodo obtem a quantidade de um Item */ function ObtemQuantidadeItem($codigo){ $posicao = -1; $achou = $this->ObtemPosicao($codigo,$posicao); if ($achou) { return $this->item_quantidade[$posicao]; }else{ return "erro ao obter quantidade do item"; } } /* ObtemQuantidaItem() */ /* ObtemSubTotalDeUmItem Este metodo retorna o subtotal de um item (QUANTIDADE * VALOR UNITARIO) */ function ObtemSubTotalDeUmItem($id_prod,$preco){ $posicao = -1; $achou = $this->ObtemPosicao($id_prod,$posicao); if ($achou) { return ($this->item_quantidade[$posicao]*$preco); }else{ return "erro ao obter sub total do item"; } } /* ObtemSubTotalDeUmItem() */ /* AtualizarCarrinho Este metodo coleta todos as variaveis enviadas pelo FORMULARO (method="POST") e atualiza as quantidades dos itens. */ function AtualizarCarrinho(&$VAR_ENVIADAS_PELO_BROWSER){ //Percorrendo a lista de itens e atualizando suas quantidades for ($i=0;$i<$this->QuantosItens();$i++){ $this->item_quantidade[$i] = $VAR_ENVIADAS_PELO_BROWSER[$this->item_codigo[$i]]; } } /* AtualizarCarrinho() */ } /* Classe TCarrinho */ ?> Se puderem me dar uma luz agradeço. Fiquem na paz. Compartilhar este post Link para o post Compartilhar em outros sites
Beraldo 864 Denunciar post Postado Janeiro 31, 2008 - Não use session_is_registered(). Use isset($_SESSION['var']). - Não use session_register(). Use $_SESSION['var'] = $var Vocêr colocou $MeuCarrinho = new TCarrinho(); dentro daquele IF. Ou seja, o objeto só será instanciado se aquela condição for verificada. É esse o objetivo? Compartilhar este post Link para o post Compartilhar em outros sites
valtinho 0 Denunciar post Postado Janeiro 31, 2008 Ola Beraldo, sim é isso mesmo o objeto só será instanciado se aquela condição for verificada. Mas mesmo com a sua dica, ainda não está funcionando, continua dando o erro: Fatal error: Call to a member function AdicionarItem() on a non-object in /home/www/romagnole-cd.com.br/cd/orcamento.php on line 41 mudei isso aqui if (!session_is_registered("MeuCarrinho")){ session_register("MeuCarrinho"); $MeuCarrinho = new TCarrinho(); } para isso aqui if (isset($_SESSION['MeuCarrinho'])){ $_SESSION['MeuCarrinho']; $MeuCarrinho = new TCarrinho(); Rapaz, estou querendo fazer isso funcionar de novo mas estou apanhando legal, se puder me dar uma força agradeço. Valeu e fique na paz. Compartilhar este post Link para o post Compartilhar em outros sites
Alexsandro XPT 0 Denunciar post Postado Janeiro 31, 2008 Aproveitando o assunto. Como faço pra passar paremetro pra uma função quem tem paremetro opcional? Ex: function teste($a,$b=true,$c=false){ } teste(43,,true); se eu deixo o valor do meio fazio ela da pau. como proceder neste caso? sei quem VB isto nao daria erro. mas em PHP Sei tb que em pascal era so eu fazer isto: teste($a=43,$c=true); mas em PHP nao descobri :( Thz.!!! - Não use session_is_registered(). Use isset($_SESSION['var']). - Não use session_register(). Use $_SESSION['var'] = $var Vocêr colocou $MeuCarrinho = new TCarrinho(); dentro daquele IF. Ou seja, o objeto só será instanciado se aquela condição for verificada. É esse o objetivo? Compartilhar este post Link para o post Compartilhar em outros sites
williamhrs 0 Denunciar post Postado Janeiro 31, 2008 assim brow, teste(43,"",true) :D Compartilhar este post Link para o post Compartilhar em outros sites
Beraldo 864 Denunciar post Postado Janeiro 31, 2008 Antes você usava !session_is_registered. Agora está usando isset. Não seria !isset? ;) Compartilhar este post Link para o post Compartilhar em outros sites
valtinho 0 Denunciar post Postado Janeiro 31, 2008 Valeu Beraldo. Mas agora o problema é outro, não consigo inserir mais de um produto em meu carinho, sempre que insiro um novo ele sobrepõe o que já estava lá, você tem idéia do que possa ser? Desculpa a perturbação, mas é que me vi apavorado quando percebi isso e como estou dando os primeiros passos gostaria de uma força para tentar entender e resolver esse problemão. Valeu e fique na paz. Compartilhar este post Link para o post Compartilhar em outros sites
Alexsandro XPT 0 Denunciar post Postado Janeiro 31, 2008 Ae, valew por responder.. Mas aqui, assim nao seria uma boa nao ue.. imagina se na function tiver um tramamento quando o valor for "" Sem querer querendo iremos criar um erro de logica. Concorda? Deve existir uma forma mais coerente. :wacko: Assim é meio quebra galho. mas valew ;) se descobrir me conta.. Falow.. assim brow, teste(43,"",true) :D Compartilhar este post Link para o post Compartilhar em outros sites
Beraldo 864 Denunciar post Postado Janeiro 31, 2008 Valeu Beraldo. Mas agora o problema é outro, não consigo inserir mais de um produto em meu carinho, sempre que insiro um novo ele sobrepõe o que já estava lá, você tem idéia do que possa ser? Desculpa a perturbação, mas é que me vi apavorado quando percebi isso e como estou dando os primeiros passos gostaria de uma força para tentar entender e resolver esse problemão. Valeu e fique na paz. Estes tópicos abordam o mesmo problema: http://forum.imasters.com.br/index.php...amp;hl=carrinho http://forum.imasters.com.br/index.php...amp;hl=carrinho Veja se ajuda. Compartilhar este post Link para o post Compartilhar em outros sites
valtinho 0 Denunciar post Postado Fevereiro 1, 2008 Olá, bom dia, ví a dica do Beraldo e dei uma olhada no código e gostaria de perguntar uma coisa, uma mudança de versão do php 4 para o php 5 dá tanto pau assim? Antes de mudar o meu código funcionava bem com a inserção de valores em meu carrinho e agora só consigo inserir um e quando tento inserir outro ele sempre sobrepõe. Agradeço a dica do Beraldo, mas ainda não consegui entender o erro. Se alguém tem alguma dica que me ajude a solucionar, agradeço. Fiquem na paz. Compartilhar este post Link para o post Compartilhar em outros sites
williamhrs 0 Denunciar post Postado Fevereiro 1, 2008 Ae, valew por responder.. Mas aqui, assim nao seria uma boa nao ue.. imagina se na function tiver um tramamento quando o valor for "" Sem querer querendo iremos criar um erro de logica. Concorda? Deve existir uma forma mais coerente. :wacko: Assim é meio quebra galho. mas valew ;) se descobrir me conta.. Falow.. assim brow, teste(43,"",true) :D eu até concordo kra, mas é o unico jeito que eu consegui fazer tbm, nesse caso tenta pass na funcao ($var1,$var2 = NULL) por ex num sei Compartilhar este post Link para o post Compartilhar em outros sites
Beraldo 864 Denunciar post Postado Fevereiro 1, 2008 Olá, bom dia, ví a dica do Beraldo e dei uma olhada no código e gostaria de perguntar uma coisa, uma mudança de versão do php 4 para o php 5 dá tanto pau assim? Antes de mudar o meu código funcionava bem com a inserção de valores em meu carrinho e agora só consigo inserir um e quando tento inserir outro ele sempre sobrepõe. Agradeço a dica do Beraldo, mas ainda não consegui entender o erro. Se alguém tem alguma dica que me ajude a solucionar, agradeço. Fiquem na paz. Não dá tanto problema, não, desde que se programe da forma correta, sem depender de valores de diretivas, como register_globals, magic_quotes, short_open_tag e outras. Muitas vezes, somente uma mudança de servidor, com a mesma versão do PHP, porém com configurações diferentes, pode dar os mesmos problemas. No sub-fórum de Artigos, há um tópico chamado Boas Práticas ao Programar. Dê uma lida nele. http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif Quanto ao problema de sobreposição, tente mudar a função ObtemPosicao(). Se existir o código do produto, retorne o índice dele, para aumentar a quantidade. Caso contrário, retorne -1. Depois verifique se o retorno é positivo ou negativo, realizando a operação correspondente. Compartilhar este post Link para o post Compartilhar em outros sites
valtinho 0 Denunciar post Postado Fevereiro 1, 2008 Olá, boa tarde... ... fiz os testes indicados pelo beraldo, mas não consegui fazer funcionar, não estou conseguindo incluir mais de um produto em meu carrinho será que alguém pode me ajudar a entender o que tenho que fazer, tenho esse código aqui que o Beraldo se referiu e os includes da página está no começo do post. function ObtemPosicao($codigo,&$posicao){ //Percorrendo o vetor for($i=0;$i<count($this->item_codigo);$i++) { if ($this->item_codigo[$i] == $codigo) { $posicao = $i; return TRUE; } } }/* ObtemPosicao() */ Valeu e fiquem na paz. Compartilhar este post Link para o post Compartilhar em outros sites
valtinho 0 Denunciar post Postado Fevereiro 6, 2008 Alguém pode me ajudar a entender o que está acontecendo com o meu site depois da mudança do php 4 para o php 5? Vi a documentação do php, vejam: * Variáveis externas não são mais registradas no escopo global por padrão. Em outras palavras, com o PHP » 4.2.0 a diretiva register_globals está desligada por padrão no arquivo php.ini. O método utilizado atualmente é o de acessar estes valores via arrays auto-globais como mencionado acima. Scripts antigos, livros, e tutoriais podem estar utilizando a diretiva ligada. Se ela estiver ligada, por exemplo, você poderá utilizar a variável $id da URL http://www.exemplo.com/pagina.php?id=42. Se a diretiva estiver desligada, você usará $_GET['id']. Mudei o esquema de verificação de variável de sessão do meu carrinho, estava assim: CODE //Verificando se a variavel de sessão foi criada if (!session_is_registered("MeuCarrinho")){ session_register("MeuCarrinho"); $MeuCarrinho = new TCarrinho(); } e ficou assim : CODE //Verificando se a variavel de sessão foi criada if (!isset($_SESSION['MeuCarrinho'])){ $_SESSION['MeuCarrinho']; $MeuCarrinho = new TCarrinho(); } As minhas variáveis vindas do meu carrinho estava assim: CODE if (!empty($op)){ switch ($op) { case "adicionar": if (!empty($id_prod)){ $Query = "select * from roma_produto where id_prod = $id_prod"; $R_Query = $MySQL->query($Query); if (mysql_num_rows($R_Query) > 0){ $MeuCarrinho->AdicionarItem($id_prod,1); } } break; case "excluir": $MeuCarrinho->RemoverItem($id_prod); break; case "atualizar": $MeuCarrinho->AtualizarCarrinho($_POST); break; case "finalizar": if ($MeuCarrinho->QuantosItens()>0) { header("Location:OrcamentoFinal.php"); } break; } } Agora estão assim: CODE if (!empty($_GET['op'])){ switch ($_GET['op']) { case "adicionar": if (!empty($_GET['id_prod'])){ $Query = "select * from roma_produto where id_prod = ".$_GET['id_prod']." "; $R_Query = $MySQL->query($Query); if (mysql_num_rows($R_Query) > 0){ $MeuCarrinho->AdicionarItem($_GET['id_prod'],1); } } break; case "excluir": $MeuCarrinho->RemoverItem($_GET['id_prod']); break; case "atualizar": $MeuCarrinho->AtualizarCarrinho($HTTP_POST_VARS); break; case "finalizar": if ($MeuCarrinho->QuantosItens()>0) { header("Location:OrcamentoFinal.php"); } break; } } Agora não consigo inserir mais de um produto em meu carrinho e antes da alteração do php 4 para 5 tudo funcionava legal e estou apanhando pra entender o porque desses problemas Coloquei os scripts no início desse post. Se puderem me dar uma luz nessa questão, vou agradecer muito a quem me ajudar. Valeu e fiquem na paz. Compartilhar este post Link para o post Compartilhar em outros sites