Ir para conteúdo

POWERED BY:

Arquivado

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

AndersonWS

Melhorar classe genérica CRUD

Recommended Posts

Galera estou aprendendo então minha classe ainda tem muito a melhorar por isso peço ajuda, dicas e orientações para melhoria da classe.

O que eu fiz funciona mas preciso melhorar. Umas das coisa que eu gostaria seria usar o bindParam ou algo para evitar o SQL Injection.

Segue o que eu consegui fazer:

public function update($tableName, array $data, $cond, array $condParams) 
	{
		$set = array();
		foreach(array_combine($condParams, $data) AS $v1 => $v2) {
			$set[] = $v1 . ' = '.$v2;
		}

		$sql = 'UPDATE ' . $tableName. ' SET ' . join(', ', $set). ' WHERE '. $cond;

		$this->sql = $sql;
		// consulta que retorna
		$query = $this->db->prepare($this->sql); 
		$query->execute();
		
	}

Sugestões?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Segue uma ideia:

    public function update()
    {
        $updateSets = '';
	
       /**
        * fieldsValues é um array associativo qualquer, 
        * Ex: ['nome' => 'joao', 'idade' => 10];
        */
        foreach ($this->fieldsValues as $field => $value) {
            $updateSets .= sprintf('%s = :%s,', $field, $field);
        }

        $updateSets = substr($updateSets, 0, -1);
    
        $sql = sprintf(
                    "update %s set %s where id = %s", 
                    $this->table, $updateSets, $this->id
                );

        $this->stmt = $this->conn->prepare($sql);
        $this->stmt->execute($this->fieldsValues);
    }

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

na vdd não existe formula mágica, cada um tem uma maneira de fazer, mas, neste seu caso ainda falta retorno para uma resposta nas classes que vão se estender/receber/enviar os dados.

Cada função do Mysql você faz um método e retorna o resultado (true, false, erro (com possibilidade de callback)), e f**a-se pra quem achar ruim.

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
1 hora atrás, EdCesar disse:

Segue uma ideia:

Na verdade não entendi muito. Isto que você fez torna mais seguro contra SQL Injection por exemplo?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mais uma dúvida.
Antes eu usava assim:

$nome	= trim($_POST['nome']);
$nome 	= mysql_real_escape_string($nome);

Agora li que teria que usar assim:

$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (?, ?)");
$stmt->bindParam(1, $name);
$stmt->bindParam(2, $value);

Como adaptar isso a minha classe genérica?

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

Na minha sugestão, "compilando", ficaria assim:
 

$data = [
    'nome' => 'joao',
    'idade' => 10,
];

$stmt = $conn->prepare('update alunos set nome = :nome, idade = :idade where id = 3');
$stmt->execute($data);

Geraria o código acima de forma automatizada, e tratando de forma eficaz (não definitiva) contra SQL Injection. Todos os valores serão tratados com PDO::PARAM_STR
 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Antes de se proteger contra SQL Injection, precisa entender o que é e como funciona. Leia no site https://phpdelusions.net/ aonde existe o artigo mais completo que já li.

Compartilhar este post


Link para o post
Compartilhar em outros sites
2 horas atrás, Gabriel Heming disse:

Antes de se proteger contra SQL Injection, precisa entender o que é e como funciona. Leia no site https://phpdelusions.net/ aonde existe o artigo mais completo que já li.

 

Olhei a documentação e fiz assim:

public function inserir($tabela, array $data, array $allowed, $where) {
		try {
			
			$values = []; 
			$set = "" ; 
			foreach ( $allowed as $field ) 
			{ 
				if (isset( $data [ $field ])) 
				{ 
					$set .= "`" . str_replace ( "`" , "``" , $field ). "`" . "=:$field , " ; 
					$values [ $field ] = $data [ $field ]; 
				} 
			} 
			$set = substr ( $set , 0 , - 2 );  
			
			//$query = $this->db->prepare ( "INSERT INTO " .$tabela. " SET $set " .$where. "" ); 
			$query = $this->db->prepare("UPDATE " .$tabela. " SET $set " .$where. "" ); 
			$query -> execute ( $values ); 
					
		} catch (PDOException $e) {
			echo "Ocorreu um erro: " .$e->getMessage();
		}
	}

O que acham? Está correta? E quanto a segurança da query?
 

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por ILR master
      Fala galera, tudo certo?
       
      Seguinte: No servidor A estou tentando fazer uma consulta com o servidor B, mas está dando erro.
      Estou usando o mesmo código de conexão do servidor B que funciona perfeitamente, mas no servidor A, dá erro.
      Segue código:
       
      $host = 'servidor B';
      $user = 'user';
      $pass = '********';
      $db   = 'banco';
       
      // conexão e seleção do banco de dados
      $conexao = mysqlI_connect($host, $user, $pass, $db);
      mysqlI_set_charset($conexao,"utf8");
      //print "Conexão rodando e OK!"; 
      //mysqlI_close($conexao);
       
      Alguém pode me ajudar?
    • 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
    • Por violin101
      Caros amigos, saudações.
       
      Humildemente peço desculpa por postar uma dúvida que tenho.

      Preciso salvar no MySql, os seguinte Registro:

      1 - Principal
      ====> minha dúvida começa aqui
      ==========> como faço para o Sistema Contar Automaticamente o que estiver despois do 1.____?
      1.01 - Matriz
      1.01.0001 - Estoque
      1.01.0002 - Oficina
      etc

      2 - Secundário
      2.01 - Loja_1
      2.01.0001 - Caixa
      2.01.0002 - Recepção
      etc
       
      Resumindo seria como se fosse um Cadastro de PLANO de CONTAS CONTÁBEIL.

      Grato,


      Cesar









       
    • Por violin101
      Caros amigos, saudações.

      Por favor, me perdoa em recorrer a orientação dos amigos.

      Preciso fazer um Relatório onde o usuário pode Gerar uma Lista com prazo para vencimento de: 15 / 20/ 30 dias da data atual.

      Tem como montar uma SQL para o sistema fazer uma busca no MySql por período ou dias próximo ao vencimento ?

      Tentei fazer assim, mas o SQL me traz tudo:
      $query = "SELECT faturamento.*, DATE_ADD(faturamento.dataVencimento, INTERVAL 30 DAY), fornecedor.* FROM faturamento INNER JOIN fornecedor ON fornecedor.idfornecedor = faturamento.id_fornecedor WHERE faturamento.statusFatur = 1 ORDER BY faturamento.idFaturamento $ordenar ";  
      Grato,
       
      Cesar
       
       
       
       
    • Por violin101
      Caros amigos, saudações
       
      Por favor, me perdoa em recorrer a orientação dos amigos, tenho uma dúvida.
       
      Gostaria de uma rotina onde o Sistema possa acusar para o usuário antes dos 30 dias, grifar na Tabela o aviso de vencimento próximo, por exemplo:
       
      Data Atual: 15/11/2024
                                           Vencimento
      Fornecedor.....................Data.....................Valor
      Fornecedor_1...........01/12/2024..........R$ 120,00 <== grifar a linha de Laranja
      Fornecedor_1...........01/01/2025..........R$ 130,00
      Fornecedor_2...........15/12/2024..........R$ 200,00 <== grifar a linha de Amarelo
      Fornecedor_2...........15/01/2025..........R$ 230,00
      Fornecedor_3...........20/12/2024..........R$ 150,00
       
      Alguém tem alguma dica ou leitura sobre este assunto ?

      Grato,
       
      Cesar
×

Informação importante

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