Ir para conteúdo

Arquivado

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

rpmarques

Iniciante no MySQLi

Recommended Posts

Bom dia para todos, estou migrando os meus projetos de mysql para mysqli,e depois de alguns estudos cheguei em um modelo que eu montei que é fácil de trabalhar, pelo menos pra mim né...

Tenho uma classe que faz a conexão com o banco:

<?php
/* ESTE ARQUIVO FAZ A CONEXÃO COM O BANCO DE DADOS */
//DADOS DA CONEXÃO
DEFINE ('DB_USER', 'root');
DEFINE ('DB_PASSWORD', 'root');
DEFINE ('DB_HOST', 'localhost');
DEFINE ('DB_NAME', 'interno');

class Conn{
    protected $conn;
    function __construct() {
        $this->conn =  new mysqli(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);
        if (mysqli_connect_errno())trigger_error(mysqli_connect_error()); 
        
    }
//    function __destruct() {
//        mysqli_close($this->conn);
//    }
}
?>

Depois tenho as classes para fazer os inserts e qlqr outros comando SQL, de cada tabela:

<?php
//CHAMO A CLASSE QUE FAZ A CONEXÃO COM O BANCO DE DADOS
include_once 'conexao.class.php';

class Produtos extends Conn{       
  public function insert($rNome,$rQtde,$rQtdeMin,$rQtdeMax,$rDepositoId,$rUnidadeId,$rGrupoId,$rCodFornec,$rEpi,$rProtocolo){
      //COMANDO SQL
      $rData_cad=date('Y-m-d');
      $rNome        = mysqli_real_escape_string($this->conn,$rNome);
      $rQtde        = mysqli_real_escape_string($this->conn,$rQtde);
      $rQtdeMin     = mysqli_real_escape_string($this->conn,$rQtdeMin);
      $rQtdeMax     = mysqli_real_escape_string($this->conn,$rQtdeMax);
      $rDepositoId  = mysqli_real_escape_string($this->conn,$rDepositoId);
      $rUnidadeId   = mysqli_real_escape_string($this->conn,$rUnidadeId);
      $rGrupoId     = mysqli_real_escape_string($this->conn,$rGrupoId);
      $rCodFornec   = mysqli_real_escape_string($this->conn,$rCodFornec);
      $rEpi         = mysqli_real_escape_string($this->conn,$rEpi);
      $rProtocolo   = mysqli_real_escape_string($this->conn,$rProtocolo);
      $rSql="INSERT INTO produtos (nome,data_cad,qtde,qtde_min,qtde_max,deposito_id,unidade_id,grupo_id,cod_fornec,epi,protocolo) VALUES (?,?,?,?,?,?,?,?,?,?,?)";
      $sql = $this->conn->prepare($rSql);
      $sql->bind_param('sssssssssss', $rNome,$rData_cad,$rQtde,$rQtdeMin,$rQtdeMax,$rDepositoId,$rUnidadeId,$rGrupoId,$rCodFornec,$rEpi,$rProtocolo);
      //EXECUTA O COMANDO SQL
      $ret = $sql->execute();
      if ($ret){
          Logger('Usuario:['.LOGIN.'] - Inseriu Produto');
      }else{
          Logger('Usuario:['.LOGIN.'] - ERRO:['.  mysqli_error($this->conn).']');
      }
      return $ret;
  }  
  public function selectUM($rComplemento=""){
        $rSql = "SELECT pro.*,prc.*, uni.nome AS nome_unidade, dep.nome as nome_deposito,grp.nome AS nome_grupo "
                . "FROM produtos pro "
              . "LEFT JOIN unidades uni  ON uni.id=pro.unidade_id "
              . "LEFT JOIN pro_prc prc   ON prc.produto_id=pro.id "
              . "LEFT JOIN depositos dep ON dep.id=pro.deposito_id "
              . "LEFT JOIN grupos grp    ON grp.id=pro.grupo_id ". $rComplemento;
        
        $result = $this->conn->query($rSql);

        if (mysqli_num_rows($result)===1){
            $reg =  mysqli_fetch_assoc($result);
            $rObj = new Produtos();
            $rObj->id             = $reg["id"];
            $rObj->nome           = $reg["nome"];
            $rObj->data_cad       = $reg["data_cad"];
            $rObj->unidade_id     = $reg["unidade_id"];
            $rObj->nome_unidade   = $reg["nome_unidade"];
            $rObj->deposito_id    = $reg['deposito_id'];
            $rObj->nome_deposito  = $reg['nome_deposito'];
            $rObj->qtde           = tiraPontoVirgula($reg['qtde']);
            $rObj->qtde_min       = tiraPontoVirgula($reg['qtde_min']);
            $rObj->qtde_max       = tiraPontoVirgula($reg['qtde_max']);
            $rObj->cod_fornec     = $reg['cod_fornec'];
            $rObj->dt_ult_cust1   = formataData($reg['dt_ult_cust1']);
            $rObj->ult_cust1      = formataMoeda($reg['ult_cust1']);
            $rObj->fornec_id1     = $reg['fornec_id1'];
            $rObj->dt_ult_cust2   = formataData($reg['dt_ult_cust2']);
            $rObj->ult_cust2      = formataMoeda($reg['ult_cust2']);
            $rObj->fornec_id2     = $reg['fornec_id2'];
            $rObj->dt_ult_cust3   = formataData($reg['dt_ult_cust3']);
            $rObj->ult_cust3      = formataMoeda($reg['ult_cust3']);
            $rObj->fornec_id3     = $reg['fornec_id3'];
            $rObj->epi            = $reg['epi'];
            $rObj->grupo_id       = $reg['grupo_id'];
            $rObj->nome_grupo     = $reg['nome_grupo'];
            $rObj->protocolo      = $reg['protocolo'];
            $rRetorno = $rObj;
        }
        return $rRetorno;
  }  
  public function select($rComplemento=""){
        $rSql = "SELECT pro.*,prc.*, uni.nome AS nome_unidade, dep.nome as nome_deposito,grp.nome AS nome_grupo "
                . "FROM produtos pro "
              . "LEFT JOIN unidades uni  ON uni.id=pro.unidade_id "
              . "LEFT JOIN pro_prc prc   ON prc.produto_id=pro.id "
              . "LEFT JOIN depositos dep ON dep.id=pro.deposito_id "
              . "LEFT JOIN grupos grp    ON grp.id=pro.grupo_id ". $rComplemento;
      
        $result = $this->conn->query($rSql);
        while ($reg= $result->fetch_array()){
             $rObj = new Produtos();
             $rObj->id             = $reg["id"];
            $rObj->nome           = $reg["nome"];
            $rObj->data_cad       = $reg["data_cad"];
            $rObj->unidade_id     = $reg["unidade_id"];
            $rObj->nome_unidade   = $reg["nome_unidade"];
            $rObj->deposito_id    = $reg['deposito_id'];
            $rObj->nome_deposito  = $reg['nome_deposito'];
            $rObj->qtde           = tiraPontoVirgula($reg['qtde']);
            $rObj->qtde_min       = tiraPontoVirgula($reg['qtde_min']);
            $rObj->qtde_max       = tiraPontoVirgula($reg['qtde_max']);
            $rObj->cod_fornec     = $reg['cod_fornec'];
            $rObj->dt_ult_cust1   = formataData($reg['dt_ult_cust1']);
            $rObj->ult_cust1      = formataMoeda($reg['ult_cust1']);
            $rObj->fornec_id1     = $reg['fornec_id1'];
            $rObj->dt_ult_cust2   = formataData($reg['dt_ult_cust2']);
            $rObj->ult_cust2      = formataMoeda($reg['ult_cust2']);
            $rObj->fornec_id2     = $reg['fornec_id2'];
            $rObj->dt_ult_cust3   = formataData($reg['dt_ult_cust3']);
            $rObj->ult_cust3      = formataMoeda($reg['ult_cust3']);
            $rObj->fornec_id3     = $reg['fornec_id3'];
            $rObj->epi            = $reg['epi'];
            $rObj->grupo_id       = $reg['grupo_id'];
            $rObj->nome_grupo     = $reg['nome_grupo'];
            $rObj->protocolo      = $reg['protocolo'];
             $rRetorno[] = $rObj;
         }
        return $rRetorno;       
  }
  public function delete($rId){
      $rId  = mysqli_real_escape_string($this->conn,$rId);
      $rSql="DELETE FROM produtos WHERE id=?";
      $sql = $this->conn->prepare($rSql);
      $sql->bind_param('i',$rId);
      $ret = $sql->execute();      
      if ($ret){
          Logger('Usuario:['.LOGIN.'] - Excluiu produto - ID:['.$rId.']');
      }else{
          Logger('Usuario:['.LOGIN.'] - ERRO:['.  mysqli_error($this->conn).']');
      }
      return $ret;
  }
  public function update($rId, $rNome,$rDepositoId,$rUnidadeId,$rGrupoId,$rCodFornec,$rEpi,$rProtocolo){
      $rId  = mysqli_real_escape_string($this->conn,$rId);
      $rNome        = mysqli_real_escape_string($this->conn,$rNome);
      $rDepositoId  = mysqli_real_escape_string($this->conn,$rDepositoId);
      $rUnidadeId   = mysqli_real_escape_string($this->conn,$rUnidadeId);
      $rGrupoId     = mysqli_real_escape_string($this->conn,$rGrupoId);
      $rCodFornec   = mysqli_real_escape_string($this->conn,$rCodFornec);
      $rEpi         = mysqli_real_escape_string($this->conn,$rEpi);
      $rProtocolo   = mysqli_real_escape_string($this->conn,$rProtocolo);
      $rSql="UPDATE produtos SET nome=?,deposito_id=?,unidade_id=?,grupo_id=?,cod_fornec=?,epi=?,protocolo=? WHERE id=?";
      $sql = $this->conn->prepare($rSql);
      $sql->bind_param('siiisssi', $rNome,$rDepositoId,$rUnidadeId,$rGrupoId,$rCodFornec,$rEpi,$rProtocolo,$rId);
      $ret = $sql->execute();
      
      if ($ret){
          Logger('Usuario:['.LOGIN.'] - Alteração produto - ID:['.$rId.']');
      }else{
          Logger('Usuario:['.LOGIN.'] - ERRO:['.  mysqli_error($this->conn).']');
      }
      //mysqli_close($this->conn);
      return $ret;
  }  
  public function montaSelec($rNome = 'produto_id', $rSelecionado = null){
        $objProdutos = new Produtos();
        $produtos   = $objProdutos->select();
        $select='';
        $select= '<select class="form-control" name="' . $rNome . '" id="' . $rNome . '">';
        $select.= '<option value="0">Selecione um Produto</option>';
        foreach ($produtos as $linhaDB){
            if (!empty($rSelecionado) && $rSelecionado === $linhaDB->id) {$sAdd = 'selected';}else{$sAdd='';}
                $select.='<option value="'.$linhaDB->id.'"'.$sAdd.'>'.$linhaDB->nome.'</option>';
            }
            $select.= '</select>';
            return $select;
  }  
  public function gravaCusto($rFornecID,$rCusto,$rProdutoID,$rData){
      $rData = mysqli_real_escape_string($this->conn,$rData);
      $rData=  gravaData($rData);
      $rFornecID = mysqli_real_escape_string($this->conn,$rFornecID);
      $rCusto = mysqli_real_escape_string($this->conn,$rCusto);
      $rCusto = tiraPontoVirgula($rCusto);
      $rProdutoID = mysqli_real_escape_string($this->conn,$rProdutoID);
      $rSql="UPDATE pro_prc set ult_cust3=ult_cust2,
                   dt_ult_cust3=dt_ult_cust2,
                   fornec_id3=fornec_id2,
                   ult_cust2=ult_cust1,
                   dt_ult_cust2=dt_ult_cust1,
                   fornec_id2=fornec_id1,
                   fornec_id1=?,
                   ult_cust1=?,
                   dt_ult_cust1=?
            WHERE produto_id=?";
      $sql = $this->conn->prepare($rSql);
      $sql->bind_param('isis',$rFornecID,$rCusto,$rProdutoID,$rData);
      $ret = $sql->execute();
      
      if ($ret){
          Logger('Usuario:['.LOGIN.'] - Atualização de custo produto - ID:['.$rProdutoID.']');
      }else{
          Logger('Usuario:['.LOGIN.'] - ERRO:['.  mysqli_error($this->conn).']');
      }
      //mysqli_close($this->conn);
      return $ret;
  }
}
?>

