1

再帰機能で多段メニューからカテゴリを削除したい。状況をより注意深く理解するために、最初に mysql テーブル構造を見てみましょう

CREATE TABLE IF NOT EXISTS menu(
id INT(5) NOT NULL AUTO_INCREMENT PRIMARY KEY,
p_id INT(5),
sort_id INT(5) NOT NULL,
title VARCHAR(50) CHARSET utf8 COLLATE 'utf8_unicode_ci' NOT NULL,
);

取り出すとこんな感じ

  id  |  p_id  |  sort_id  | title  |

   1  |    0   |     1     | root1  |
   2  |    1   |     1     |  sub of root1
   3  |    0   |     2     | root2  |
   4  |    2   |     1     |  sub of "sub of root1"
  ... |  ...   |    ...    |   ....
etc ...

カテゴリを削除するためのphpスクリプトを作成しました。ここにあります=>

function del_cat($connection,$id){
        if (!$connection->connect_errno){
        if ($connection->set_charset("utf8")){
            if ($r = $connection->query("SELECT id FROM menu WHERE p_id=" . $id . "")){
            if ($r->num_rows>0){
                while ($row = $r->fetch_assoc()){
                del_cat($connection,$row['id']);
                }
            } else {
                $connection->query("DELETE FROM menu WHERE id=" . $id . "");
            }
            $r->free();
            }
        }
        }
    }

$connection変数は単なる mysql 接続オブジェクトであり$ididテーブルにあります。

たとえば、 1行を削除している場合(つまり、カテゴリに子、サブカテゴリがない場合)は問題なく機能しますが、1 | 0 | 1 | root1 |たとえば削除したい場合、4 | 2 | 1 | sub of "sub of root1"サブカテゴリのあるカテゴリは削除されません。この問題を解決する方法はありますか? ありがとう

4

1 に答える 1

1

削除はインのみでelseあるため、実際に親カテゴリを削除することはありません。次のようなものが必要だと思います:

   del_cat($connection, $row['id']);
   $connection->query("DELETE ...");
} else {
   $connection->query("DELETE ...");

ところで、ID 入力をエスケープする必要があります。

于 2012-08-17T16:03:20.780 に答える