1

我一直在尝试使用 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 ;
4

0 回答 0