Até ai sem problemas, o problema que eu tenho é que quando eu vou listar algum dado, ele sempre me retorna estas mensagens:

 

Arquivo que tem o código para listar os produtos:

<?php
include_once './cabecalho.php';
$wSaida="";
$objProduto = new Produtos();
$wLista = $objProduto->select();
if(isset($wLista)){
    foreach ($wLista as $linhaDB){
        $wSaida .= '<tr class="gradeA">
                    <td>'.$linhaDB->cod_fornec.'</td>
                    <td>'.$linhaDB->nome.'</td>
                    <td>'.$linhaDB->nome_unidade.'</td>
                    <td>'.$linhaDB->nome_deposito.'</td>
                    <td>'.$linhaDB->nome_grupo.'</td>
                    <td>'.$linhaDB->qtde.'</td>
                    <td>
                    <a class="btn btn-primary btn-xs" href="produtoAlterar.php?id='.base64_encode($linhaDB->id).'"> <i class="fa fa-edit"></i> Editar </a> 
                    <a class="btn btn-danger btn-xs"  href="produtoExcluir.php?id='.base64_encode($linhaDB->id).'"><i class="fa fa-eraser"></i> Exluir </a>
                    <a class="btn btn-default btn-xs" href="produtoMovimento.php?id='.base64_encode($linhaDB->id).'"><i class="fa fa-search-plus"></i> Listar Movimentos </a>
                    </td>
                </tr>';
    }
}
?>
<div id="page-wrapper">
    <br>
    <div class="row">
        <div class="col-lg-12">
            <div class="panel panel-default">
                <div class="panel-heading">Listagem de Produtos - 1.00.19102015</div>
                <!-- /.panel-heading -->
                <div class="panel-body">
                    <div class="dataTable_wrapper">
                        <table class="table table-striped table-bordered table-hover table-condensed" id="dataTables-example">
                            <thead>
                                <tr>
                                    <th>Ref.</th>
                                    <th>Nome</th>
                                    <th>Unidade</th>
                                    <th>Depósito</th>
                                    <th>Grupo</th>
                                    <th>Qtde</th>
                                    <th>Ação</th>
                                </tr>
                            </thead>
                            <tbody>
                               <?php echo $wSaida;?>
                            </tbody>
                        </table>
                    </div><!-- /.table-responsive -->
                </div><!-- /.panel-body -->
            </div><!-- /.panel -->
        </div><!-- /.col-lg-12 -->
    </div><!-- /.row -->
