Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

allex_carvalho

Message: sqlstate[hy093]: Invalid parameter number: no parameters were

Recommended Posts

Boa noite pessoal.

 

Ao clicar no botão editar de um formulário aparece o seguinte erro:

 

Message: SQLSTATE[HY093]: Invalid parameter number: no parameters were bound

Request Parameters:

array (

'controller' => 'admin-planos',

'action' => 'editar',

'id_plano' => '1',

'module' => 'default',

)

 

Não estou conseguindo encontrar o problema na função. Se alguém puder ajuda, segue ela abaixo:

 

public function postEditarAction()
{
	$idPlano = $this->_getParam('id_plano');
	$nome = $this->_getParam('nome');
	$preco_inteiro = $this->_getParam('preco_inteiro','00');
	$preco_centavos = $this->_getParam('preco_centavos', '00');
	$preco = $preco_inteiro.'.'.$preco_centavos; 
	$duracao = $this->_getParam('duracao', 0);
	$ativo = $this->_getParam('ativo', 0);
	$recursos = $this->_getParam('recurso', array());
	$modelPlanos = new Model_Plano();
	$idPlano  = $modelPlanos->updatePlano($idPlano, $nome, $preco, $duracao, $recursos, $ativo);
	$redirectData = array('action'=>'editar', 'id_plano'=>$idPlano, 'controller' => 'admin-planos');
	$this->_redirect( SITE_URL.$this->view->url($redirectData, null, true) );
}

 

Obrigado pela atenção.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você deveria postar o código onde você opera o banco de dados.

 

Se for a PDO, onde você define o prepare() / execute().

 

Provavelmente Model_Plano::updatePlano() produz uma query com placeholders os quais você não setou corretamente uma contra-parte para que eles sejam substituídos, seja através das funções bind* ou um array em execute().

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa noite Bruno.

 

Segue abaixo a função que faz o update.

 

function updatePlano($idPlano, $nome, $preco, $duracao, $recursos = array(), $ativo = 1){
	$this->db->update('planos', array('nome' => $nome, 'preco' => $preco, 'duracao' => $duracao, 'ativo' => $ativo), array('id_plano = ?'=> $idPlano));
	$this->db->delete('planos_recursos', array('id_plano = ?'=> $idPlano));
	foreach($recursos as $recurso){
		$this->db->insert('planos_recursos', array('id_plano' => $idPlano, 'id_recurso' => $recurso));
	}
	return $idPlano;		
}

 

Obrigado pela atenção.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ainda não é esse o código.

 

Há uma definição de um método update() sendo acessado através da propriedade $db.

 

Como seu erro não mostra exatamente qual query está falhando, poste os três métodos: update(), delete() e insert().

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom dia Bruno Augusto.

 

Bem, habilitando a visualização dos erros aparece o seguinte:

 

An error occurred

Application error

Exception information:

Message: SQLSTATE[HY093]: Invalid parameter number: no parameters were bound

Stack trace:

#0 /home2/site/zfprojetcs/library/Zend/Db/Statement.php(300): Zend_Db_Statement_Pdo->_execute(Array)

#1 /home2/site/zfprojetcs/library/Zend/Db/Adapter/Abstract.php(479): Zend_Db_Statement->execute(Array)

#2 /home2/site/zfprojetcs/library/Zend/Db/Adapter/Pdo/Abstract.php(238): Zend_Db_Adapter_Abstract->query(Object(Zend_Db_Select), Array)

#3 /home2/site/zfprojetcs/library/Zend/Db/Adapter/Abstract.php(793): Zend_Db_Adapter_Pdo_Abstract->query(Object(Zend_Db_Select), Array)

#4 /home2/site/zfprojetcs/membro/models/Plano.php(63): Zend_Db_Adapter_Abstract->fetchCol(Object(Zend_Db_Select))

#5 /home2/site/zfprojetcs/membro/controllers/AdminPlanosController.php(68): Model_Plano->findRecursos(NULL)

#6 /home2/site/zfprojetcs/library/Zend/Controller/Action.php(516): AdminPlanosController->editarAction()

#7 /home2/site/zfprojetcs/library/Zend/Controller/Dispatcher/Standard.php(295): Zend_Controller_Action->dispatch('editarAction')

