私は単純な cfstoredproc を cfc コンポーネントで設定しようとしました。これは、2 つのパラメーターを mysql ストアド proc に渡し、クエリごとに並べ替えます。
テストコードは次のとおりです。
test.cfm
<cfset sqlN = createObject ("component","cfc.testNews")>
<cfset loadNews = sqlN.getNews(displayFrom=0, sortNewsBy="Date")>
<cfoutput query="loadNews">
#newsID#<br />
</cfoutput>
testNews.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 storedproc には次のものがあります。
select newsID
from news
order by sortNewsBy desc limit displayFrom,25;
cfprocparamを見ることができるので、cfはエラーメッセージをスローしませんが、より具体的には、cfsqltypeは何も渡さないため問題を引き起こしています!? また、(cfstoredproc と cfc の代わりに) .cfm ページの cfquery と cfqueryparam タグで同じことを試みましたが、問題は解決しません。
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
EDIT1:
<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 ;