Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Boa Noite,
Eu tenho essa dúvida faz um bom tempo e não acho algo que eu entenda fácil, eu já pesquisei sobre o assunto mas nada me satisfaz de forma clara.
Minha dúvida é a seguinte:
Tenho duas tabelas no MYSQL a CHAMADO e ARQUIVOS:
table chamados
{
id_chamado auto_increment
assunto
mensagem
}
table arquivos
{
id_arquivo
id_chamado "chave estrangeira"
nome_arquiovo
}
Como eu conseguiria pegar o ultimo id de cada inserção de um chamado ? , pois um chamado pode ter N arquivos. Nas minhas pesquisas eu vi para utilizar o $pdo->lastInsertId(); Mas se existir dois insert no mesmo tempo, não ia acontecer de gravar dados errados ? ou estou enganado.
Se existir uma forma certa de pegar sempre o ultimo ID em php qual seria?
Desde já agradeço a atenção de todos.
Obrigado pela resposta, mas dai como posso fazer para que só seja incluído o chamado se todos os arquivos enviados nao possuir algum erro?
Vamos dizer que tem 3 arquivos em 1 chamado,
vou inserir o chamado para pegar o id, certo? Mas depois caso aconteça algum erro nos for dos arquivos, como faço com o chamado que já foi inserido?
Existe um padrão para isso?
Desde já agradeço sua atenção.
Você pode trabalhar com transação no banco de dados, mas a(s) tabela(s) precisa(m) ser InnoDB. Dá uma pesquisa sobre isso, transação/transaction MySQL.
Uma coisa é abrir o chamado, outra coisa é inserir os arquivos. São duas tabelas distintas pelo que estou vendo. Trate o upload dos arquivos, caso aja erro, você pode simplesmente excluir o chamado, ou pode abri-lo sem arquivo.
Obrigado a todos pelas resposta,
Mas com Transação, onde devo deixar o commit dentro FOR?, pois eu queria que excluísse todos os arquivos_chamados, e também o chamado.
Segue meu código:
<?php
session_start();
if (isset($_SESSION['user_sessao'])){
include 'funcao.php';
$usuario= retordaIdUsuario("flavio");
date_default_timezone_set('America/Sao_Paulo');
$erro = "";
if ((filter_input(INPUT_POST, 'cadastra')) == 'cadastrar')
{
require_once 'conexao/Database.php';
$tipo = filter_input(INPUT_POST, 'tipo');
$prioriedade = filter_input(INPUT_POST, 'prioriedade');
$assunto = filter_input(INPUT_POST, 'assunto');
$msg = filter_input(INPUT_POST, 'descricao',FILTER_DEFAULT);
$dataCad = date('Y-m-d H:i:s');
$status = "1";
try
{
$con = Database::conexao();
$con->beginTransaction();
$stmte = $con->prepare("INSERT INTO chamado values (default,?,?,?,?,?,?,?)");
$stmte->bindValue(1, $usuario[0], PDO::PARAM_INT);
$stmte->bindValue(2, $assunto, PDO::PARAM_STR);
$stmte->bindValue(3, $msg, PDO::PARAM_STR);
$stmte->bindValue(4, $tipo, PDO::PARAM_STR);
$stmte->bindValue(5, $prioriedade, PDO::PARAM_STR);
$stmte->bindValue(6, $dataCad);
$stmte->bindValue(7, $prioriedade, PDO::PARAM_STR);
$stmte->execute();
$idChamado = $con->lastInsertId();
} catch (PDOException $e) {
echo $e->getMessage();
}
// Tamanho máximo do arquivo (em bytes)
$tamanhoMaximo = 1000000;
// Extensões aceitas
$extensoes = array(".doc", ".txt", ".pdf", ".docx",".jpg",".jpeg",".xls");
// Caminho para onde o arquivo será enviado
$caminho = "uploads/";
// Substituir arquivo já existente (true = sim; false = nao)
$substituir = false;
$i=0;
foreach($_FILES["arquivo"]["error"] as $key => $error) {
// Informações do arquivo enviado
$nomeArquivo = $_FILES["arquivo"]["name"][$i];
$tamanhoArquivo = $_FILES["arquivo"]["size"][$i];
$nomeTemporario = $_FILES["arquivo"]["tmp_name"][$i];
$ext = strtolower(substr($_FILES["arquivo"]["name"][$i],-4));
// Verifica se o arquivo foi colocado no campo
if (!empty($nomeArquivo)) {
$v = $nomeArquivo;
$imagem = time().uniqid(md5(1)).$ext;
$nomeArquivo = $imagem;
// Verifica se o tamanho do arquivo é maior que o permitido
if ($tamanhoArquivo > $tamanhoMaximo) {
$erro = "O arquivo " . $v . " não deve ultrapassar " . $tamanhoMaximo. " bytes";
}
if ($tamanhoArquivo <=0) {
$erro = "O arquivo " . $v . " está com tamanho " . $tamanhoArquivo. " bytes, entre em contato com o T.I";
}
// Verifica se a extensão está entre as aceitas
elseif (!in_array(strrchr($nomeArquivo, "."), $extensoes)) {
$erro = "A extensão do arquivo <b>" . $v . "</b> não é válida";
}
// Verifica se o arquivo existe e se é para substituir
elseif (file_exists($caminho . $nomeArquivo) and !$substituir) {
$erro = "O arquivo <b>" . $v . "</b> já existe";
}
// Se não houver erro
if (!$erro) {
try{
$stmte = $con->prepare("INSERT INTO arquivo_chamado values (default,?,?)");
$stmte->bindValue(1, $idChamado, PDO::PARAM_INT);
$stmte->bindValue(2, $nomeArquivo, PDO::PARAM_STR);
$stmte->execute();
// Move o arquivo para o caminho definido
move_uploaded_file($nomeTemporario, ($caminho . $nomeArquivo));
}catch (PDOException $e) {
$con->rollback();
$erro = $e->getMessage();
}
}
}
$i++;
}
}
?>Alguém consegue me ajudar com isso?
Não irá acontecer 2 inserts ao mesmo tempo. A forma está correta, e para cada inserção, irá sempre pegar o último ID de cada, como deseja.