Ir para conteúdo

POWERED BY:

Arquivado

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

Pellegrini2106

[Resolvido] Pega somente um resultado da linha de uma consulta

Recommended Posts

Olá amigos Php.

 

Tenho um problema com um método de consulta de funcionários por setor,  quando seleciono um setor na combobox pra procurar todos os funcionário que pertencem a este setor ele  carrega somente a consulta de um funcionário somente.

E queria que fosse carregado igual ao exemplo de baixo.

 

Exemplo:

 

Setor: Analise de Sistemas  -> combobox

 

Setor:                                Funcionário

Analise de sistemas        José da Silva

Analise de sistemas         João da Silva

 

O problema e quando escolho o setor Analise de sistemas ele somente aparece na consulta a ultima informação Analise de sistemas  e João da Silva e não todos os analistas de sistemas.

 

public function consultarFunc(Funcionario $func) {

        $array = array();

        $sql = "SELECT tbsetor.descricao,tbfuncionario.nome FROM tbfuncionario INNER JOIN tbsetor  ON tbfuncionario.id_setor = tbsetor.id_setor AND tbfuncionario.id_setor = '{$func->getId_setor()}' ORDER BY tbfuncionario.id_setor";
        $campo = $this->cnx->prepare($sql);
        $campo->bindValue(1, $func->getId_setor(), PDO::PARAM_INT);
        $campo->execute();

        while ($row = $campo->fetch(PDO::FETCH_ASSOC)) {

            $array[$row['id_func']]['id_func'] = $row['id_func'];
             $array[$row['id_func']]['descricao'] = $row['descricao'];
            $array[$row['id_func']]['nome'] = $row['nome'];
        }
        return $array;
    }


 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você não está retornando na consulta o campo id_func. Por isso, ele está sendo convertido de null para zero (0).

 

Se você ativar os erros, irá ver isso de cara.

Compartilhar este post


Link para o post
Compartilhar em outros sites
SELECT tbsetor.descricao,tbfuncionario.nome, NOME_DA_TABELA.id_func

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Leia sua query e leia a que o @ESerra passou, tem uma diferença entre elas. Compare a diferença com a explicação que eu dei.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Aos queridos amigos Gabriel e ESerra digo que já resolvi o meu problema sozinho era somente colocar um asterisco no meu select ao invés de colocar tbsetor.descricao,tbfuncionario.nome. Ok mas obrigado pela ajuda de vocês galera!!!

 $sql = "SELECT * FROM tbfuncionario INNER JOIN tbsetor  ON tbfuncionario.id_setor = tbsetor.id_setor AND tbfuncionario.id_setor = '{$func->getId_setor()}' ORDER BY tbfuncionario.id_setor";

 

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Pellegrini3834, você fez exatamente o que foi dito, acrescentar o id_func na query, só que usou o asterisco, o que não é recomendado, a não ser que você tenha um motivo para fazer isso.

Problemas vem e voltam, sempre estão presente. Mais do que resolve-los, é importante entende-los

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Pellegrini3834 não é isso que o asterísco faz. Tendo ou não asterísco na sua consulta, ela irá retornar todos os registros de um setor.

 

Se você ativar os erros no seu código, entenderá tudo o que foi explicado aqui no post.

 

Adicione o seguinte trecho de código ao seu script PHP:

ini_set('error_reporting', E_ALL);
ini_set('log_errors' , TRUE);
ini_set('html_errors' , TRUE);
ini_set('display_errors' , TRUE); // production: FALSE, development: TRUE

O que estava ocorrendo no seu código é o seguinte.

 

Essa é a sua consulta (a parte importante que precisa ser esclarecida):

SELECT tbsetor.descricao, tbfuncionario.nome FROM tbfuncionario /** o restante não é necessário **/

Veja bem que você está retornando as colunas:

- tbsetor.descricao;

- tbfuncionario.nome.

 

Na continuidade do seu código:

while ($row = $campo->fetch(PDO::FETCH_ASSOC)) {
	$array[$row['id_func']]['id_func'] = $row['id_func'];
	$array[$row['id_func']]['descricao'] = $row['descricao'];
	$array[$row['id_func']]['nome'] = $row['nome'];
}

Você está tentando utiliza o id_func (trecho de código abaixo):

$row['id_func']

Mas essa coluna não foi definida na consulta.

 

