Coldfusion输入表格和时间

Posted

技术标签:

【中文标题】Coldfusion输入表格和时间【英文标题】:Coldfusion Input Form & Time 【发布时间】:2014-01-02 07:15:03 【问题描述】:

为什么没有时间插入数据库。它给了我这个错误。

“执行数据库查询时出错。 [Macromedia][SequeLink JDBC Driver][ODBC Socket][Microsoft][ODBC Microsoft Access Driver] INSERT INTO 语句中的语法错误。

资源: 启用稳健异常信息以提供有关错误来源的更多详细信息。在 Administrator 中,单击 Debugging & Logging > Debug Output Settings,然后选择 Robust Exception Information 选项。 检查 ColdFusion 文档以验证您使用的语法是否正确。 搜索知识库以找到问题的解决方案。

浏览器 Mozilla/5.0(兼容;MSIE 9.0;Windows NT 6.2;Trident/7.0) 远程地址 127.0.0.1 推荐人//localhost:8500/Travel/toursInsert.cfm?APTANA_NOCACHE_1388693909596=1388693909596 日期/时间 02-Jan-14 03:18 PM"

<div id="InputForm">
 <cfset todayDateTime = Now()> 
 <cfform name="insertComments" id="insertComments">
    <fieldset>
            <label for="Remarks">Remarks<br />
            </label>
            <cftextarea name="Remarks" cols="55" rows="4" label="Tour Description" required="yes" validateat="OnSubmit" message="Please enter your comment here" enabled="no"></cftextarea>
          </p>
          <p>
            <label for="Users">Submitters Name</label>
            <br />
            <cfinput type="text" name="Users" message="Please enter your name here." validateat="onSubmit" required="yes" id="Name" size="10" maxlength="60">
          </p>
            <p>
            <label for="Image_ID">Image ID</label>
            <br />
            <cfinput type="text" name="Image_ID" message="Please enter Image_ID Number Here." validateat="onSubmit" required="yes" id="Image_ID" size="10" maxlength="60">
          </p>
        <p>
            <cfinput type="submit" name="insertComments" value="Insert Comments" id="submit">
        </p>
    </fieldset>
