踩坑备忘,在浏览器浏览网页时,页面编译就先执行一次,然后再显示时又执行了一次,这样不管怎么浏览网页,后台先执行了一次,数据就插入了,然后页面显示又执行了一次,就会提示邮箱已经存在了。无语。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<?php
try {
$db = new SQLite3('test.db');
if (!$db) {
throw new Exception("数据库连接失败:" . $db->lastErrorMsg());
}
echo "✅ 数据库连接成功<br>";
// 创建表(代码不变)
$createTableSql = "
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
age INTEGER,
email TEXT UNIQUE,
create_time DATETIME DEFAULT CURRENT_TIMESTAMP
);
";
$result = $db->exec($createTableSql);
if ($result) {
echo "✅ 数据表创建/验证成功<br>";
} else {
throw new Exception("创建表失败:" . $db->lastErrorMsg());
}
// 要插入的数据
$name = "张三4";
$age = 254;
$email = "zhangsan@1233444example.com";
// 关键:先查询邮箱是否已存在
$checkStmt = $db->prepare("SELECT id FROM users WHERE email = :email");
$checkStmt->bindValue(':email', $email, SQLITE3_TEXT);
$checkResult = $checkStmt->execute();
$existingRow = $checkResult->fetchArray(SQLITE3_ASSOC);
if ($existingRow) {
echo "ℹ️ 邮箱 {$email} 已存在,无需重复插入(ID:{$existingRow['id']})<br>";
} else {
// 邮箱不存在,执行插入
$insertStmt = $db->prepare("INSERT INTO users (name, age, email) VALUES (:name, :age, :email)");
$insertStmt->bindValue(':name', $name, SQLITE3_TEXT);
$insertStmt->bindValue(':age', $age, SQLITE3_INTEGER);
$insertStmt->bindValue(':email', $email, SQLITE3_TEXT);
$insertResult = $insertStmt->execute();
if ($insertResult) {
$insertId = $db->lastInsertRowID();
echo "✅ 插入数据成功,ID:{$insertId}<br>";
} else {
throw new Exception("插入数据失败:" . $db->lastErrorMsg());
}
}
// 后续查询、更新等代码不变...
$querySql = "SELECT * FROM users WHERE age >= 20";
$result = $db->query($querySql);
echo "���� 查询结果:<br>";
while ($row = $result->fetchArray(SQLITE3_ASSOC)) {
echo "ID:{$row['id']},姓名:{$row['name']},年龄:{$row['age']},邮箱:{$row['email']}<br>";
}
} catch (Exception $e) {
echo "❌ 操作失败:" . $e->getMessage() . "<br>";
} finally {
if (isset($db) && $db) {
$db->close();
echo "���� 数据库连接已关闭<br>";
}
}
?>
</body>
</html>