0

http://dev.mysql.com/tech-resources/articles/hierarchical-data.html

LOCK TABLE nested_category WRITE;

SELECT @myLeft := lft FROM nested_category

WHERE name = '2 WAY RADIOS';

UPDATE nested_category SET rgt = rgt + 2 WHERE rgt > @myLeft;
UPDATE nested_category SET lft = lft + 2 WHERE lft > @myLeft;

INSERT INTO nested_category(name, lft, rgt) VALUES('FRS', @myLeft + 1, @myLeft + 2);

UNLOCK TABLES;

$this->db->query() を介して codeigniter でこのサンプル コードを実行しようとしましたが、このエラーが発生します

A Database Error Occurred

Error Number: 1064

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'LOCK TABLE nested_category WRITE; SELECT @myLeft := lft FROM nested_category WHERE name = '2 WAY RADIOS';' at line 3

LOCK TABLE nested_category WRITE; SELECT @myLeft := lft FROM nested_category WHERE name = '2 WAY RADIOS'; UPDATE nested_category SET rgt = rgt + 2 WHERE rgt > @myLeft; UPDATE nested_category SET lft = lft + 2 WHERE lft > @myLeft; INSERT INTO nested_category(name, lft, rgt) VALUES('FRS', @myLeft + 1, @myLeft + 2); UNLOCK TABLES;

この SQL を phpmyadmin で実行したところ、問題なく動作したため、データベースに問題はないと確信しています。しかし、コードを介して実行すると、エラーが発生します。これはコードイグナイターの問題でしょうか? ファイルのエンコーディングの問題ですか? query() 関数は一度に複数のクエリをサポートしていますか? 私は困惑しています。

4

2 に答える 2

0

実際にはそうではありません。MySQLのほとんどのユーザーフロントエンドは、入力した複数のSQLクエリを分割し、それらを1つずつ送信するため、気づかなかったかもしれません。

各クエリを独自のquery()呼び出しに分割する必要があり、各query()が同じMySQL接続/セッションで呼び出されると想定して期待どおりに機能します。

別の注意点として、MySQL 5.0以降を使用している場合は、テーブルを手動でロック/ロック解除する代わりに、トランザクションを使用できます。LOCK TABLE nested_category WRITEBEGINに置き換えるだけですUNLOCK TABLESCOMMIT

于 2010-12-14T17:32:56.180 に答える
0

codeigniter についてはわかりませんが、php でこれらのクエリを実行すると、「mysqli」オブジェクトを使用して、mysqli_multi_query()関数を使用して複数のクエリを実行できます。

個人的には、自分用に小さな関数を書きました。

// $queries should be an array of strings (individual queries).
private function multi_query($queries) {
    foreach ($queries as $i=>$q) {
        $results[] = mysql_query($q, $this->con);
    }
    return $results;
}

「BEGIN」クエリを先頭に追加し、「COMMIT」クエリを配列に追加するように簡単に書くことができます (MySQL 5.0 + を使用している場合)。これにより、すべてのクエリが順番に実行されるようになります。

于 2011-03-23T20:31:39.717 に答える