</cfform>

  <cfif IsDefined("form.InsertComments")>
                    <cfquery datasource="AccessTest">
                    INSERT INTO CommentsDB (Remarks, Users, Image_ID, Time)
                 VALUES ('#form.Remarks#','#form.Users#','#form.Image_ID#',#DateTimeFormat(todayDateTime, "yyyy.MM.dd hh:nn aaa")#)
                    </cfquery></cfif>

</div>

【问题讨论】:

如果 access 有返回当前日期和时间的内容,请在查询中使用它并忘记从 ColdFusion 传递该特定值。 首先,您应该在查询中使用cfqueryparam。其次,您为什么使用 Access?有更好的解决方案,例如 mysql 和 PostgreSQL,它们是免费的、更强大的,也是更好的选择。 #now()#替换#DateTimeFormat(todayDateTime, "yyyy.MM.dd hh:nn aaa")#并测试它。 Access有一个可以获取当前日期时间的功能。 ***.com/questions/2136552/… 1) 请发布完整的错误消息,包括生成的 SQL 2) Time 列的数据类型是什么:varchar 或 datetime?此外,Time 是列名的错误选择,因为它是 typically a reserved word。如果未正确转义,将其用作对象名称可能会导致语法错误。 【参考方案1】:

您需要以 odbc 日期时间格式为 Access 提供日期。

与其使用日期格式,不如尝试使用 createodbcdatetime()

您还应该对插入语句中的每个值使用 cfqueryparam 作为传递到数据库的值的最终验证。带有日期时间 SQL 类型的 cfqueryparam 将使处理日期和时间变得更容易。

【讨论】:

createodbcdatetime() 不是必需的。如果您在查询参数中使用 now() 作为值,它将起作用。 我认为更广泛的一点是他应该插入一个日期时间对象,而不是一个字符串。也就是说,createODBCDateTimenow() 都返回一个日期对象,所以它们都可以与cfsqltype="cf_sql_timestamp" 一起使用。 (虽然从技术上讲 createODBCDateTime(now()) 是多余的。)【参考方案2】:

说明:

暂时忽略最佳做法,原始查询存在几个问题。

第一个潜在问题是Time is a reserved word,使其成为列名的错误选择。 IIRC,使用保留字作为对象名称是您看到的错误的原因之一。如果是这种情况,您可以选择:

重命名列以完全避免冲突(最佳选择).. 或 Escape the column name with square brackets,即INSERT INTO ( [Time], ...)

#DateTimeFormat(todayDateTime, "yyyy.MM.dd hh:nn aaa")#

其次,您似乎在插入一个 string 而不使用引号。原始字符串值必须用引号括起来。否则,数据库会将值解释为某种类型的对象(表名、列名等),从而导致语法错误。

第三,无论如何,您都不应该将字符串插入日期/时间列。日期字符串不明确,可能会根据数据库设置被误解。因此,即使查询成功,您最终也可能会插入错误的日期。为了获得一致的结果,请改用日期 objects。例如,您可以使用 CF now() 函数:

注意:日期对象应该用引号括起来

    INSERT INTO TableName ( SomeDateTimeColumn )
    VALUES ( #now()# )

推荐:

但是,说了这么多……不建议在查询中使用原始值。相反,您应该将cfqueryparam 与所有查询参数一起使用。它提供了许多重要的好处,其中最重要的是保护您的数据库免受 sql 注入。 (另外,你不必担心讨厌的引用问题)

将以上所有提示放在一起,您的查询应该如下所示。我将由您来更新cfsqltypes 以匹配您的表列的数据类型。

   <cfquery datasource="AccessTest">
      INSERT INTO CommentsDB (Remarks, Users, Image_ID, YourTimeColumnName )
      VALUES  
      (
         <cfqueryparam value="#form.Remarks#" cfsqltype="cf_sql_longvarchar">
         , <cfqueryparam value="#form.Users#" cfsqltype="cf_sql_varchar">
         , <cfqueryparam value="#form.Image_ID#" cfsqltype="cf_sql_integer">
         , <cfqueryparam value="#now()#" cfsqltype="cf_sql_timestamp">
      )
   </cfquery>

【讨论】:

检测到以“CF”开头的标签。此版本的 ColdFusion 不支持此标签。请验证您的拼写错误并重试。未知标签:cfquerparam。 ColdFusion 无法确定如何处理标记 cfquerparam,因为该标记未知且不在任何导入的标记库中。标签名称可能拼写错误。 备注- LongText、Users- ShortText、Image_ID- Number、Field1- Date/Time 糟糕,cfqueryparam 显然是一个错字。至于数据类型,我与 Access 术语脱节,但我的猜测是 longText=>memo、shortText=>text。只需搜索“ColdFusion cfqueryparam MS Access”。我很久以前写过一个旧类型矩阵。 很高兴它有帮助。我记得一个人提到 longText/memo 字段的 sql 类型取决于您的 DSN 是否使用 unicode 驱动程序。所以一定要考虑到这一点。此外,考虑现在而不是以后切换到企业数据库,如 SQL Server。除了获得的好处之外,更早的切换将需要更少的查询重写。如果你对 MS 数据库比较熟悉,SQL Server 在很多方面都是类似的。快捷版和Management Studio IDE 是免费的,而且非常易于使用。【参考方案3】:

您是否在 cfadministrator 中创建了数据源? 如果是的话应该可以解决

<cfif IsDefined("form.InsertComments")>
   <cfquery datasource="AccessTest">
       INSERT INTO CommentsDB (Remarks, Users, Image_ID, Time)
       VALUES (
          <cfqueryparam value="#form.Remarks#"/>,
          <cfqueryparam value="#form.Users#"/>,
          <cfqueryparam value="#form.Image_ID#"/>,
          <cfqueryparam value="#DateTimeFormat(now(),'mmm-dd-yyyy')#")/>
   </cfquery>
</cfif>

【讨论】:

他得到的错误是语法错误。如果是数据源问题,他将收到的错误将完全不同。 这个插入只做日期,不做日期时间 1) 始终使用cfqueryparam 指定cfsqltype。否则你会失去很多好处。 2) 如果目标是日期/时间列,则应使用日期 objects 而不是字符串。

以上是关于Coldfusion输入表格和时间的主要内容,如果未能解决你的问题,请参考以下文章

Coldfusion 中的多步骤表单都有哪些最佳实践?

为啥 ColdFusion 认为值“7+”是一个有效的整数值,我如何验证它不是?

Coldfusion - 向Excel电子表格添加复选框

如何在coldfusion cfc中接收JSON POST请求

如何在ColdFusion 2016中动态设置电子表格自动过滤器?

两个表查询(SQL 和 ColdFusion)中的匹配值