Não consigo resolver esse erro fatal, apesar de tentar depurá-lo -- o problema é uma instrução Insert do MySQL
O erro é:
Erro fatal: PDOException não detectado: SQLSTATE[23000]: Violação de restrição de integridade: 1062 Entrada duplicada '' para a chave 'uq_mobile' em /home/path/public_html/signupvalidate.php:51 Rastreamento de pilha: #0 /home/path/path/signupvalidate.php(51): PDOStatement->execute(Array) #1 {main} lançado em /home/path/path/signupvalidate.php na linha 51
o que é 'uq_mobile'? Esta não é uma frase em nenhum lugar do meu código ou banco de dados mySQL ou configuração de tabela
A instrução Insert é:
$stmtInsertProfile = $conn->prepare('INSERT INTO users_profile (userid, firstName, middleName, lastName, mobile, email, country, registeredAt, lastLogin, intro, userProfile)
VALUES (:userid, :firstName, :middleName, :lastName, :mobile, :email, :country, :registeredAt, :lastLogin, :intro, :userProfile)');
$stmtInsertProfile->execute([
// 'id' => '', // do not specific the auto increment primary key on insert commands
'userid' => $fetchedUserID,
'firstName' => '',
'middleName' => '',
'lastName' => '',
'mobile' => '',
'email' => $fetchedUserEmail,
'country' => '',
'registeredAt' => '',
'lastLogin' => '',
'intro' => '',
'userProfile' => ''
]);
Minha estrutura de tabela exportada é:
CREATE TABLE `users_profile` (
`id` bigint(20) NOT NULL,
`userid` int(11) NOT NULL,
`firstName` varchar(50) DEFAULT NULL,
`middleName` varchar(50) DEFAULT NULL,
`lastName` varchar(50) DEFAULT NULL,
`mobile` varchar(15) DEFAULT NULL,
`email` varchar(50) DEFAULT NULL,
`userBio` text NOT NULL,
`country` varchar(32) NOT NULL,
`registeredAt` int(11) NOT NULL,
`lastLogin` int(11) DEFAULT NULL,
`intro` tinytext DEFAULT NULL,
`userProfile` text DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci;
A chave primária é "id" na tabela, portanto, não está sendo referenciada no comando INSERT. $fetchedUserEmail (uma string de e-mail válida) e $fetchedUserID (um inteiro válido) são variáveis que contêm os valores esperados quando os exibo durante a depuração
uq_mobile
é umaunique
restrição (é o que o "uq" dentro do nome, bem como a mensagem de erro, sugere) e quando você tenta inserir um registro, você passa um valor não nulo para ele, que acaba sendo duplicado.do seu código irá inserir uma string vazia como
mobile
que terá sucesso uma vez, mas na segunda vez irá falhar. A mensagem de erro especifica claramente que você tentou inserir uma string vazia, então esse deve ter sido o motivo.A restrição protege a integridade dos seus dados, porque fica claro que um número de celular pode pertencer a uma única pessoa. Portanto, quando você tenta inserir um segundo usuário com o mesmo número de celular usado por outra pessoa, o RDBMS inferirá que algo está errado e o notificará sobre o problema.