Ir para conteúdo

Arquivado

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

AndersonWS

Aperfeiçoar Classe de Consulta do Mysql

Recommended Posts

8 horas atrás, jamesbond disse:

 

Bela dica. Dessa maneira acho que o padrão facade também se encaixaria, o que acha?

Bem lembrado, tiraria toda a responsabilidade desta classe de fazer o CRUD.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Desculpa o código mas achei de um exemplo de 2008 aqui e adaptei como deu pra agilizar e mostrar o que eu quero quando falo em deixar mais genérica. Sei que não está nos padrões mas eu realmente não sei como montar um create nesta classe pra fazer isso. Já tentei mas não consegui mesmo.

$table = 'ufs';
$id = ["idUfs","nmUfs"];
$nm = ["ZZ","Zero"];
$total = 2;

for($i=0;$i<$total;$i++){
	
	if ($i==0){
		$cols = $id[$i];
		$values = $nm[$i];
	} else {
		$cols = $cols.', '.$id[$i];
		$values = "'".$values."', '".$nm[$i]."'";
		echo $cols.' '.$nm;
	}
}
	$sql = "INSERT INTO ".$table." (".$cols.") VALUES(".$values.")";
	echo 'sql:'.$sql;
	$query = mysqli_query($link, $sql);

É só um exemplo pra ilustrar ok.
Alguma luz? Como eu usaria isso?

10 horas atrás, Williams Duarte disse:

//use as variaveis abaixo para o insert //$this->table //$this->columns //$this->fields

 

Achei uma função que poderia adaptar aqui mas não sei como usa-la:

public function insert( array $dados, $tabela )
	{ 
		try {
			$campos = implode(", ", array_keys($dados) ); 
			$valores = "'" . implode( "', '", array_values($dados) ) . "'"; 
			$stmt = $this->db->prepare( "INSERT INTO {$tabela} ({$campos}) VALUES ({$valores})" ); 
			
		} catch (PDOException $e) {
			die('Error: '. $e->getMessage() );
		}
	}

// $dados['nome'] = "Nome"; $dados['idade'] = 20; $dados['telefone'] = (99)9999-9999;

Grato.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Creio que dessa forma não daria certo.

Sempre que o loop roda é atribuído um novo valor.

1 hora atrás, AndersonWS disse:

$cols = $cols.', '.$id[$i];

$values = "'".$values."', '".$nm[$i]."'";

 

 

Vamos utilizar o exemplo do @Williams Duarte.

Basta adaptar depois para a sua necessidade

Não consegui ver uma forma de fazer os bindValue sem usar o for.

Vamos aguardar o william para nos ajudar.

class CRUD
{
    private $table;
    private $columns;
    private $fields;
    private $bindColumns;
    private $query;


    public function table($table)
    {
        $this->table = $table;
        return $this;
    }


    public function columns($columns)
    {
        $this->columns = $columns;
        $this->generateBind();
        return $this;
    }


    public function fields($fields)
    {
        $this->fields = $fields;
        return $this;
    }
	
	private function generateBind()
	{
		$this->bindColumns = array_map(function($column) {
			return ':'. $column;
		}, $this->columns);
	}

    public function create()
    {

        //use as variaveis abaixo para o insert
        //$this->table
        //$this->columns
        //$this->fields

		$this->query = "INSERT INTO ". $this->table ." (". implode(', ', $this->columns) .") VALUES (". implode(', ', $this->bindColumns) .")";
		
    }
}

$crud = new CRUD();
$crud->table('Banco')
     ->columns(['primeiraColuna', 'segundaColuna'])
     ->fields(['gostei', 'muito', 'pouco'])
     ->create();

Acho que com isso, você consegue simular o bindValue:

array_map(function($bindColumns, $fields) {
            $this->query->bindValue($bindColumns, $fields); // não tenho certeza!!
        }, $this->bindColumns, $this->fields);

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
38 minutos atrás, jamesbond disse:

Acho que com isso, você consegue simular o bindValue:


array_map(function($bindColumns, $fields) {
            $this->query->bindValue($bindColumns, $fields); // não tenho certeza!!
        }, $this->bindColumns, $this->fields);

 

Foreach


 

foreach ($this->bindColumns as $key => $parameter) {
    $this->pdo->bindValue($parameter, $this->fields[$key]);
}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Amigos, consegui essa classe na net no devmedia e adaptei pra usar na minha porém não sei como "instanciar a tabela".

Mas pra pro update genérico não sei como fazer o FROM ".$this->tabela.":

Como fazer? Tentei varias maneiras mas deu erro. Ainda estou aprendendo, uma luz?