</div>
<?php include_once './rodape.php'; ?>

Warning: mysqli::mysqli(): (08004/1040): Too many connections in C:\wamp\www\interno2\classes\conexao.class.php on line 12

Notice: Too many connections in C:\wamp\www\interno2\classes\conexao.class.php on line 13

 

Alguém ai pode me ajudar?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Um produto não é uma conexão. No seu exemplo, um produto deve ser uma entidade, possui um estado e representa um objeto físico (um produto).

 

Procure alguma abordagem para abstrair sua conexão da entidade (DataMapper, DAO, TableDataGateway, etc..). Mas não opte por Active Record, fique longe.

 

Voltando ao erro, você precisa apenas uma conexão para todos os dados que devem ser trazidos do SGBD. Sua implementação cria uma conexão por instância de Produto.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então, ao invés de eu criar a conexão no __construct crio uma classe para ela e dai dou o include, seria algo neste sentido?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Basicamente isso, mas chama-se injeção de dependência.

Compartilhar este post


Link para o post
Compartilhar em outros sites

E criando ela como public não é Gabriel?

Outra dúvida, os notices e warnings que o php me retorna, podem fazer com que a aplicação não execute o código depois de dar estes avisos?

Compartilhar este post


Link para o post
Compartilhar em outros sites

E criando ela como public não é Gabriel?