No PHP, quando uma chave de array (seja indexado ou associativo) não existe, o PHP exibe um Notice e retorna o valor null. Ou seja, a chave do array, aonde você estava adicionando os registros, estava sempre sendo retornada como null.

 

Se for ler no manual (leia a parte em negrito destaca abaixo): http://php.net/manual/en/language.types.array.php

 

Citar

The key can either be an integer or a string. The value can be of any type.

Additionally the following key casts will occur:

  • Strings containing valid decimal integers, unless the number is preceded by a + sign, will be cast to the integer type. E.g. the key "8" will actually be stored under 8. On the other hand "08" will not be cast, as it isn't a valid decimal integer.
  • Floats are also cast to integers, which means that the fractional part will be truncated. E.g. the key 8.7 will actually be stored under 8.
  • Bools are cast to integers, too, i.e. the key true will actually be stored under 1 and the key false under 0.
  • Null will be cast to the empty string, i.e. the key null will actually be stored under "".
  • Arrays and objects can not be used as keys. Doing so will result in a warning: Illegal offset type.
5

Entenderá que null é convertido para uma string vazia ("").

 

Veja o exemplo abaixo:

$array = [];

var_dump([$array["indice_que_nao_existe"] => "valor"]);

Saída:

Citar

Notice: Undefined index: indice_que_nao_existe in /in/qQ78j on line 6

 

array(1) { [""]=> string(5) "valor" }

 

 

E o resultado do seu código era que, cada registro retornado na consulta, estava sendo adicionado no índice vazio, ou seja, o registro seguinte substituia o anterior. Por isso só aparecia o último.

 

O Asterísco

 

O asterísco serve para retornar todas as colunas de uma consulta. Ele é usado para quando:

- não se sabe a quantidade de colunas;

- não se sabde os nomes das colunas;

- Pode ser uma consulta dinâmica;

- a quantidade de colunas é muito grande para ser escrita;

- todas as colunas serão utilizadas.

 

No final das contas, a única coisa que precisava ser feita era o que foi falado no post #2 e feito no #4, adicionar a coluna id_func. Ou seja:

SELECT 
    tbsetor.descricao,
    tbfuncionario.nome,
    NOME_DA_TABELA.id_func
FROM
/** restante da consulta **/

Então, segundo tudo isso, você pode até ter certeza que tenha que usar asterísco. Entretanto, não sabe o porque deve utilizá-lo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acho q agora entendi e fiz o seguinte galera.

  public function consultarFunc(Funcionario$func) {
        $array = array();
        $sql = "SELECT tbfuncionario.id_func, tbsetor.descricao,  tbfuncionario.nome FROM tbfuncionario INNER JOIN tbsetor  ON tbfuncionario.id_setor = tbsetor.id_setor AND tbfuncionario.id_setor = '{$func->getId_setor()}'";
        $campo = $this->cnx->prepare($sql);
        $campo->bindValue(1, $func->getId_setor(), PDO::PARAM_INT);
        $campo->execute();
        while ($row = $campo->fetch(PDO::FETCH_ASSOC)) {
            $array[$row['id_func']]['id_func'] = $row['id_func'];
            $array[$row['id_func']]['descricao'] = $row['descricao'];
            $array[$row['id_func']]['nome'] = $row['nome'];
        }
        return $array;
    }

