尽管我尝试调试它,但我无法解决这个致命错误——问题是 mySQL Insert 语句
错误是:
致命错误:未捕获的 PDOException:SQLSTATE[23000]:完整性约束违规:1062 /home/path/public_html/signupvalidate.php:51 中键“uq_mobile”的重复条目“”堆栈跟踪:#0 /home/path/path/signupvalidate.php(51):PDOStatement->execute(Array) #1 {main} 在 /home/path/path/signupvalidate.php 第 51 行中抛出
'uq_mobile' 是什么?这不是我的代码或 mySQL 数据库或表设置中的任何短语
插入语句为:
$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' => ''
]);
我导出的表结构是:
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;
表中的主键是“id”,因此它未在 INSERT 命令中被引用。$fetchedUserEmail(有效的电子邮件字符串)和 $fetchedUserID(有效的整数)都是变量,当我在调试期间输出它们时,它们包含预期的值
uq_mobile
是一个unique
约束(这就是其名称中的“uq”以及错误消息所暗示的),并且一旦您尝试插入一条记录,您就会向其传递一个非空值,而该值最终会被重复。您的代码将插入一个空字符串,因为
mobile
第一次会成功,但第二次会失败。错误消息清楚地表明您试图插入一个空字符串,因此这一定是原因。该约束可以保护您的数据完整性,因为很明显一个手机号码可能属于一个人,所以当您尝试插入第二个用户并使用与另一个用户相同的手机号码时,RDBMS 就会推断出出现了问题并通知您有关问题。