Ir para conteúdo

POWERED BY:

Arquivado

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

Evair Gretter

Usar variável em select PHP+SQL

Recommended Posts

Boa Tarde.

Estou tentando passar uma variável como parâmentro para um select no meu banco de dados, mas me deparei com o seguinte problema.

Meu select está assim dentro da função:

function BuscarCursos($url){
    @$endereco=$url;
    @$explode =(explode("&&", $endereco));
    @$nome = $explode[1];
    echo $nome;
    $pdo=conectarBanco();
    try{
        $buscar= $pdo->query(('SELECT * FROM cursos WHERE busc_curso="'.$nome.'"'));
        $buscar->execute();
        if($buscar->rowCount()>0){
        return $buscar->fetchAll(PDO::FETCH_OBJ);
        }
        }
    catch(PDOException $e){
        echo "Erro ".$e->getMessage();
        }

Recebo o seguinte erro quando tento armazenar seu resultado a um array.

Fatal error: Uncaught exception 'InvalidArgumentException' with message 'Passed variable is not an array or object, using empty array instead' in C:\wamp64\www\educartreinamentos\paginas\cursos.php on line 23

InvalidArgumentException: Passed variable is not an array or object, using empty array instead in C:\wamp64\www\educartreinamentos\paginas\cursos.php on line 23

Mas fazendo o select sem a variável usando apenas o parâmetro no caso o nome do curso funciona perfeitamente... :/

Agradeço a ajuda.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara, por que você tá abrindo e fechando o parenteses duas vezes, aspas dupla duas vezes?

Por que usar o @(arroba) ,isso impede que apareça mensagem de erro?

<?php
// acrescenta isso apos o $buscar->execute();
 printf("Error: %s.\n", $buscar->error);
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara o dos ( foi erro mesmo.

Mas o das aspas eu já tinha usado assim outras vezes e não tive problemas, qual seria a forma correta? Qual correção você sugere?

Passei a variável da seguinte forma $nome="mc", desse jeito funcionou corretamente :/.

E o @ é por que eu estou rodando direto dentro da página de cursos ou seja nesse caso as variávei ficam vazias e mostrando erro, mas quando o site estiver pronto o usuário só vai chegar na página de cursos clicando em um deles. Vou remover esses @ quando upa o site.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara obrigado pela ajuda. Já fiz isso em outras páginas e não tive problema, mas agora está me quebrando....

function BuscarCursos($url){
    @$endereco=$url;
    @$explode =(explode("&&", $endereco));
    $pdo=conectarBanco();
    $query=("SELECT * FROM cursos WHERE busc_curso=?");
    $stmt=$pdo->prepare($query);
    @$nome=$explode[1];
    $stmt->bindvalue(1,$nome);
    $buscar=$stmt->execute();
    $results=$stmt->fetchAll(PDO::FETCH_ASSOC);

Compartilhar este post


Link para o post
Compartilhar em outros sites

printf("Error: %s.\n", $buscar->error);

Mas o que eu acho mais estranho é que passando a variável assim:

$nome="mc";

Funciona.

E recebendo ela da outra página não funciona, sendo que se eu der um echo ele vai me mostrar mc.

Compartilhar este post


Link para o post
Compartilhar em outros sites

printf("Error: %s.\n", $buscar->error);

Mas o que eu acho mais estranho é que passando a variável assim:

$nome="mc";

Funciona.

E recebendo ela da outra página não funciona, sendo que se eu der um echo ele vai me mostrar mc.

Cara como você tá referenciando essa variavel

de um exemplo da $url

dá um echo na $url ve o que chega

Compartilhar este post


Link para o post
Compartilhar em outros sites

Jovem, você está usando PDO, utilize prepared statements

Se o conteúdo da $nome é sempre a última coisa que vem depois de &&, utilize end() como no exemplo a baixo

<?php
function BuscarCursos($url){
    $explode = explode("&&", $url);
    $nome = end($explode);
    try{
        $pdo = conectarBanco();
        $buscar = $pdo->prepare("SELECT * FROM cursos WHERE busc_curso = :nome");
        $buscar->bindValue(':nome', $nome, PDO::PARAM_STR);
        if($buscar->execute()){
            return $buscar->fetchAll(\PDO::FETCH_OBJ);
        }
        throw new \Exception("Erro na consulta", 1);
    }
    catch(\PDOException $e){
        echo $e->getMessage();
    }

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vou tentar fazer isso Mateus. Obrigado pela dica!

Já estou usando prepared statements, seguindo as dicas do Laertes.

Mas o que está me quebrando é que quando dou um echo na variável que foi explodida o resultado dela é exatamente o esperado (ex. ingles). Troquei o Return do código por "echo Um texto", e o texto é exibido corretamente, mas quando tento colocar esses dados no array e mostra-los recebo uma mensagem de erro informando que os dados vindos da função não são um array :/....

Para "escrever" estou fazendo assim:

$dados=BuscarCursos();
$d = new ArrayIterator;

while ($d->valid()){
echo $d->current->nome_curso;
$d-> next();
}

Passando um texto dentro do select (ex. "SELECT * FROM cursos WHERE nome_curso='ingles'");

Não tenho nenhum problema na listagem dos dados exceto um Missed Argument na função....

Obrigado pela ajuda.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Qual a relaçao da $dados e $d ? Aparentemente o erro está aí. Tente rodar o seguinte código:

$dados = BuscarCursos();

echo '<pre>';
// print_r($dados); // só para debugar o que vem de BuscarCursos();
echo '</pre>';

foreach($dados AS $dado)
   echo $dados['nome_curso'];
}

Outra situação, em BuscarCursos(), não é passado um URL como parâmetro ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tentei fazer as alterações que você me sugeriu mas ainda não consegui resolver :/

Olha só

Undefined index: id_curso in C:\wamp64\www\educartreinamentos\paginas\cursos.php on line 28

Mas se eu der um print_r($dados)

ele me mostra o que eu preciso.

Array ( [0] => stdClass Object ( [id_curso] => 1 [busc_curso] => it [nome_curso] => Informática e Tecnologia [resu_curso] => Resumo [desc_curso] => Descrição [grad_curso] => Grade [tipo_curso] => Presencial [imag_curso] => imagens/cursos/robotica.jpg ) )

Código da Função

Mas ele só funciona caso eu passe o valor para a variável $nome, como fiz no código abaixo.

E informa que o offset nome_curso é indefinido

$pdo = conectarBanco();
try {
$buscar = $pdo->prepare('SELECT * FROM cursos WHERE busc_curso=:busc_curso');
$buscar->bindValue(":busc_curso", $nome="it", PDO::PARAM_STR);
$buscar->execute();
if($buscar->execute()){
return $buscar->fetchAll(PDO::FETCH_OBJ);
}
throw new Exception("Erro na consulta", 1);
}
catch(PDOException $e){
echo $e->getMessage();
}
}

caso eu faça assim:

(Dei um echo para ver se o valor estava chegando na variável, chegou normalmente).

function BuscarCursos($nome){
echo $nome;
$pdo = conectarBanco();
try {
$buscar = $pdo->prepare('SELECT * FROM cursos WHERE busc_curso=:busc_curso');
$buscar->bindValue(":busc_curso", $nome, PDO::PARAM_STR);
$buscar->execute();
if($buscar->execute()){
return $buscar->fetchAll(PDO::FETCH_OBJ);
}
throw new Exception("Erro na consulta", 1);
}
catch(PDOException $e){
echo $e->getMessage();
}
}

ele simplesmente não mostra nada no print_r e ainda informa que tenho variáveis $nome não definidas.

Saída da função

<?php
$dados = BuscarCursos();

echo '<pre>';
// print_r($dados); // só para debugar o que vem de BuscarCursos();
echo '</pre>';

foreach($dados AS $dado){
print_r($dados);
echo $dados['id_curso'];
}

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.