Ir ao conteúdo
  • Cadastre-se

PHP Problema ao realizar transação


Posts recomendados

Gostaria de saber se alguém consegue me ajudar com transações no php, eu tenho duas tabelas uma de imagem e outra de imóvel, a tabela imóvel tem relacionamento de  1 para N imagens, eu tentei realizar a transação no entanto eu não consegui, já que o código pra se salvar imagem é um pouco complexo, simplesmente eu não consigo salvar as duas coisas juntas, o php ignora a imagem. Se eu salvar primeiro um imóvel depois uma imagem para aquele imóvel ele funciona, mas acredito que desse jeito vou ter dor de cabeça futuramente.

O meu código pra salvar imagem:

<?php
include 'Conexao.php';
$consulta = "SELECT id FROM imovel WHERE created = (SELECT MAX(created) FROM imovel)";
$con = $cnn->query($consulta) or die($cnn->error);
$idImovel = $con ->fetch_array();

$arquivo = isset($_FILES['arquivo']) ? $_FILES['arquivo'] : "";

if (isset($_FILES['arquivo'])) {
    $idImovel = $idImovel['id'];
    $nome = $arquivo['name'];
    $tiposPermitidos = ['jpg', 'jpeg', 'png'];
    $quantArquivos = count($_FILES['arquivo']['name']);
    $contador = 0;
    while ($contador < $quantArquivos) {
        $extensao = pathinfo($_FILES['arquivo']['name'][$contador], PATHINFO_EXTENSION);

        $temporario = $_FILES['arquivo']['tmp_name'][$contador];


        if (in_array($extensao, $tiposPermitidos)) {
            $tamanho = $arquivo ['size'];
            $novo_nome = uniqid().".$extensao" ;
            $diretorio = "arquivo/";
             
             if(move_uploaded_file($temporario, $diretorio . $novo_nome)){
                echo "Upload feito com sucesso $novo_nome<br>";
                $sql_code = "INSERT INTO arquivoimagem (arquivo, data, imovel_id) VALUES ('$novo_nome', NOW(), '$idImovel')";
                header("Location: DadosImovel.php");
               
                if (mysqli_query($cnn, $sql_code)) {
                    $msg = "Arquivo enviado com sucesso!";
                } else {
                    $msg = "Falha ao enviar arquivo";
                }
            }
        } else {
            print "Tipo de arquivo não permitido";
        }
        $contador++;
    }
}

Código para salvar imovel:

$tipo = $_POST['tipo'];
$locacao = $_POST['locacao'];
$venda = $_POST['venda'];
$status = $_POST['status'];
$valor = $_POST['valor'];
$areaTerreno = $_POST['areaTerreno'];
$areaConstruida = $_POST['areaConstruida'];
$numQuartos = $_POST['numQuarto'];
$numSuites = $_POST['numSuite'];
$numBanheiros = $_POST['numBanheiro'];
$numVagas = $_POST['numVaga'];
$descricao = $_POST['descricao'];
$rua = $_POST['rua'];
$num = $_POST['num'];
$bairro = $_POST['bairro'];
$pontReferencia = $_POST['pontReferencia'];
$cep = $_POST['cep'];
$cidade = $_POST['cidade'];
$nomeProprietario = $_POST['nomeProprietario'];
$sobrenomeProprietario = $_POST['sobrenomeProprietario'];
$cpfProprietario = $_POST['cpf'];
$email = $_POST['emailProprietario'];
$celular = $_POST['celular'];

$sql = "INSERT INTO `imovel` (`tipo`,
    `locacao`,
    `venda`,
    `status`,
    `valor`,
    `areaTerreno`,
    `areaConstruida`,
    `numQuartos`, 
    `numSuites`, 
    `numBanheiros`, 
    `numVagas`, 
    `descricao`, 
    `rua`,
    `num`,
    `bairro`,
    `pontoReferencia`,
    `cep`,
    `cidade`,
    `nomeProprietario`,
    `sobrenomeProprietario`,
    `cpf`,
    `emailProprietario`, 
    `celular`, 
    `created`) 
    VALUES ('$tipo',
         '$locacao', 
         '$venda',
         '$status',
         '$valor',
         '$areaTerreno',
         '$areaConstruida', 
         '$numQuartos',
         '$numSuites',
         '$numBanheiros',
         '$numVagas', 
         '$descricao', 
         '$rua', 
         '$num', 
         '$bairro',
         '$pontReferencia', 
         '$cep',
         '$cidade',
         '$nomeProprietario',
         '$sobrenomeProprietario', 
         '$cpfProprietario',  
         '$email',
         '$celular',
         NOW())";
if (!$sql) {
    echo 'Ocorreu um erro durante a insercao';
} else {
    echo 'dados inseridos com sucesso';
}
echo $sql;
if (mysqli_query($cnn, $sql)) {
    header("Location: InsereImagens.php");
} else {
    echo"Não salvo";
}

 

