我一直在尝试使用 cfc 组件设置一个简单的 cfstoredproc,该组件将两个参数传递给 mysql 存储过程并按查询排序。
这是测试代码:
测试.cfm
<cfset sqlN = createObject ("component","cfc.testNews")>
<cfset loadNews = sqlN.getNews(displayFrom=0, sortNewsBy="Date")>
<cfoutput query="loadNews">
#newsID#<br />
</cfoutput>
测试新闻.cfc
<cffunction name="getNews" access="public" output="false">
<cfargument name="displayFrom" type="numeric" required="true">
<cfargument name="sortNewsBy" type="string" required="true">
<cfstoredproc procedure="spGetNews" datasource="mydatabase">
<cfprocparam value="#displayFrom#" cfsqltype="cf_sql_integer">
<cfprocparam value="#sortNewsBy#" cfsqltype="cf_sql_varchar">
<cfprocresult name="qNews">
</cfstoredproc>
<cfreturn qNews>
</cffunction>
在 mysql 存储过程中,我有:
select newsID
from news
order by sortNewsBy desc limit displayFrom,25;
虽然 cf 没有抛出任何错误消息,正如我所看到的 cfprocparam,更具体地说,cfsqltype 导致了这个问题,因为它什么也没传递!?我也尝试对 .cfm 页面上的 cfquery 和 cfqueryparam 标记(而不是 cfstoredproc 和 cfc)做同样的事情,但问题仍然存在。
cfm 页面上的 cfdump 返回... order by ? 降序限制 ?,25;
我知道如何使它与 cfm 页面上的 cfquery 和 cfqueryparam 一起工作,但不知道如何处理 cfprocparam,所以是否有解决此问题的方法。我非常感谢您对此提供的帮助。
编辑 这里是整个mysql存储过程
CREATE DEFINER=`root`@`localhost` PROCEDURE `spGetNews`(in displayFrom int, sortNewsBy varchar (15))
BEGIN
select newsID
from news
order by sortNewsBy desc limit displayFrom,25;
/*In MSSQL Server IFNULL is not supported, use ISNULL instead*/
END
编辑1:
<cffunction name="GetNews" access="public" output="false">
<cfargument name="DBcolumn" type="string" required="true">
<cfargument name="sort" type="string" required="true">
<cfset whiteList=("newsDate,viewCount")>
<cfif listfindnocase(whiteList,arguments.DBcolumn)>
<cfset DBcolumn=arguments.DBcolumn>
<cfelse>
<cfset DBcolumn="newsDate">
</cfif>
<cfstoredproc procedure="spGetNews" datasource="mydatabasse">
<cfprocparam value="#DBcolumn#" cfsqltype="cf_sql_varchar">
<cfprocparam value="#arguments.sort#" cfsqltype="cf_sql_varchar">
<cfprocresult name="qNews">
</cfstoredproc>
<cfreturn qPosts>
</cffunction>
mysql存储过程
DELIMITER //
CREATE PROCEDURE spGetNews(in DBcolumn varchar(50),in sort varchar(5))
BEGIN
SET @DBcolumn := DBcolumn;
SET @sort := sort;
SET @query := CONCAT('SELECT newsID from news ORDER BY ', @DBcolumn,'',@sort);
PREPARE statement FROM @query;
EXECUTE statement;
DEALLOCATE PREPARE statement;
END //
DELIMITER ;