#8 /home2/site/zfprojetcs/library/Zend/Controller/Front.php(954): Zend_Controller_Dispatcher_Standard->dispatch(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http))

#9 /home2/site/zfprojetcs/library/Zend/Application/Bootstrap/Bootstrap.php(97): Zend_Controller_Front->dispatch()

#10 /home2/site/zfprojetcs/library/Zend/Application.php(366): Zend_Application_Bootstrap_Bootstrap->run()

#11 /home2/site/public_html/membro/index.php(36): Zend_Application->run()

#12 {main}

Request Parameters:

array (

'controller' => 'admin-planos',

'action' => 'editar',

'id_plano' => '1',

'module' => 'default',

)

 

Em destaque para a linha:

#5 /home2/site/zfprojetcs/membro/controllers/AdminPlanosController.php(68): Model_Plano->findRecursos(NULL)

 

Veja o que tem na function (na frente da linha 68 está comentado):

 

/**
 * @validate(adminCmsAuth)
 * @validate(planoExiste)
 */
public function editarAction()
{
	$modelPlanos = new Model_Plano();
	$this->view->plano = $this->plano;
	$this->view->recursos = $modelPlanos->findRecursosAll();
	$this->view->recursosAtivos = $modelPlanos->findRecursos($this->plano['id_plano']); // Linha 68
}

/**
 * @validate(adminCmsAuth)
 * @validate(planoExiste)
 */
public function postEditarAction()
{
	$idPlano = $this->_getParam('id_plano');
	$nome = $this->_getParam('nome');
	$preco_inteiro = $this->_getParam('preco_inteiro','00');
	$preco_centavos = $this->_getParam('preco_centavos', '00');
	$preco = $preco_inteiro.'.'.$preco_centavos; 
	$duracao = $this->_getParam('duracao', 0);
	$ativo = $this->_getParam('ativo', 0);
	$recursos = $this->_getParam('recurso', array());
	$modelPlanos = new Model_Plano();
	$idPlano  = $modelPlanos->updatePlano($idPlano, $nome, $preco, $duracao, $recursos, $ativo);
	$redirectData = array('action'=>'editar', 'id_plano'=>$idPlano, 'controller' => 'admin-planos');
	$this->_redirect( SITE_URL.$this->view->url($redirectData, null, true) );
}

 

Mais uma vez, obrigado pela atenção.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ainda não é esse código. ^_^

 

Você deveria postar Model_Plano::findRecursos() porque é nele que está ocorrendo a construção incorreta do SELECT e, ao ser passado para a PDO, está gerando esse erro.

 

Eu já suspeitava que você estava usando um framework, só não sabia qual. Agora que sei, só a título de organização, estarei movendo para a sala apropriada.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Está dificil, rsrs...

 

O que se refere a isso é só aqui:

 

<?php


class AdminPlanosController extends Model_Controller
{
/**
 * @var Zend_Db_Adapter_Abstract
 */
protected $db; 

/**
 * @var Zend_Session_Namespace
 */
protected $session; 

public function init()
   {
   	$this->session = Zend_Registry::get("session");
   	$this->db = Zend_Registry::get("db");
   	$this->_helper->layout->setLayout('layout-admin');
   }

