1

私は単純な 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 ;
4

0 に答える 0