Link para o comentário
Compartilhar em outros sites

@Rebeca Julia Bronzatti 

 

Em 01/04/2020 às 18:05, Rebeca Julia Bronzatti disse:

Gostaria de saber se alguém consegue me ajudar com transações no php

Bom eu posso te ajudar!

 

Em 01/04/2020 às 18:05, Rebeca Julia Bronzatti disse:

Se eu salvar primeiro um imóvel depois uma imagem para aquele imóvel ele funciona, mas acredito que desse jeito vou ter dor de cabeça futuramente.

Olhando o código atual, você já deveria está tendo dor de cabeça, o motivo? a falta de segurançã é clara nesse código.

 

Em 01/04/2020 às 18:05, Rebeca Julia Bronzatti disse:

simplesmente eu não consigo salvar as duas coisas juntas,

Bom como você tentou fazer isso?

 

Obs..: Uma coisa que eu achei meio estranha é o motivo de você usar dois tipos de conecão mysqli diferentes nos seus dois códigos, no primeiro você usa MySQLi Object-Oriented, e no outro você usa MySQLi Procedural.

 

 

Link para o comentário
Compartilhar em outros sites

include 'Conexao.php';


mysqli_autocommit($cnn, FALSE);
$nome = $_POST['nome'];
$idade = $_POST['idade'];
$sexo = $_POST['sexo'];
$arquivo = isset($_FILES['arquivo']) ? $_FILES['arquivo'] : "";
$erro = 0;

if (isset($_FILES['arquivo'])) {
    $nomeImagem = $arquivo['name'];
    $tiposPermitidos = ['jpg', 'jpeg', 'png'];
    $quantArquivos = count($_FILES['arquivo']['name']);
    $contador = 0;
    while ($contador < $quantArquivos) {
        $extensao = pathinfo($_FILES['arquivo']['name'][$contador], PATHINFO_EXTENSION);

        $temporario = $_FILES['arquivo']['tmp_name'][$contador];


        if (in_array($extensao, $tiposPermitidos)) {
            $tamanho = $arquivo ['size'];
            $novo_nome = uniqid() . ".$extensao";
            $diretorio = "upload/";

            $sql = "INSERT INTO usuario(nome, idade, sexo) VALUES ('$nome', '$idade', '$sexo')";
            //$resultado = mysqli_query($cnn, $sql);
            $sql_code = "INSERT INTO imagem (arquivo, data) VALUE ('$novo_nome', NOW())";
            

            
            if (!mysqli_query($cnn, $sql)) {
                    echo 'tem erro aqui';
                    $erro++;
                }
                if (!mysqli_query($cnn, $sql_code)) {
                    echo 'tem erro na imagem';
                    $erro++;
                }
                if ($erro == 0) {
                    echo 'arquivos salvos com sucesso';
                    if (move_uploaded_file($temporario, $diretorio . $novo_nome)) {
                echo "Upload feito com sucesso $novo_nome<br>";

                //header("Location: MostraImagem.php");
                

                /* if (mysqli_query($cnn, $sql_code)) {
                  $msg = "Arquivo enviado com sucesso!";
                  } else {
                  $msg = "Falha ao enviar arquivo";
                  } */
            }
                    mysqli_commit($cnn);
                } else {
                    mysqli_rollback($cnn);
                }
        } else {
            print "O arquivo não pode ser salvo";
        }
        $contador++;
    }
} else {
    echo'Não foi possivel salvar';
}

Eu acabei conseguindo fazer transação dessa forma, teria como me explicar melhor a questão da segurança fazendo um favor sou novata nisso.

Link para o comentário
Compartilhar em outros sites

@Rebeca Julia Bronzatti Bom uma das falhas de seguração que eu encontrei é conhecida como "SQL injection", bom como você não filtra os dados que vem da requisição é possivel através deles quebrar o sql que você executa no banco de dados.

 

Aqui tem um video falando sobre:

 

A segunda é bem comum, é a falha de segurança que você cria ao guarda variáves de ambiente direto no código.

 

A terceira é pouco falada, é a falha na falta de verificação do tipo do arquivo que você fez o upload.

Link para o comentário
Compartilhar em outros sites

Em 03/04/2020 às 13:41, Rebeca Julia Bronzatti disse:

teria como me explicar melhor a questão da segurança fazendo um favor sou novata nisso.

 

O seu insert salva no banco tudo que foi enviado sem validação...

 

$numBanheiros = $_POST['numBanheiro'];

Você espera receber um tipo numérico, mas vai salvar o que foi enviado pelo formulário sem verificar. Mesmo usando JS pra fazer máscara basta o usuário alterar o campo e burlar.

 

A verificação SEMPRE se faz no servidor.

Se no campo 'numBanheiro' o usuário escrever "passarinho", você retorna uma mensagem se erro... se os tipos forem corretos ai você faz o insert

 

Link para o comentário
Compartilhar em outros sites

  • mês depois...

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!