   /**
 * @validate(adminCmsAuth)
 */
public function indexAction()
{
	$modelPlanos = new Model_Plano();
	$this->view->planos = $modelPlanos->findAll();
}

/**
 * @validate(adminCmsAuth)
 */
public function adicionarAction()
{
	$modelPlanos = new Model_Plano();
	$this->view->recursos = $modelPlanos->findRecursosAll();
}

/**
 * @validate(adminCmsAuth)
 */
public function postAdicionarAction()
{
	$nome = $this->_getParam('nome');
	$preco_inteiro = $this->_getParam('preco_inteiro','00');
	$preco_centavos = $this->_getParam('preco_centavos', '00');
	$preco = $preco_inteiro.'.'.$preco_centavos; 
	$duracao = $this->_getParam('duracao', 0);
	$ativo = $this->_getParam('ativo', 0);
	$recursos = $this->_getParam('recurso', array());
	$modelPlanos = new Model_Plano();
	$idPlano  = $modelPlanos->novoPlano($nome, $preco, $duracao, $recursos, $ativo);
	$redirectData = array('action'=>'editar', 'id_plano'=>$idPlano, 'controller' => 'admin-planos');
	$this->_redirect( SITE_URL.$this->view->url($redirectData, null, true) );
}

/**
 * @validate(adminCmsAuth)
 * @validate(planoExiste)
 */
public function editarAction()
{
	$modelPlanos = new Model_Plano();
	$this->view->plano = $this->plano;
	$this->view->recursos = $modelPlanos->findRecursosAll();
	$this->view->recursosAtivos = $modelPlanos->findRecursos($this->plano['id_plano']);
}

/**
 * @validate(adminCmsAuth)
 * @validate(planoExiste)
 */
public function postEditarAction()
{
	$idPlano = $this->_getParam('id_plano');
	$nome = $this->_getParam('nome');
	$preco_inteiro = $this->_getParam('preco_inteiro','00');
	$preco_centavos = $this->_getParam('preco_centavos', '00');
	$preco = $preco_inteiro.'.'.$preco_centavos; 
	$duracao = $this->_getParam('duracao', 0);
	$ativo = $this->_getParam('ativo', 0);
	$recursos = $this->_getParam('recurso', array());
	$modelPlanos = new Model_Plano();
	$idPlano  = $modelPlanos->updatePlano($idPlano, $nome, $preco, $duracao, $recursos, $ativo);
	$redirectData = array('action'=>'editar', 'id_plano'=>$idPlano, 'controller' => 'admin-planos');
	$this->_redirect( SITE_URL.$this->view->url($redirectData, null, true) );
}

}
?>

 

Obrigado pela paciência e atenção :)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acho que você não entendeu a terminologia Model_Plano::findRecursos() né? :P

 

Essa definição é usada para encurtar quando queremos dizer o método X da class Y, no caso o método findRecursos() presente na classe Model_Plano.

 

Esse código que postou é o Controller que interage com a Model e não com o banco e na interação com o banco que está ocorrendo o problema. :thumbsup:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom dia Bruno.

 

Olhei aqui arquivo por arquivo, se não for isso agora não sei o que pode ser (é o arquivo completo da function updatePlano), rss

 

<?php
class  Model_Plano{
/**
 * @var Zend_Db_Adapter_Abstract
 */
protected $db;

function __construct(){
	$this->db = Zend_Registry::get('db');
}

function findActive(){
	$select = $this->db
		->select()
		->from('planos', '*')
		->where('ativo = 1');
	return $this->db->fetchAll($select);		
}

function findAll(){
	$select = $this->db
		->select()
		->from('planos', '*');
	return $this->db->fetchAll($select);		
}

function findById($idPlano){
	$select = $this->db
		->select()
		->from('planos', '*')
		->where('id_plano = ?', $idPlano);
	return $this->db->fetchRow($select);		
}

function findByUser($idUsuario){
	$select = $this->db
	->select()
	->from('planos', array('*','dias_restantes' => '(planos.duracao - DATEDIFF(NOW(), assinatura.inicio))'))
	->join('assinatura', 'assinatura.id_plano = planos.id_plano')
	->where('assinatura.id_usuario = ?', $idUsuario)
	->where('assinatura.status = \'ON\'');
	return $this->db->fetchRow($select);
}

function findActiveByUserNotHave($idUsuario){
	$planoUsuario = $this->findByUser($idUsuario);

	$select = $this->db
	->select()
	->from('planos', '*')
	->where('ativo = 1');

	if($planoUsuario){
		$select->where('id_plano != ?', $planoUsuario['id_plano']);
	}
	return $this->db->fetchAll($select);
}

function findRecursos($idPlano){
	$select = $this->db->select()->from(array('R'=>'recursos'), array('nome'))
	->join(array('PR' => 'planos_recursos'), 'R.id_recurso = PR.id_recurso')
	->where('PR.id_plano = ?', $idPlano);
	return $this->db->fetchCol($select);
}

function findRecursosAll(){
	$select = $this->db->select()->from(array('R'=>'recursos'));
	return $this->db->fetchAll($select);
}

function novoPlano($nome, $preco, $duracao, $recursos = array(), $ativo = 1){
	$this->db->insert('planos', array('nome' => $nome, 'preco' => $preco, 'duracao' => $duracao, 'ativo' => $ativo));
	$idPlano = $this->db->lastInsertId();
	foreach($recursos as $recurso){
		$this->db->insert('planos_recursos', array('id_plano' => $idPlano, 'id_recurso' => $recurso));
	}
	return $idPlano;		
}

function updatePlano($idPlano, $nome, $preco, $duracao, $recursos = array(), $ativo = 1){
	$this->db->update('planos', array('nome' => $nome, 'preco' => $preco, 'duracao' => $duracao, 'ativo' => $ativo), array('id_plano = ?'=> $idPlano));
	$this->db->delete('planos_recursos', array('id_plano = ?'=> $idPlano));
	foreach($recursos as $recurso){
		$this->db->insert('planos_recursos', array('id_plano' => $idPlano, 'id_recurso' => $recurso));
	}
	return $idPlano;		
}
}

 

