Database 如何使用ColdFusion检查数据库的值?

Database 如何使用ColdFusion检查数据库的值?,database,coldfusion,coldfusion-2018,Database,Coldfusion,Coldfusion 2018,现在,我使用ColdFusion添加用户: <cfquery name="adduser" datasource="music" dbtype="ODBC"> insert into register values('#username#','#password#') </cfquery> 如果用户添加相同的用户名,网页将告诉用户该名称已被使用。你能告诉我如何做到这一点吗?我只是不知道如何写if语句 查询具有相同用户名的所有用户,就像为了性能目的而要保存的用户

现在,我使用ColdFusion添加用户:

<cfquery name="adduser" datasource="music" dbtype="ODBC">

    insert into register values('#username#','#password#')
</cfquery>
如果用户添加相同的用户名,网页将告诉用户该名称已被使用。你能告诉我如何做到这一点吗?我只是不知道如何写if语句

查询具有相同用户名的所有用户,就像为了性能目的而要保存的用户一样,最多需要1行来证明它已经存在:

<cfquery name="checkuseralreadythere" datasource="music">
   SELECT username 
   FROM   register 
   WHERE  username = <cfqueryparam cfsqltype="cf_sql_varchar" 
                        value="#username#"> 
  LIMIT 1
</cfquery>
检查结果的程序逻辑

<cfif checkuseralreadythere.recordcount GTE 1>
   <!--- user is already there --->
   Username is already taken. please enter an other username.
   <cflocation url="samepage.cfm?err=1">
    ...do more stuff...
<cfelse>
   <!--- user is not there yet --->
   <cfquery name="adduser" datasource="music">
      INSERT INTO register 
      VALUES (
           <cfqueryparam cfsqltype="cf_sql_varchar" 
                        value="#username#"> 
           , <cfqueryparam cfsqltype="cf_sql_varchar" 
                        value="#password#">
       )
   </cfquery>
   ...do more stuff...
</cfif>

健壮的方式-带锁。 这也确保了你不能让两个人同时提交相同的用户名,如果他们使用相同的网站?最后你会同时插入这两个

<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>
由于插入可能会由于不同的原因而失败,如果您确实希望确定,那么可以在failure cfelse中添加一个查询来检查用户名是否存在


你还应该考虑使DB字段唯一,这样插入就会失败。但是在这种情况下,你必须抓紧查询来捕捉失败。

对不起,应该是:插入登记值的用户名,“密码”,你需要选择用户名的计数,用户名=用户名,但是确保你使用的安全。现在,您很容易受到SQL注入的攻击,如果两个会话试图同时插入相同的数据,SQL注入将无法工作。而且它很容易被阻塞。如果SQL违反该约束,您可以捕获它返回的错误,但随后您将尝试添加用户名。如果这是数据库中的一个要求,那么您还需要在数据库中有一个显式约束。或者有很多其他方法可以在插入之前验证用户名。但我更担心的是,1您肯定想使用queryparams来防止SQL注入,2 password似乎表示您正在存储明文密码。这是一个非常非常糟糕的主意。即使是一个简单的网站。除了用户之外,任何人都不应该知道用户的密码。有大量资源用于安全密码存储和验证。关于会话的观点很好。与此问题无关,但dbtype=odbc在最新版本中已被弃用。如中所述,该方法的问题在于它不是线程安全的。如果多个请求同时命中代码块(这迟早会发生),它不会阻止重复的用户名。