Como inserir Dados em Tabela com Campo Auto_increment no Mysql usando PHP Data Objet PDO

O que pode parecer óbvio para alguns, para outros pode ser de difícil detecção. Por exemplo, recentemente um leitor aqui do blog entro em contato comigo por email pedindo ajuda, pois seu script não inseria dados numa tabela que possuía um campo auto_increment. Veja mais detalhes sobre Auto Increment no Mysql Aqui

Depois de analisar o script, descobri o problema — que estava na montagem do query –, mas veja o exemplo abaixo para compreender melhor:

Exemplo sem Auto_increment

Vamos supor que tenhamos uma tabela chamada alunos onde iremos guardar algumas informações sobre o mesmo. Esta tabela possui os seguintes campos:

– id_aluno (inteiro)
– nm_aluno (var char 150)
– idade_aluno (inteiro)

Veja o código:

1
2
3
4
5
CREATE TABLE IF NOT EXISTS `alunos` (
  `id_aluno` int(11) NOT NULL,
  `nm_aluno` varchar(150) NOT NULL,
  `idade_aluno` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
CREATE TABLE IF NOT EXISTS `alunos` (
  `id_aluno` int(11) NOT NULL,
  `nm_aluno` varchar(150) NOT NULL,
  `idade_aluno` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

O Código PHP para inserir dados nesta tabela poderia ser algo assim:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$conn = new PDO("mysql:host=$servidor_mysql;dbname=$nome_banco","$usuario","$senha");
 
$insert = $conn->prepare("insert into alunos values(:id, :nm, :idade)");
 
//--dados
$id = 1;
$nome = "Maikon";
$idade = "20";
//-------
 
$insert->bindParam(":id", $id, PDO::PARAM_INT);
$insert->bindParam(":nm", $nome, PDO::PARAM_STR);
$insert->bindParam(":idade", $idade, PDO::PARAM_INT);
 
$insert->execute();
$conn = new PDO("mysql:host=$servidor_mysql;dbname=$nome_banco","$usuario","$senha");

$insert = $conn->prepare("insert into alunos values(:id, :nm, :idade)");

//--dados
$id = 1;
$nome = "Maikon";
$idade = "20";
//-------

$insert->bindParam(":id", $id, PDO::PARAM_INT);
$insert->bindParam(":nm", $nome, PDO::PARAM_STR);
$insert->bindParam(":idade", $idade, PDO::PARAM_INT);

$insert->execute();

Não há nenhum segredo aí, porém como o campo ID_Aluno deve ser gerado automaticamente e não informado por você via código, precisamos definir ele como auto_increment no banco de dados. Após fazer isso, também é necessário fazer modificações no script. Talvez você esteja pensando, ora, basta desconsiderar o campo ID_aluno retirar o código relativo a este campo, desta forma:

Exemplo com Auto_increment

1
2
3
4
5
6
7
8
9
$insert = $conn->prepare("insert into alunos values(:nm, :idade)");
 
//--dados
$nome = "Pedro";
$idade = "18";
//-------
 
$insert->bindParam(":nm", $nome, PDO::PARAM_STR);
$insert->bindParam(":idade", $idade, PDO::PARAM_INT);
$insert = $conn->prepare("insert into alunos values(:nm, :idade)");

//--dados
$nome = "Pedro";
$idade = "18";
//-------

$insert->bindParam(":nm", $nome, PDO::PARAM_STR);
$insert->bindParam(":idade", $idade, PDO::PARAM_INT);

Infelizmente, o código acima não funciona como o esperado e nenhum registro será inserido. Caso a tabela esteja vazia, ela continuará vazia. Como você está desconsiderando o campo id_aluno, precisa informar ao Mysql quais são os campos que estão sendo inseridos os dados. Isso pode ser feito informando após o nome da tabela — entre parênteses — os devidos campos que estão sendo inseridos. Veja no código abaixo como ficaria o query do insert:

1
$insert = $conn->prepare("insert into alunos(nm_aluno, idade_aluno) values(:nm, :idade)");
$insert = $conn->prepare("insert into alunos(nm_aluno, idade_aluno) values(:nm, :idade)");

Concluindo…

Para encerrar, uma outra dúvida do usuário era em relação a campos que não precisavam de dados na hora do insert. Por exemplo, se você não tem a idade do usuário e quer inseri-la apenas futuramente. Neste caso, você pode fazer a mesma coisa feita no campo id_aluno, ou seja, desconsiderá-lo. Veja como ficaria:

1
2
3
4
5
6
7
8
9
$insert = $conn->prepare("insert into alunos(nm_aluno) values(:nm)");
 
//--dados
$nome = "Eduardo";
//-------
 
$insert->bindParam(":nm", $nome, PDO::PARAM_STR);
 
$insert->execute();
$insert = $conn->prepare("insert into alunos(nm_aluno) values(:nm)");

//--dados
$nome = "Eduardo";
//-------

$insert->bindParam(":nm", $nome, PDO::PARAM_STR);

$insert->execute();
Como inserir Dados em Tabela com Campo Auto_increment no Mysql usando PHP Data Objet PDO
4.9 (98%) 10 votes

Leave a Reply