Ir para conteúdo

POWERED BY:

Arquivado

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

BRG

PDO - Substituição de variavel

Recommended Posts

Estou tentando executar uma instrução assim:

 

if(!empty($_POST['texto'])){
   $stmt = $pdo->prepare("SELECT * FROM ex_agenda_virtual WHERE :campo LIKE %:texto% AND nome != '' AND empresa != '' ORDER BY :campo");
  $stmt->bindParam(':campo', $_POST['campo'], PDO::PARAM_STR, 255);
  $stmt->bindParam(':texto', $_POST['texto'], PDO::PARAM_STR, 255);		 
}else{
  $stmt = $pdo->query("SELECT * FROM ex_agenda_virtual WHERE nome != '' AND empresa != '' ORDER BY nome");
}
  $stmt->execute(); 		

O $_POST['campo'] vem de um input select, onde grava o nome do campo [nome ou endereco]. O $_POST['texto'] é um input normal, para realizar a busca.

Ele não esta fazendo o LIKE...

 

Alguem pode me ajudar? Parece que ele nao está substituindo o :texto e o :campo

 

Obs: Ja verifiquei o nome da váriavel $_POST['texto'] e ela não está indo vazia.

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Salve Fabyo, não aparece erro algum

 

try{
	  if(!empty($_POST['texto'])){
		 $stmt = $pdo->prepare("SELECT * FROM ex_agenda_virtual WHERE :campo LIKE %:texto% AND nome != '' AND empresa != ''");
		 $stmt->bindParam(':campo', $_POST['campo'], PDO::PARAM_STR, 255);
		 $stmt->bindParam(':texto', $_POST['texto'], PDO::PARAM_STR, 255);		 
	  }else{
		 $stmt = $pdo->query("SELECT * FROM ex_agenda_virtual WHERE nome != '' AND empresa != '' ORDER BY nome");
	  }
   	  $stmt->execute();
	}catch(PDOException $e){
	echo $e->getMessage();
	}

Código completo

  <form name="formulario" method="post" enctype="multipart/form-data" action="url">
  <select name="campo" class="campoSistema" id="campo">
    <option value="nome"  <?php if ($_POST['campo']== '' or $_POST['campo']== 'nome'){ echo "selected ='selected'";}?>>Nome</option>
    <option value="empresa" <?php if ($_POST['campo']== 'empresa'){ echo "selected ='selected'";}?>>Empresa</option>
  </select>
  <input name="texto" type="text" class="campoSistema" value="<?=$_POST['texto']?>" size="40" />
  <input type="Submit" name="submit" />
 </form>

----

try{
	  if(!empty($_POST['texto'])){
		 $stmt = $pdo->prepare("SELECT * FROM ex_agenda_virtual WHERE :campo LIKE %:texto% AND nome != '' AND empresa != ''");
		 $stmt->bindParam(':campo', $_POST['campo'], PDO::PARAM_STR, 255);
		 $stmt->bindParam(':texto', $_POST['texto'], PDO::PARAM_STR, 255);		 
	  }else{
		 $stmt = $pdo->query("SELECT * FROM ex_agenda_virtual WHERE nome != '' AND empresa != '' ORDER BY nome");
	  }
   	  $stmt->execute();
	}catch(PDOException $e){
	echo $e->getMessage();
	}

