Ir para conteúdo

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.
      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.
    • 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.
×

Informação importante

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