プロが教えるわが家の防犯対策術!

現在、PHPでデータベースの値を利用するWEBアプリを作成しております。
一部のテーブルの値を削除するのに合わせて、
別テーブルの指定カラムを削除したいのですが、
PDOでは可能なのでしょうか。

例:テーブルAのレコード2を削除すると、
テーブルBのカラム2を削除するという流れです。

可能な場合は、サンプルサイトまたはサンプルコードを
教えてください。
不可能な場合は、PHPにて実装するためのサンプルサイトまたはサンプルコードを教えていただけませんでしょうか。

PHPのバージョンはPHP5.4でございます。
お手数ですが、ご教授いただけますと幸いでございます。
よろしくお願いいたします。

A 回答 (6件)

文字通りに捉えた場合でも,ALTER TABLE文をPDO::exec等で実行できるため,可能ではあります。


ただ,データに合わせてALTER TABLE DROP COLUMNのようなことをするなら,
RDBMS側にTriggerを定義した方がよい気もしますが……。

この回答への補足

回答いただき、ありがとうございます。
下記のように記載することによって、無事、カラムの削除を行えました。
$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, '扇風機'));

補足日時:2014/09/25 15:58
    • good
    • 0

いろんなアプリに関わってきたけど、動的にカラムを削除するシステムって出会ったことない。


まあ中にはあるのかもしれないけど、自分が設計するとしたら考えられない。

どういうリレーションとか考えてるかわからないから何とも言えないけど、
SQLを工夫したりすればいいだろうし。

カラムを削除するメリットが見つからないよ。
DBの設計ってふつうっていったらあれだけど、横(カラム数)に増やしたり減らしたりじゃなくって
縦(レコード数)にしたほうが扱いやすいよ。
    • good
    • 0

>プランで追加を行うと、商品テーブルへ追加されたプランの料金の入力枠を追加する


>プランが削除されると、商品テーブルより対象のプランの入力枠(カラム)を削除する

こんな設計はあり得ません。プランと商品をキーにして別のテーブルを作るべきです(入力してデータを作るときにinsert/updateしていく)。
    • good
    • 0

これはないわ・・・


カラムを削除しなくちゃいけない意図がわからない。
参照したときに削除されていたらエラーだらけになりますよ
運用方法が悪いので、こんなことをしないでも効率的でセキュアな運用はできると思います

そのうえで、どうしても処理したいのであれば
プレースホルダ(プリペアドステートメント)での処理はできないので
ダイレクトに変数を渡すしかないでしょう。

少しでもセキュリティをあげるためには
テーブルのカラム一覧をとって、消したいカラム名と完全一致するか
マッチさせた上で、変数を渡す・・・といった処理になるでしょう

この回答への補足

こういう使い方ってあまり一般的ではないのでしょうか。
行いたいのは、
プランテーブルと商品テーブルがございまして、
プランで追加を行うと、商品テーブルへ追加されたプランの料金の入力枠を追加する
プランが削除されると、商品テーブルより対象のプランの入力枠(カラム)を削除する
動作を考えております。
プランにidを付与してidでプランごとの料金を管理することも可能だとは思いますが、
どうなのかと思い、今回の操作に至りました。

変数への値渡しは、データベースに保管されているカラム名を元に行うようにしたいと思っております。

補足日時:2014/09/25 17:59
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
参照は、データベースの値に関しましては、
キーの行を全部取り出すため、増減が有っても
class等を自動で割り当てるため、参照エラーには
ならないように組んではおります。
カラムを削除する理由は、呼び出す側のカテゴリが削除されたのに対して、
カラム残し続けるメリットを感じないため削除を行おうと考えておりましたが、
やはり通常では考えられない現象なのでしょうか。
カラムの削除無しのパターンでも構築を考えてみます。

お礼日時:2014/09/25 17:50

>下記のように記載することによって、無事、カラムの削除を行えました。


>$sql = 'ALTER TABLE test_table DROP COLUMN num';
>$stmt = $dbh->exec($sql);

実際にカラムの削除だったのね。
それならupdateでは無理。

変数にしたければ
$sql = 'ALTER TABLE test_table DROP COLUMN ' . $targetColumn;

これでいいんでないの?

この回答への補足

aiyonoshizuku様

無事に削除することができました、
こういう使い方ってあまり一般的ではないのでしょうか。
行いたいのは、
プランテーブルと商品テーブルがございまして、
プランで追加を行うと、商品テーブルへ追加されたプランの料金の入力枠を追加する
プランが削除されると、商品テーブルより対象のプランの入力枠(カラム)を削除する
動作を考えております。
プランにidを付与してidでプランごとの料金を管理することも可能だとは思いますが、
どうなのかと思い、今回の操作に至りました。

補足日時:2014/09/25 17:58
    • good
    • 0
この回答へのお礼

ありがとうございます。
早速試してみます!

お礼日時:2014/09/25 17:51

カラムの削除って実際のカラムを削除するの?


それとも特定のカラムのデータを削除ってこと?

特定のカラムのデータってことだったら
テーブルAのレコード2のdelete文と
テーブルBのレコードのupdateを実行すればいいんじゃないの?

この回答への補足

カラムを削除します。
カテゴリが追加されるとカテゴリ用のカラムを作成し、
入力欄を追加します。
カテゴリが削除されることで、カラムを削除します。

補足日時:2014/09/25 17:45
    • good
    • 0
この回答へのお礼

回答をいただき、ありがとうございます。
update文でカラムの削除は可能でしたでしょうか。
もし、可能でしたら、サンプルをいただけますと幸いです。

お礼日時:2014/09/25 15:59

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!