Não, isso é apenas "visibilidade". Injeção de dependência é tornar um recurso inerente de uma classe (uma dependência), ser passível de "injeção". Ou seja, atribuída de forma externa sem diminuir sua importância para o objeto.

 

Pode ver alguns exemplos no link abaixo:

http://fabien.potencier.org/what-is-dependency-injection.html

 

Outra dúvida, os notices e warnings que o php me retorna, podem fazer com que a aplicação não execute o código depois de dar estes avisos?

Notices e warning não interrompem o código, somente fatal erros. Entretanto, todos warnings e notices devem ser corrigidos, validados e/ou possuir o "caminho alternativo".

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vou dar uma lida neste link, mas o que podem causar um Notice ou Warning no sistema afinal, se ele em tese serve para avisar somente, algo tipo, salvar um interno como string ou algo assim?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Notice: Utilizar uma variável que não existe, acessar um index inexistente. Coisas que podem ser "contornadas" com uma simples validação ou atribuição de valor.

 

Warning: Quando algum recurso (sgbd, socket, function), que é uma dependência, estiver indisponível, você receberá um warning. Nesse caso, o fluxo do software deve ser completamente alternado ou interrompido, pois quando um recurso está indisponível, tudo que utilizar ele não irá funcionar.

 

No PHP 7 os erros foram substituídos por exceptions. Todas podem ser capturada, e tratadas, através da exception Error.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado pelos retornos, vou estudar melhor isto.

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por landerbadi
      Boa tarde pessoal. Estou tentado fazer uma consulta no banco de dados porém estou tendo dificuldades. Tenho uma tabela chamada "itens" com os seguintes campos: id, item, ativo. Nela tem cadastrado vários itens. No campo ativo eu coloco a letra "S" para informar que este item está ativo no sistema. Por exemplo: 1, casa, S 2, mesa, S 3, cama, S 4, moto S 5, rádio O quinto registro "radio" não está ativo no sistema pois não tem um "S" no campo ativo. E outra tabela chamada "produtos" com os seguintes campos (id, item1, item2, item3) com os seguintes registros: 1, casa, mesa, moto 2, mesa, casa, cama 3, rádio, cama, mesa Eu preciso fazer uma busca na tabela produtos da seguinte maneira: Eu escolho um registro na tabela "itens", por exemplo "mesa". Preciso fazer com que o php me liste todos os registros da tabela "produtos" que contenham a palavra "mesa". Até aqui tudo bem eu consigo listar. Estou fazendo assim: <?php $item = "mesa" $sql = mysqli_query($conn, "SELECT * FROM produtos WHERE item1 LIKE '$item' OR item2 LIKE '$item' OR item3 LIKE '$item' LIMIT 10"); while($aux = mysqli_fetch_assoc($sql)) { $id = $aux["id"]; $item1 = $aux["item1"]; $item2 = $aux["item2"]; $item3 = $aux["item3"]; echo $id . " - " . $item1 . ", " . $item2 . ", " $item3 . "<br>"; } ?> O problema é que está listando todos os registros que contém o item mesa. Eu preciso que o php verifique os demais item e me liste somente os registro em que todos os registros estejam ativos no sistema. No exemplo acima ele não deveria listar o registro 3. pois nesse registro contém o item "radio" e este item não está ativo no sistema. Ou seja, o registro "radio" na tabela itens não possui um "S" na coluna "ativo". Alguém sabe como resolver isso?
    • Por First
      Olá a todos!
       
      Eu estou criando um sistema do zero mas estou encontnrando algumas dificuldades e não estou sabendo resolver, então vim recorrer ajuda de vocês.
      Aqui está todo o meu código: https://github.com/PauloJagata/aprendizado/
       
      Eu fiz um sistema de rotas mas só mostra o conteúdo da '/' não sei porque, quando eu tento acessar o register nada muda.
      E eu também quero que se não estiver liberado na rota mostra o erro de 404, mas quando eu tento acessar um link inválido, nada acontece.
      Alguém pode me ajudar com isso? E se tiver algumas sugestão para melhoria do código também estou aceitando.
       
       
      Desde já, obrigado.
    • Por landerbadi
      Olá pessoal, boa tarde
       
      Tenho uma tabela chamada "produtos" com os seguintes campos (id, produto) e outra tabela chamada "itens" com os seguintes campos (id, prod_01, prod_02, prod_03, prod_04).
       
      Na tabela produtos eu tenho cadastrado os seguintes produtos: laranja, maçã, uva, goiaba, arroz, feijão, macarrão, etc.
       
      Na tabela itens eu tenho cadastrado os itens da seguinte maneira:
       
      1, laranja, uva, arroz, feijão;
      2, maçã, macarrão, goiaba, uva;
      3, arroz, feijão, maçã, azeite
       
      Meu problema é o seguinte: 
      Eu escolho um produto da tabela "produtos", por exemplo "uva".  Preciso fazer uma consulta na tabela "itens" para ser listado todos os registros que contenham o produto "uva" e que todos os demais produtos estejam cadastrados na tabela "produtos".
       
      No exemplo acima seria listado apenas dois registros, pois o terceiro registro não contém o produto "uva". 
       
      Alguém pode me ajudar? Pois estou quebrando a cabeça a vários dias e não consigo achar uma solução.
    • Por landerbadi
      Boa tarde pessoal. Estou tentado fazer uma consulta no banco de dados porém estou tendo dificuldades. Tenho uma tabela chamada "itens" com os seguintes campos: id, item, plural, ativo. Nela tem cadastrado vários itens e seu respectivo plural. No campo ativo eu coloco a letra "S" para informar que esta palavra está ativa no sistema. Por exemplo: 1, casa, casas, S 2, mesa, mesas, S 3, cama, camas, S 4, moto, motos, S 5, rádio, rádios O quinto registro "radio" não está ativo no sistema pois não tem um "S" no campo ativo. E outra tabela chamada "variações" com os seguintes campos (id, item1, item2, item3) com os seguintes registros: 1, casa, camas, moto 2, mesas, casas, radio 3, rádio, cama, mesa Eu preciso fazer uma busca na tabela variações da seguinte maneira: Eu escolho um registro na tabela "itens", por exemplo "casa". Preciso fazer com que o php me liste todos os registros da tabela "variações" que contenham a palavra "casa". Porém se tiver algum registro com a palavra "casas" também tem que ser listado. Neste caso ele irá encontrar dois registros. Agora eu preciso que o php verifique os demais itens e faça a listagem apenas dos item que estão ativos (que contenham um "S" no campo ativo. Neste caso ele irá encontrar apenas um registro, pois o segundo registro contém a palavra "rádio". E "rádio" não está ativo na tabela itens. Como faço isso?
    • Por ILR master
      Fala pessoal.
       
      Seguinte:
       
      Quero selecionar duas tabelas e mostrar com resultados intercalados. Abaixo segue um código explicando para vcs terem uma ideia.
       
      $consulta = "SELECT A.*, B.* FROM tabela1 A, tabela2 B'";
      $resultado = mysqli_query($conexao, $consulta) or die ("erro");
      while($busca = mysqli_fetch_array($resultado)){
       
      print $busca['cod_evento']; --> traz o código da tabela1 
      print $busca['titulo_evento']; -->  traz o titulo da tabela1
      print $busca['cod_noticia']; --> traz o código da tabela2
      print $busca['titulo_noticia']; --> traz o tituloda tabela2
       
      }
       
      Espero que entendam. Grato
       
×

Informação importante

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