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() 作为值,它将起作用。 我认为更广泛的一点是他应该插入一个日期时间对象,而不是一个字符串。也就是说,createODBCDateTime
和now()
都返回一个日期对象,所以它们都可以与cfsqltype="cf_sql_timestamp"
一起使用。 (虽然从技术上讲 createODBCDateTime(now())
是多余的。)【参考方案2】:
说明:
暂时忽略最佳做法,原始查询存在几个问题。
第一个潜在问题是Time
is a reserved word,使其成为列名的错误选择。 IIRC,使用保留字作为对象名称是您看到的错误的原因之一。如果是这种情况,您可以选择:
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 认为值“7+”是一个有效的整数值,我如何验证它不是?
如何在coldfusion cfc中接收JSON POST请求