Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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.
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();
}
:(
e o resultado o que chega?
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
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.
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
<?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 ); $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.';
} var_dump( $stmt->errorInfo() );
}echo 'PDOException[ ' , $e->getCode() , ' ]: ' , $e->getMessage() , PHP_EOL;
}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
>
$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 ?
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.
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 63Meu 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.
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 ;)
debug seu codigo coloque :
try{
}
catch(PDOException $e){
para você ver a mensagem de erro