E funcionou!!!! abraços aos amigos do php.

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por violin101
      Caros amigos, saudações.
       
      Por favor, me permita tirar uma dúvida com os amigos.

      Tenho um Formulário onde o Usuário digita todos os Dados necessários.

      Minha dúvida:
      --> como faço após o usuário digitar os dados e salvar, o Sistema chamar uma Modal ou mensagem perguntando se deseja imprimir agora ?

      Grato,
       
      Cesar
    • Por Carcleo
      Tenho uma abela de usuarios e uma tabela de administradores e clientes.
      Gostaria de uma ajuda para implementar um cadastro
       
      users -> name, login, passord (pronta) admins -> user_id, registratiom, etc.. client -> user_id, registratiom, etc...
      Queria ajuda para extender de user as classes Admin e Client
      Olhem como estáAdmin
      <?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class Admin extends User {     use HasFactory;            protected $fillable = [         'name',         'email',         'password',         'registration'     ];      private string $registration;     public function create(         string $name,          string $email,          string $password,         string $registration     )     {         //parent::create(['name'=>$name, 'email'=>$email, 'password'=>$password]);         parent::$name = $name;         parent::$email = $email;         parent::$password = $password;         $this->registration = $registration;     } } User
      <?php namespace App\Models; // use Illuminate\Contracts\Auth\MustVerifyEmail; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; use Illuminate\Database\Eloquent\Relations\BelongsToMany; class User extends Authenticatable {     /** @use HasFactory<\Database\Factories\UserFactory> */     use HasFactory, Notifiable;     static string $name;     static string $email;     static string $password;     /**      * The attributes that are mass assignable.      *      * @var list<string>      */     protected $fillable = [         'name',         'email',         'password',     ];          /**      * The attributes that should be hidden for serialization.      *      * @var list<string>      */     protected $hidden = [         'remember_token',     ];     /**      * Get the attributes that should be cast.      *      * @return array<string, string>      */     protected function casts(): array     {         return [             'email_verified_at' => 'datetime',             'password' => 'hashed',         ];     }          public function roles() : BelongsToMany {         return $this->belongsToMany(Role::class);     }       public function hasHole(Array $roleName): bool     {                 foreach ($this->roles as $role) {             if ($role->name === $roleName) {                 return true;             }         }         return false;     }         public function hasHoles(Array $rolesName): bool     {                 foreach ($this->roles as $role) {             foreach ($rolesName as $rolee) {             if ($role->name === $rolee) {                 return true;             }          }         }         return false;     }         public function hasAbility(string $ability): bool     {         foreach ($this->roles as $role) {             if ($role->abilities->contains('name', $ability)) {                 return true;             }         }         return false;     }     } Como gravar um Admin na tabela admins sendo que ele é um User por extensão?
      Tentei assim mas é claro que está errado...
      public function store(Request $request, Admin $adminModel) {         $dados = $request->validate([             "name" => "required",             "email" => "required|email",             "password" => "required",             "registration" => "required"         ]);         $dados["password"] =  Hash::make($dados["password"]);                  $admin = Admin::where("registration",  $dados["registration"])->first();                  if ($admin)              return                    redirect()->route("admin.new")                             ->withErrors([                                 'fail' => 'Administrador já cadastrados<br>, favor verificar!'                   ]);                            $newAdmin = $adminModel->create(                                    $dados['name'],                                    $dados['email'],                                    $dados['password'],                                    $dados['registration']                                 );         dd($newAdmin);         $adminModel->save();         //$adminModel::create($admin);                  return redirect()->route("admin.new")->with("success",'Cadastrado com sucesso');     }  
    • Por violin101
      Caros amigos, saudações.
       
      Gostaria de tirar uma dúvida com os amigos, referente a PDV.
       
      Estou escrevendo um Sistema com Ponto de Vendas, a minha dúvida é o seguinte, referente ao procedimento mais correto.

      Conforme o caixa vai efetuando a venda, o Sistema de PDV já realiza:
      a baixa direto dos produtos no estoque
      ou
      somente após concretizar a venda o sistema baixa os produtos do estoque ?
       
      Grato,
       
      Cesar
       
    • Por violin101
      Caros amigos do grupo, saudações e um feliz 2025.
       
      Estou com uma pequena dúvida referente a Teclas de Atalho.

      Quando o Caps Lock está ativado o Comando da Tecla de Atalho não funciona.
      ou seja:
      se estiver para letra minúscula ====> funciona
      se estiver para letra maiúscula ====> não funciona
       
      Como consigo evitar essa falha, tanto para Letra Maiúscula quanto Minúscula ?

      o Código está assim:
      document.addEventListener( 'keydown', evt => { if (!evt.ctrlKey || evt.key !== 'r' ) return;// Não é Ctrl+r, portanto interrompemos o script evt.preventDefault(); });  
      Grato,
       
      Cesar
    • Por violin101
      Caros amigos, saudações.
       
      Por favor, poderiam me ajudar.

      Estou com a seguinte dúvida:
      --> como faço para para implementar o input código do produto, para quando o usuário digitar o ID o sistema espera de 1s a 2s, sem ter que pressionar a tecla ENTER.

      exemplo:
      código   ----   descrição
           1       -----   produto_A
       
      Grato,
       
      Cesar
×

Informação importante

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