:(

Compartilhar este post


Link para o post
Compartilhar em outros sites

Resultado assim:

  if($stmt->rowCount() > 0){
     while($rsDados = $stmt->fetch(PDO::FETCH_OBJ)) { 
     .....
     }
  }else{
    echo'nenhum resultado encontrado.';
}

Só aparece a mensagem de : 'nenhum resultado encontrado.';

 

Não chega nada pelo try, catch

Compartilhar este post


Link para o post
Compartilhar em outros sites

Nao use rowCount, monte seu exemplo baseado no manual e teste pra ver:

 

http://br.php.net/manual/en/pdo.prepare.php

 

http://br.php.net/manual/en/pdostatement.rowcount.php

PDOStatement::rowCount() returns the number of rows affected by a DELETE, INSERT, or UPDATE statement.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Nada Fabyo.. tirei if($stmt->rowCount() > 0)/else e não funcionou...

aff...e o duro que fize o add/excluir/editar... e está tudo belezinha

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
<?php
try {
$texto =& $_POST[ 'texto' ];
$campo =& $_POST[ 'campo' ];

if ( !empty( $texto ) && !empty( $campo ) ){
	$texto = sprintf( '%%%s%%' , filter_var( $texto , FILTER_SANITIZE_STRING , FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH ) );
	$campo = filter_var( $campo , FILTER_SANITIZE_STRING , FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH );

	$stmt = $pdo->prepare( 'SELECT * FROM ex_agenda_virtual WHERE :campo LIKE :texto AND nome != "" AND empresa != ""' );
	$stmt->bindParam( ':campo' , $campo , PDO::PARAM_STR , 255 );
	$stmt->bindParam( ':texto' , $texto , PDO::PARAM_STR , 255 );
} else {
	$stmt = $pdo->query( "SELECT * FROM ex_agenda_virtual WHERE nome != '' AND empresa != '' ORDER BY nome" );
}

if ( $stmt->execute() ){
	$dados = array();

	/**
	 * Recupera as linhas do resultset e monta uma matriz para ser utilizada posteriormente
	 */
	foreach ( $stmt->fetchAll( PDO::FETCH_OBJ ) as $row ){
		$dados[] = $row;
	}

	/**
	 * Você não deveria utilizar essa matriz contendo os dados para montar a exibição aqui,
	 * em vez disso, envie essa matriz para a camada responsável por isso.
	 */
	if ( count( $dados ) >= 1 ){
		//...
		} else {
		echo'nenhum resultado encontrado.';
		}
} else {
	var_dump( $stmt->errorInfo() );
}
} catch ( PDOException $e ) {
echo 'PDOException[ ' , $e->getCode() , ' ]: ' , $e->getMessage() , PHP_EOL;
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara, tentei aqui e não rolo.. eu não sei mais oq ue faço.....

 

Deixei assim:

  if(!empty($_POST['textos'])){
		 $stmt = $pdo->prepare("SELECT * FROM ex_agenda_virtual WHERE :campo LIKE '%:texto%' AND nome != '' AND empresa != ''");
		 $stmt->bindParam(':campo', $_POST['campos'], PDO::PARAM_STR, 255);
		 $stmt->bindParam(':texto', $_POST['textos'], PDO::PARAM_STR, 255);		 
	  }else{
		 $stmt = $pdo->query("SELECT * FROM ex_agenda_virtual WHERE nome != '' AND empresa != '' ORDER BY nome");
	  }
   	  $rsQuery = $stmt->execute();

 

Meu retornou

PDOStatement::execute() [pdostatement.execute]: SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens in agendaVirtual/index.php on line 84

Compartilhar este post


Link para o post
Compartilhar em outros sites

 $stmt = $pdo->prepare("SELECT * FROM ex_agenda_virtual WHERE :campo LIKE '%:texto%' AND nome != '' AND empresa != ''");

Isso não vai funcionar mesmo, testou o código que te passei ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Testei

 

o unico jeito que funciona é assim:

 

  if(!empty($_POST['texto'])){
		 $stmt = $pdo->prepare("SELECT * FROM ex_agenda_virtual WHERE ".$_POST['campo']." LIKE :texto AND nome != '' AND empresa != ''");
		 $filtro = array(":texto" => "%".$_POST['texto']."%"); 	
   	 $stmt->execute($filtro);	

Li em vários lugares que ele não substitui na tag WHERE o nome do campo...não sei se é vero.

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Estou com um problema parecido:

Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens in /var/www/site/classes/enterprise.php on line 63
Meu código:
public function getCompaniesByCity(City $city, $options = null) {
		$database = Connection::getConnection();

		if(empty($options)) {
			$statement = $database->prepare("SELECT * FROM `empresas` WHERE `empresas`.`cidades_codigo` = ?");
			$statement->bindParam(1, $city->getId());
		}
		else {
		/* SELECT * FROM `empresas` INNER JOIN `prods_empresas` ON `prods_empresas`.`empresas_codigo` = `empresas`.`codigo` WHERE `prods_empresas`.`produtos_codigo` = 2 OR `prods_empresas`.`produtos_codigo` = 1 AND `empresas`.`cidades_codigo` = 1; */
		
			$sql = "SELECT * FROM `empresas`
				INNER JOIN `prods_empresas` ON `prods_empresas`.`empresas_codigo` = `empresas`.`codigo` WHERE ";

			foreach($options as $option) {
				$sql .= '`prods_empresas`.`produtos_codigo` = ? OR ';
			}

			$sql = substr($sql, 0, -4);
			$sql .= ' AND `empresas`.`cidades_codigo` = ?';

			$statement = $database->prepare($sql);

			foreach($options as $i => $option) {
				$statement->bindParam($i + 1, $option->getId());
			}

			$statement->bindParam(count($options), $city->getId());
		}

		$statement->execute();

		$objects = $statement->fetchAll(PDO::FETCH_OBJ);
		$companies = array();

		if(!empty($objects)) {
			foreach($objects as $object) {
				$data = array(
					'id' => $object->codigo,
					'name' => $object->nome,
					'link' => $object->link,
					'email' => $object->email,
					'details' => $object->detalhes,
					'logo' => $object->logo
				);

				$enterprise = new Enterprise($data);
				array_push($companies, $enterprise);
			}

			return $companies;
		}
	}
Está entrando no else certinho, o número de parâmetros passado está correto. Os dois métodos dentro de bindParam retornam um inteiro. Está tudo certo aparentemente. Alguém pode me ajudar? Obrigado.

 

Esqueci de dizer que o sql retornado está certo:

SELECT * FROM `empresas` INNER JOIN `prods_empresas` ON `prods_empresas`.`empresas_codigo` = `empresas`.`codigo` WHERE `prods_empresas`.`produtos_codigo` = ? AND `empresas`.`cidades_codigo` = ?
Outra coisa, troquei bindParam por bindValue e não funcionou também.

Compartilhar este post


Link para o post
Compartilhar em outros sites

cara, tem 5 minutos que passei por uma situação igualzinha a sua.

 

Inclusive, cheguei a este tópico procurando uma solução pelo google ^^

 

Nem li as respostas, mas se voce ainda não estiver conseguindo fazer, tente assim:

 

$query = $PDO->prepare('SELECT * FROM `eventos` WHERE `nome` LIKE :terms ORDER BY `id` DESC');
$query->bindValue(':terms', '%' . $_POST['searchTerms'] . '%', PDO::PARAM_STR);
$query->execute();

Acabei de fazer e deu certo.

 

Abs ;)

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.