database - 如何使用 ColdFusion 检查数据库的值?
问题描述
现在,我正在使用 ColdFusion 添加用户:
<cfquery name="adduser" datasource="music" dbtype="ODBC">
insert into register values('#username#','#password#')
</cfquery>
如果用户添加相同的用户名,网页将告诉用户该名称已被使用。你能告诉我如何实现这一目标吗?我只是不知道如何写 if 语句。
解决方案
稳健的方式 - 带锁。这也确保了您不能让两个人“同时”提交相同的用户名(如果他们使用的是同一个网站?)并且您最终将两者都插入。
<cfquery name="adduser">
INSERT
INTO Register(Username,Password)
OUTPUT INSERTED.Username
SELECT
<cfqueryparam cfsqltype="cf_sql_varchar" value="#Username#" />,
<cfqueryparam cfsqltype="cf_sql_varchar" value="#Password#" />
WHERE <cfqueryparam cfsqltype="cf_sql_varchar" value="#Username#" /> NOT IN (
SELECT Username
FROM Register
WITH(ROWLOCK, UPDLOCK, SERIALIZABLE)
WHERE Username = <cfqueryparam cfsqltype="cf_sql_varchar" value="#Userame#" />
)
</cfquery>
<cfif adduser.RecordCount EQ 1>
<!--- success ---->
<cfelse>
<!--- failure ---->
</cfif>
由于插入可能由于不同的原因而失败,如果你真的想确定,在失败“cfelse”中你可以添加一个查询来检查用户名是否存在。
您还应该考虑使该数据库字段唯一,因此 INSERT 将失败 - 但在这种情况下,您必须尝试捕获查询以捕获失败。
推荐阅读
- c - 是什么导致我在 C 中的通用链表中出现内存泄漏
- javascript - JS - 带有预设变量的 for 循环
- systemctl - 从 `docker run $image chroot` 命令运行时 systemctl 不起作用(仿生)
- three.js - 网格完全渲染时的 Three.js 回调
- python - 带有 OpenCV 和 PIL 的 Python Tesseract 未检测到字符
- algorithm - 用 n 个元素初始化一个有序链表的复杂度是多少?
- laravel - Laravel 8 jetsream 'user/profile' 端点在 SPA 模式下不显示名称和电子邮件(turbolinks)
- sql - SQL:如果有重复,在下一列添加注释
- keycloak - 仅从 keylcoak 用户端点返回用户的特定字段
- visual-studio - 如何取回原始 mdx 单元组