Obrigado pela atenção =D

Compartilhar este post


Link para o post
Compartilhar em outros sites

Certo o que está acontecendo é o seguinte. Essa linha:

 

 

->where('PR.id_plano = ?', $idPlano);

Em Model_Planos::findRecursos() reserva um espaço na query para o ID do Plano através do placeholder (?). Todo placeholder deve ter um valor como contra-parte, no caso $idPlano.

 

Do ponto de vista do método, está correto pois se o método não estivesse recebendo algum valor, o próprio PHP dispararia um erro e não uma Exception do ZF.

 

$this->view->recursosAtivos = $modelPlanos->findRecursos($this->plano['id_plano']);

Aqui, em editarAction(), é onde você invoca aquele método e, consequentemente informa o valor desejado.

 

Esse valor vêm ´do índice id_plano de uma propriedade plano. Porém eu não encontrei tal proproiedade sendo definida como um array e muito menos tendo o ID do Plano sendo armazenado nesse índice.

 

Ou seja, você está informando o valor, mas esse valor não existe, está nulo ou é vazio.

 

Experimente trocar esse valor por $this->_getParam('id_plano'); que, acredito eu, seja a forma que o ZF trabalha para receber um valor via GET ou POST.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom dia Bruno.

 

Dei uma sumida porque estava correndo atrás dos preparativos do aniversário da minha filha =) Mais estou firme no batente novamente.

 

Alterei a linha, ficando assim:

 

$this->view->recursosAtivos = $modelPlanos->findRecursos($this->_getParam('id_plano'));

 

Ai não apareceu mais os valores cadastrados no banco nos values. Ao voltar a cópia do arquivo original listou novamente os valores dentro dos inputs.

O erro não aparece mais. Só que também não tenho mais contato com o banco :P

 

Obrigado pela atenção.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Antes de você criar essa variável de template você deveria checar se algo está sendo retornado:

 

var_dump( $modelPlanos->findRecursos($this->_getParam('id_plano') );

Se ficar ruim de ler:

 

print '<pre>'; print_r( $modelPlanos->findRecursos($this->_getParam('id_plano') );

~

Se o erro não aparece mais já é um bom sinal, significa que o processo de prepare() and bounding está acontecendo corretamente.

Compartilhar este post


Link para o post
Compartilhar em outros sites

É isso que você espera como retorno? Caso seja, seu problema agora é outro ( :upset: ). Se não, sua query está programada para retornar outra coisa.

 

Se cair no ponto de "outro problema", explica melhor o que está acontecendo dessa vez.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, ele não está listando os dados do formulário. Preciso que ele liste todos os campos. Do jeito que está ele só lista os recursos. Preciso que além disso, liste também:

Nome, preço, duração e ativo.

 

Obrigado pela atenção =)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu não entendo muito como ZF trabalha, o Matias Rezende ou Fabyo poderiam te ajudar melhor nessa parte, mas tanto quanto eu entendo, veja:

 

function findRecursos($idPlano){
   $select = $this->db->select()->from(array('R'=>'recursos'), array('nome'))
   ->join(array('PR' => 'planos_recursos'), 'R.id_recurso = PR.id_recurso')
   ->where('PR.id_plano = ?', $idPlano);
   return $this->db->fetchCol($select);
}

Isso aqui me parece que esteja listando apenas o campo nome e talvez algum outro que não sei dizer ao certo.

 

E você ainda usa fetchCol(). Não sei o que ZF define para esse método, mas eu acho que o certo seria um fetch "simples"

 

Veja se usando findRecursosAll() retorna o que você quer e, caso positivo, adapte essa query.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.