Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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?
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?
Basicamente isso, mas chama-se injeção de dependência.
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?
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".
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?
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.
Obrigado pelos retornos, vou estudar melhor isto.
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.