- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在制作一个注册页面。我担心两个用户同时使用相同用户名注册的并发问题(知道这种情况很少见,但讨厌代码中的小缺陷)。
所以我的做法是,检查用户名是否存在,如果不存在,则插入一个新行。我正在使用 PDO
我尝试过的
我正在使用交易,但从我这里的问题 How exactly do transactions with PHP PDO work with concurrency?貌似两个事务可以同时读取
select...for update
因为我没有更新;事实上,我需要锁定将添加新条目的“假想”行,如果它不存在的话解决方案?
我用谷歌搜索并在用户名字段上添加了一个 UNIQUE
约束,但不想依赖 MySQL 错误来回滚事务。我不是专家,但它对我来说并不优雅。 那么有没有办法用纯 MySQL insert if not exists
?
现在,如果这真的是要走的路,我有几个问题。 如果抛出警告,是否会停止查询?比如它会抛出此处示例中显示的异常 PHP + MySQL transactions examples ?还是只有彻头彻尾的错误才会抛出异常?
还有,这里好像暗示Can I detect and handle MySQL Warnings with PHP?警告会以某种方式显示在 PHP 输出中,但我从未遇到过“可见的 MySQL 错误”。问题不是像我的代码中那样使用 PDO,但我只是想知道。 MySQL错误和警告是否输出html?或者它是否只在我调用 errorInfo()
时才说些什么?
谢谢
最佳答案
更新
If I had two unique fields, and did not want to allow either one to be null (since I know I could set one table to "null-able" and have two queries), is there a way to check which one messed up? Like I want to let the user know if username or email was taken. If I do a single insert, I won't know which one failed
And furthermore, if I have two statements (first insert username, check if failed, then try same for email), I can only detect one error at a time; if the username fails and rolls back, I cannot try to do the same for the email (well it would be redundantish, because even if the email exists I would have to check to see if the first query had failed) Edit: Think it can work if I use nested try...catch statements
我觉得你想多了。您可以为每个错误向用户显示不同的错误,但您实际上一次只能检测到一个错误,因为 mysql 只会在遇到第一个问题时给您一条错误消息。假设前面的查询(一次插入所有值):
try {
$stmt = $db->prepare($sql);
$stmt->execute(array(
':username' => $username,
':email' => $email,
':password' => $password
));
$db->commit();
} catch (PDOException $e) {
$db->rollBack();
if($e->getCode() == 23000) {
// lets parse the message
if(false !== strpos('email', $e->getMessage())) {
echo 'Email "'. $email . '" already exists';
} else if(false !== strpos('username', $e->getMessage()) {
echo 'Username "'. $username .'" taken';
}
} else {
// not a dupe key rethrow error
throw $e;
}
}
现在的问题是错误消息看起来像这样:
键 THE_KEY_NAME 的重复条目“THE_VALUE_YOU_TRIED_TO_INSERT”
获得更有意义的关于它是哪一列的报告的方法是在创建表时用有意义的东西命名索引,例如:
CREATE TABLE the_table (
`id` integer UNSIGNED NOT NULL AUTO_INCREMENT
`username` varchar(30),
`email` varchar(100),
`password` varchar(32),
PRIMARY KEY (`id`),
UNIQUE KEY `uk_email` (`email`),
UNIQUE KEY `uk_username` (`username`)
);
所以现在您的错误消息将如下所示:
key uk_username 的重复条目“THE_VALUE_YOU_TRIED_TO_INSERT”
或
key uk_email 的重复条目“THE_VALUE_YOU_TRIED_TO_INSERT”
这很容易解析。
这样做的唯一真正替代方法是在插入之前对表进行选择,以确保值不存在。
如果您使用的是 PDO,则不应有 PHP 警告...只是异常,如果未被捕获,将生成标准的 PHP 错误。如果您关闭了 display_errors
,那么它不会输出到屏幕,只会输出到错误日志。
我不认为有办法insert if not exists
所以你回到使用唯一键然后捕获异常:
$db = new PDO($dsn, $user, $pass);
$sql = "INSERT INTO the_table (username, email, etc) VALUES (:username,:email,:password)";
$db->beginTransaction();
try {
$stmt = $db->prepare($sql);
$stmt->execute(array(
':username' => $username,
':email' => $email,
':password' => $password
));
$db->commit();
} catch (PDOException $e) {
$db->rollBack();
if($e->getCode() == 23000) {
// do something to notify username is taken
} else {
// not a dupe key rethrow error
throw $e;
}
}
关于php - Mysql insert if not exists without unique constraint(不想依赖回滚错误)(PHP + PDO),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11171973/
我正在查看 SQL Server 2008 的 AdventureWorks 示例数据库,我在他们的创建脚本中看到他们倾向于使用以下内容: ALTER TABLE [Production].[Prod
我目前正在使用 PostgreSQL 9.5,想知道是否有可能在 ON CONFLICT ON CONSTRAINT 语句中包含 2 个约束的名称。我的sql如下 INSERT INTO LIVE.T
使用 htmlhelpers 可以限制你的助手将绑定(bind)到什么类型 public static HtmlString DatePicker(this HtmlHelper html,
我使用的是 Symfony 2.5,我的 Model 类如下: /** * @UserAssert\UserPasswordReset */ class ResetPassword { /** *
我有 3 个 View :A、B、C。 (A 和 B 的高度相等)开始时 B 的可见性消失,C 的顶部约束是 A 的底部,因此 C 出现在 A 下方。一段时间后,我将 A 的可见性更改为消失,将 B
在 Dojo NumberTextBox 的文档中,措辞引用了“Dojo 约束语言”,甚至包括有用的 link .不幸的是,链接指向的页面仅显示 this document has been depr
在我的表中,我有一个唯一的约束。在 hibernate 中,当我添加一个违反该约束的项目时,我想捕获它,因此它将更新而不是创建一个项目。 当我没有设置 try-catch block 时 up
我正在尝试在“或”UILabel 附近添加两条 1 像素线(由 UIViews 组成)。 除了我从 Interface Builder 中的第一张图片收到警告外,一切看起来都很好并且按预期工作: Le
我已经开始学习安卓了。我正在尝试使用 Google Map API。每次我尝试启动我的应用程序时,它都会崩溃,经过调查,我在 build.gradle 文件中发现了一个通知。 Please refer
我有自定义约束: @Target({FIELD, METHOD}) @Retention(RetentionPolicy.RUNTIME) @ConstraintComposition(Composi
我正在将 Graphql 服务器与 Prisma 一起使用。但是当我尝试运行代码时出现此错误我正在使用 const { GraphQLServer } = require('graphql-yoga'
更新到 com.android.support.constraint:constraint-layout:1.1.0 之后 约束布局崩溃说: All children of constraint la
我在 Xcode 10 中工作,在尝试向我的 View 添加一些非常简单的约束时遇到了一些错误。 我有一个 UICollectionViewCell,我正在向其添加一个 UIStackView。我调整
尝试在 Laravel 上创建一个待办事项列表应用程序,但是当我尝试单击按钮创建一个新的待办事项列表时,出现此错误: SQLSTATE[23000]: Integrity constraint vio
我正在编写一个基于网格的 View ,使用以下代码动态添加 NSLayoutConstraints for (x, column) in enumerate(board) { for (y,
我正在尝试使用 Constraint composition并希望为每个复合约束定义组,如下例所示:- 复合约束 @Target({ ElementType.FIELD, Elemen
我有一些添加了外键约束的表。它们与代码生成一起使用,以在生成的存储过程中设置特定的联接。 是否可以通过在事务中调用多个删除来覆盖这些约束,特别是 C# 中的“TransactionScope”,或者绝
我需要向现有 SQL Server 表添加约束,但前提是该表尚不存在。 我使用以下 SQL 创建约束。 ALTER TABLE [Foo] ADD CONSTRAINT [FK_Foo_Bar] FO
这是我的总输出: Executing SQL script in server ERROR: Error 1215: Cannot add foreign key constraint CREATE
我正在增加 Facebook SDK 登录按钮 (FBSDKLoginButton) 的大小。 Facebook SDK 源代码向 FBSDKLoginButton 添加了一个约束,height =
我是一名优秀的程序员,十分优秀!