public function update($tabela, $arrayDados, $arrayCondicao)
	{ 
		try {
			// Atribui a instrução SQL construida no método   
			$sql = $this->buildUpdate($tabela, $arrayDados, $arrayCondicao);   
		
			// Passa a instrução para o PDO   
			$stm = $this->db->prepare($sql);   
		
			// Loop para passar os dados como parâmetro   
			$cont = 1;   
			foreach ($arrayDados as $valor):   
				$stm->bindValue($cont, $valor);   
				$cont++;   
			endforeach;   
				  
			// Loop para passar os dados como parâmetro cláusula WHERE   
			foreach ($arrayCondicao as $valor):   
				$stm->bindValue($cont, $valor);   
				$cont++;   
			endforeach;   
		
			// Executa a instrução SQL e captura o retorno   
			$retorno = $stm->execute();   
		
			return $retorno;
			
		} catch (PDOException $e) {
			die('Error: '. $e->getMessage() );
		}
	}
	/*   
    * Método privado para construção da instrução SQL de UPDATE   
    * @param $arrayDados = Array de dados contendo colunas, operadores e valores   
    * @param $arrayCondicao = Array de dados contendo colunas e valores para condição WHERE   
    * @return String contendo instrução SQL   
    */    
    private function buildUpdate($tabela, $arrayDados, $arrayCondicao){   
     
        // Inicializa variáveis   
        $sql = "";   
        $valCampos = "";   
        $valCondicao = "";
		$tabela = "";
          
        // Loop para montar a instrução com os campos e valores   
        foreach($arrayDados as $chave => $valor):   
           $valCampos .= $chave . '=?, ';   
        endforeach;   
               
        // Loop para montar a condição WHERE   
        foreach($arrayCondicao as $chave => $valor):   
           $valCondicao .= $chave . '? AND ';   
        endforeach;   
               
        // Retira vírgula do final da string   
        $valCampos = (substr($valCampos, -2) == ', ') ? trim(substr($valCampos, 0, (strlen($valCampos) - 2))) : $valCampos ;    
               
        // Retira vírgula do final da string   
        $valCondicao = (substr($valCondicao, -4) == 'AND ') ? trim(substr($valCondicao, 0, (strlen($valCondicao) - 4))) : $valCondicao ;    
               
         // Concatena todas as variáveis e finaliza a instrução   
         $sql .= "UPDATE " . $tabela . " SET " . $valCampos . " WHERE " . $valCondicao;   
               
         // Retorna string com instrução SQL   
         return trim($sql);   
    }   

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
Em 2017-6-13 at 12:52, AndersonWS disse:

Amigos, consegui essa classe na net no devmedia e adaptei pra usar na minha porém não sei como "instanciar a tabela".

Mas pra pro update genérico não sei como fazer o FROM ".$this->tabela.":

Como fazer? Tentei varias maneiras mas deu erro. Ainda estou aprendendo, uma luz?



 

 

Você pode usar um mini orm que eu desenvolvi para facilitar a conexão com bancos mysql. 

Eu não tive tempo de documentar todos os métodos mas basta olhar os métodos dos seguintes arquivos:

 

structural/facade/Model.php

modules/transformer/SQLTransformer.php

https://github.com/devmacedo/norme

 

Exemplo update:

<?php
$model->update(
	[
		'nome' => 'José',
		'sobrenome' => 'Luiz'
	]
)->where('id', '=', '2')
 ->done();

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
Em 19/06/2017 at 11:24, jamesbond disse:

Você pode usar um mini orm que eu desenvolvi para facilitar a conexão com bancos mysql. 

Eu não tive tempo de documentar todos os métodos mas basta olhar os métodos dos seguintes arquivos:

 

structural/facade/Model.php

modules/transformer/SQLTransformer.php

https://github.com/devmacedo/norme

Vou olhar amigo, grato.

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 ILR master
      Fala galera.
      Espero que todos estejam bem.
      Seguinte: Tenho um arquivo xml onde alguns campos estão com : (dois pontos), como o exemplo abaixo:
       
      <item>
      <title>
      d sa dsad sad sadasdas
      </title>
      <link>
      dsadas dsa sad asd as dsada
      </link>
      <pubDate>sadasdasdsa as</pubDate>
      <dc:creator>
      d sad sad sa ad as das
      </dc:creator>
      </item>
       
      Meu código:
       
      $link = "noticias.xml"; 
      $xml = simplexml_load_file($link); 
      foreach($xml -> channel as $ite) {     
           $titulo = $ite -> item->title;
           $urltitulo = $ite -> item->link;
           print $urltitulo = $ite -> item->dc:creator;
      } //fim do foreach
      ?>
       
      Esse campo dc:creator eu não consigo ler. Como faço?
       
      Agradeço quem puder me ajudar.
       
      Abs
       
       
    • 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.
×

Informação importante

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