- ベストアンサー
PHP PDOを利用してカラムの削除は可能ですか
- PHPでデータベースの値を利用するWEBアプリを作成していますが、一部のテーブルの値を削除する際に、別テーブルの指定カラムを削除したいです。PHP PDOを使用してカラムの削除は可能でしょうか。
- 具体的には、テーブルAのレコードを削除すると、テーブルBのカラムも削除したいと考えています。PHPのバージョンはPHP5.4です。
- 可能な場合は、サンプルサイトまたはサンプルコードを教えていただけると嬉しいです。不可能な場合は、PHPで実装するためのサンプルサイトまたはサンプルコードを教えていただけますか。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
文字通りに捉えた場合でも,ALTER TABLE文をPDO::exec等で実行できるため,可能ではあります。 ただ,データに合わせてALTER TABLE DROP COLUMNのようなことをするなら, RDBMS側にTriggerを定義した方がよい気もしますが……。
その他の回答 (5)
- Taiyonoshizuku
- ベストアンサー率37% (183/489)
いろんなアプリに関わってきたけど、動的にカラムを削除するシステムって出会ったことない。 まあ中にはあるのかもしれないけど、自分が設計するとしたら考えられない。 どういうリレーションとか考えてるかわからないから何とも言えないけど、 SQLを工夫したりすればいいだろうし。 カラムを削除するメリットが見つからないよ。 DBの設計ってふつうっていったらあれだけど、横(カラム数)に増やしたり減らしたりじゃなくって 縦(レコード数)にしたほうが扱いやすいよ。
- agunuz
- ベストアンサー率65% (288/438)
>プランで追加を行うと、商品テーブルへ追加されたプランの料金の入力枠を追加する >プランが削除されると、商品テーブルより対象のプランの入力枠(カラム)を削除する こんな設計はあり得ません。プランと商品をキーにして別のテーブルを作るべきです(入力してデータを作るときにinsert/updateしていく)。
- yambejp
- ベストアンサー率51% (3827/7415)
これはないわ・・・ カラムを削除しなくちゃいけない意図がわからない。 参照したときに削除されていたらエラーだらけになりますよ 運用方法が悪いので、こんなことをしないでも効率的でセキュアな運用はできると思います そのうえで、どうしても処理したいのであれば プレースホルダ(プリペアドステートメント)での処理はできないので ダイレクトに変数を渡すしかないでしょう。 少しでもセキュリティをあげるためには テーブルのカラム一覧をとって、消したいカラム名と完全一致するか マッチさせた上で、変数を渡す・・・といった処理になるでしょう
お礼
ご回答ありがとうございます。 参照は、データベースの値に関しましては、 キーの行を全部取り出すため、増減が有っても class等を自動で割り当てるため、参照エラーには ならないように組んではおります。 カラムを削除する理由は、呼び出す側のカテゴリが削除されたのに対して、 カラム残し続けるメリットを感じないため削除を行おうと考えておりましたが、 やはり通常では考えられない現象なのでしょうか。 カラムの削除無しのパターンでも構築を考えてみます。
補足
こういう使い方ってあまり一般的ではないのでしょうか。 行いたいのは、 プランテーブルと商品テーブルがございまして、 プランで追加を行うと、商品テーブルへ追加されたプランの料金の入力枠を追加する プランが削除されると、商品テーブルより対象のプランの入力枠(カラム)を削除する 動作を考えております。 プランにidを付与してidでプランごとの料金を管理することも可能だとは思いますが、 どうなのかと思い、今回の操作に至りました。 変数への値渡しは、データベースに保管されているカラム名を元に行うようにしたいと思っております。
- Taiyonoshizuku
- ベストアンサー率37% (183/489)
>下記のように記載することによって、無事、カラムの削除を行えました。 >$sql = 'ALTER TABLE test_table DROP COLUMN num'; >$stmt = $dbh->exec($sql); 実際にカラムの削除だったのね。 それならupdateでは無理。 変数にしたければ $sql = 'ALTER TABLE test_table DROP COLUMN ' . $targetColumn; これでいいんでないの?
お礼
ありがとうございます。 早速試してみます!
補足
aiyonoshizuku様 無事に削除することができました、 こういう使い方ってあまり一般的ではないのでしょうか。 行いたいのは、 プランテーブルと商品テーブルがございまして、 プランで追加を行うと、商品テーブルへ追加されたプランの料金の入力枠を追加する プランが削除されると、商品テーブルより対象のプランの入力枠(カラム)を削除する 動作を考えております。 プランにidを付与してidでプランごとの料金を管理することも可能だとは思いますが、 どうなのかと思い、今回の操作に至りました。
- Taiyonoshizuku
- ベストアンサー率37% (183/489)
カラムの削除って実際のカラムを削除するの? それとも特定のカラムのデータを削除ってこと? 特定のカラムのデータってことだったら テーブルAのレコード2のdelete文と テーブルBのレコードのupdateを実行すればいいんじゃないの?
お礼
回答をいただき、ありがとうございます。 update文でカラムの削除は可能でしたでしょうか。 もし、可能でしたら、サンプルをいただけますと幸いです。
補足
カラムを削除します。 カテゴリが追加されるとカテゴリ用のカラムを作成し、 入力欄を追加します。 カテゴリが削除されることで、カラムを削除します。
補足
回答いただき、ありがとうございます。 下記のように記載することによって、無事、カラムの削除を行えました。 $sql = 'ALTER TABLE test_table DROP COLUMN num'; $stmt = $dbh->exec($sql); 下記、insert文のような形式でカラム名を変数で渡すことは可能でしょうか。 $sql = 'insert into shouhin (id, name) values (?, ?)'; $stmt = $dbh->prepare($sql); $flag = $stmt->execute(array(6, '扇風機'));