1

最初は、cfqueryparam と mysql で問題が発生していると思っていました。ただし、それらを静的な値に置き換えると、同じエラーが発生します。これは私を困惑させています。私は Microsoft SQL Server に慣れすぎていると思います。どんな助けでも大歓迎です。

クエリは次のとおりです。これは mySql クエリ ブラウザでは完全に機能しますが、cfquery で実行すると失敗します。

LOCK TABLE categories WRITE;

SELECT @myRight := rgt FROM categories WHERE catid = <cfqueryparam cfsqltype="cf_sql_integer" value="#parentCategoryId#">;

UPDATE categories SET rgt = rgt + 2 WHERE rgt > @myRight;
UPDATE categories SET lft = lft + 2 WHERE lft > @myRight;

INSERT INTO categories(categoryName, lft, rgt) VALUES(<cfqueryparam cfsqltype="cf_sql_varchar" value="#newCatName#">, @myRight, @myRight + 2);

UNLOCK TABLES;

次のエラーが表示されます。

SQL 構文にエラーがあります。使用する正しい構文については、MySQL サーバーのバージョンに対応するマニュアルを確認してください。2 行目のカテゴリ SE' を更新します

VENDORERRORCODE:1064 SQL 状態: 42000

4

2 に答える 2

1

MySQL サーバーで明示的に許可していない限り、同じ cfquery に複数の SQL ステートメントを含めることはできません。MySQL はデフォルトでこれを拒否するため、update ステートメントと insert ステートメントはそれぞれ独自の cfquery タグに含める必要があります。

于 2009-12-31T17:21:18.613 に答える
1

CFGears の言うとおりです。複数のクエリを 1 つのステートメントに入れることはできません。

cf からこれを行うには、mySQL 変数を避ける必要があります。(多かれ少なかれ標準的な SQL に固執すれば、アプリは他のブランドのテーブル サーバーに簡単に移植できるので、とにかくそれは良いことです。) myISAM テーブルを扱っている場合は、これにロック テーブルとロック解除テーブルを配置する必要があります。InnoDB を使用している場合は、トランザクションで実行すると問題なく動作します。

このようなものがうまくいくかもしれません。

<cfquery name ="getright" datasource="#whatever#">
SELECT rgt 
  FROM categories 
 WHERE catid = <cfqueryparam cfsqltype="cf_sql_integer" value="#parentCategoryId#">
</cfquery>

<cfquery name="rgt_up_2" datasource="#whatever#">
UPDATE categories 
   SET rgt = rgt + 2 
 WHERE rgt >
  (SELECT rgt 
     FROM categories 
    WHERE catid = <cfqueryparam cfsqltype="cf_sql_integer" value="#parentCategoryId#">)
</cfquery>

<cfquery name="lft_up_2" datasource="#whatever#">
UPDATE categories 
   SET lft = lft + 2 
 WHERE lft >
  (SELECT rgt 
     FROM categories 
    WHERE catid = <cfqueryparam cfsqltype="cf_sql_integer" value="#parentCategoryId#">)
</cfquery>

<cfquery name="insrgt" datasource="#whatever#">
INSERT INTO categories(categoryName, lft, rgt) VALUES(
<cfqueryparam cfsqltype="cf_sql_varchar" value="#newCatName#">,
<cfqueryparam cfsqltype="cf_sql_integer" value="#getright.rgt#">,
<cfqueryparam cfsqltype="cf_sql_integer" value="#getright.rgt#"> + 2)
</cfquery>
于 2009-12-31T17:43:33.857 に答える