BRG 2 Denunciar post Postado Março 10, 2010 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
Fabyo 66 Denunciar post Postado Março 10, 2010 debug seu codigo coloque : try{ } catch(PDOException $e){ echo $e->getMessage(); } para você ver a mensagem de erro Compartilhar este post Link para o post Compartilhar em outros sites
BRG 2 Denunciar post Postado Março 10, 2010 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
Fabyo 66 Denunciar post Postado Março 10, 2010 e o resultado o que chega? Compartilhar este post Link para o post Compartilhar em outros sites
BRG 2 Denunciar post Postado Março 10, 2010 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
Fabyo 66 Denunciar post Postado Março 10, 2010 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
BRG 2 Denunciar post Postado Março 10, 2010 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
João Batista Neto 448 Denunciar post Postado Março 11, 2010 <?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
BRG 2 Denunciar post Postado Março 11, 2010 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
João Batista Neto 448 Denunciar post Postado Março 11, 2010 $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
BRG 2 Denunciar post Postado Março 12, 2010 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
Prove Yourself 0 Denunciar post Postado Abril 26, 2010 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. Compartilhar este post Link para o post Compartilhar em outros sites
Denis Lins 0 Denunciar post Postado Maio 13, 2010 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