PHP PDOを利用してカラムの削除は可能ですか

このQ&Aのポイント
  • PHPでデータベースの値を利用するWEBアプリを作成していますが、一部のテーブルの値を削除する際に、別テーブルの指定カラムを削除したいです。PHP PDOを使用してカラムの削除は可能でしょうか。
  • 具体的には、テーブルAのレコードを削除すると、テーブルBのカラムも削除したいと考えています。PHPのバージョンはPHP5.4です。
  • 可能な場合は、サンプルサイトまたはサンプルコードを教えていただけると嬉しいです。不可能な場合は、PHPで実装するためのサンプルサイトまたはサンプルコードを教えていただけますか。
回答を見る
  • ベストアンサー

PHP PDOを利用してカラムの削除は可能ですか

現在、PHPでデータベースの値を利用するWEBアプリを作成しております。 一部のテーブルの値を削除するのに合わせて、 別テーブルの指定カラムを削除したいのですが、 PDOでは可能なのでしょうか。 例:テーブルAのレコード2を削除すると、 テーブルBのカラム2を削除するという流れです。 可能な場合は、サンプルサイトまたはサンプルコードを 教えてください。 不可能な場合は、PHPにて実装するためのサンプルサイトまたはサンプルコードを教えていただけませんでしょうか。 PHPのバージョンはPHP5.4でございます。 お手数ですが、ご教授いただけますと幸いでございます。 よろしくお願いいたします。

noname#202682
noname#202682
  • PHP
  • 回答数6
  • ありがとう数8

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

文字通りに捉えた場合でも,ALTER TABLE文をPDO::exec等で実行できるため,可能ではあります。 ただ,データに合わせてALTER TABLE DROP COLUMNのようなことをするなら, RDBMS側にTriggerを定義した方がよい気もしますが……。

noname#202682
質問者

補足

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

その他の回答 (5)

回答No.6

いろんなアプリに関わってきたけど、動的にカラムを削除するシステムって出会ったことない。 まあ中にはあるのかもしれないけど、自分が設計するとしたら考えられない。 どういうリレーションとか考えてるかわからないから何とも言えないけど、 SQLを工夫したりすればいいだろうし。 カラムを削除するメリットが見つからないよ。 DBの設計ってふつうっていったらあれだけど、横(カラム数)に増やしたり減らしたりじゃなくって 縦(レコード数)にしたほうが扱いやすいよ。

  • agunuz
  • ベストアンサー率65% (288/438)
回答No.5

>プランで追加を行うと、商品テーブルへ追加されたプランの料金の入力枠を追加する >プランが削除されると、商品テーブルより対象のプランの入力枠(カラム)を削除する こんな設計はあり得ません。プランと商品をキーにして別のテーブルを作るべきです(入力してデータを作るときにinsert/updateしていく)。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.4

これはないわ・・・ カラムを削除しなくちゃいけない意図がわからない。 参照したときに削除されていたらエラーだらけになりますよ 運用方法が悪いので、こんなことをしないでも効率的でセキュアな運用はできると思います そのうえで、どうしても処理したいのであれば プレースホルダ(プリペアドステートメント)での処理はできないので ダイレクトに変数を渡すしかないでしょう。 少しでもセキュリティをあげるためには テーブルのカラム一覧をとって、消したいカラム名と完全一致するか マッチさせた上で、変数を渡す・・・といった処理になるでしょう

noname#202682
質問者

お礼

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

noname#202682
質問者

補足

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

回答No.3

>下記のように記載することによって、無事、カラムの削除を行えました。 >$sql = 'ALTER TABLE test_table DROP COLUMN num'; >$stmt = $dbh->exec($sql); 実際にカラムの削除だったのね。 それならupdateでは無理。 変数にしたければ $sql = 'ALTER TABLE test_table DROP COLUMN ' . $targetColumn; これでいいんでないの?

noname#202682
質問者

お礼

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

noname#202682
質問者

補足

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

回答No.1

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

noname#202682
質問者

お礼

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

noname#202682
質問者

補足

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

関連するQ&A

  • 結合したテーブルの特定カラムのカウントについて

    PHPを学習しており、MySQLでデータベースにPDOで接続をしています。 添付画像のようなチームのデータを管理するテーブル(teamテーブル)と メンバーのデータを管理するテーブル(memberテーブル)があり、 teamテーブルのkeywordカラムを検索条件にし、 keywordカラムの値が『keyword1』と一致するteamテーブルのレコードの teamcodeカラムの値と一致する値を持つ memberテーブルのレコード数をカウントして teamテーブルから『teamcode』、『teamname』、『teamkana』、『date』を取得し、memberテーブルでの『teamcode』の該当数を取得したいです。 OUTER JOINして、NULLIFやCOALESCEなどを使用して試してみたのですが、 構文の使い方が悪いのか、そもそも使うべきSQL文が違うのかわかりませんが、 添付画像の『teamcode』の値が『0004』のもののように memberテーブルに該当する値が存在しないものは NULLになってしまい、取得ができませんでした。 できればmemberテーブルに該当する値が存在しない場合は「0」として取得したいです。 このような場合、どのようなSQL文を記述したら良いのでしょうか? 少しややこしい内容ですので、説明が不足していたり、 説明が分かりづらいようであれば補足します。 ご回答、よろしくお願いします。

    • ベストアンサー
    • PHP
  • ○LinuxでのPDO利用

    ○LinuxでのPDO利用 PHPで次のようなコードを記述しています。 ------------------------------------------------------------- $db = 'mysql:host=localhost;dbname=dbn'; $login = 'user'; $password = 'pass'; try { $pdo = new PDO($db , $login, $password); $sth = $pdo->prepare("SELECT * FROM USER WHERE NAME=? AND PASSWORD=?"); $sth->bindParam(1, $name); $sth->bindParam(2, $password); $sth->execute(); while($row = $sth->fetch(PDO::FETCH_ASSOC)){ $user[] = $row; } }catch(PDOException $e){ var_dump($e); } ------------------------------------------------------------- このコードがWindowsでxampp上で動かすと問題ないんですが、 Linux上で動かすと$sth->execute();でfalseが返ってきて、 値を取得できません。 設定の問題だと思うのですが、 どこにその問題があるのかが分かりません。 環境は CentOS apache 2.0 php 5.3 mysql 5.1 PDO driver,pdo_mysqlもphpinfo()から確認できてます。 php.iniにも extension=pdo.so extension=pdo_mysql.so の記述はあります。 どなたか分かる方、宜しくお願いします。

    • ベストアンサー
    • PHP
  • これからのPHP開発ではPDOを選択するべき?

    PHPの勉強をしています。いくつか本を読んでいますが そのなかでPDOと PEAR::MDB2という二つのデータベース抽象化レイヤーを使った演習がありますが違いがよくわかりません。(より突っ込んだ言い方をすればこれからの開発ではMDB2モジュールを使う理由がないように思います)この業界でいうところの後発有利の理に従ってデータベースへの接続はPDOで統一しても大丈夫でしょうか? 技術的な理解として これらのレイヤーを介することで ここのデータベースに依存しないコードの書き方が可能になるのはわかりましたが (私のつかってる教本の質の問題かもしれませんが) なぜ二種類用意されてるのか、なぜMDB2が非推奨でないのか(しばらくはPEARの一部として生き残るということ?)、 その動作の違い、仕様の違いがよくわかりません。 わかるのは全体的にPDOを推されてるということ。 だったらなぜMDB2の説明を含めたのか(私が持ってる5.3に対応した教本の話です) 公式マニュアルを読んでもぐぐってもわからないんです。 というかなにがわからないのかがもうわかりません。 どうか初学者のわたくしめにそれと上にある二つの技術の仕様的な違いを教えてください。 それと最近のPHP開発のデータベース事情も聞かせてもらえるとありがたいです。

    • 締切済み
    • PHP
  • PDO/カラム値だけを取得したい(配列ではなく)

    PDOで、配列形式ではなく、変数だけを取得したいのですが、 どうすればいいでしょうか? ・取得結果の配列から値を取り出すのではなく、PDOでの取得段階で変数だけを取得したい ・結果は1件しかないという前提 <例> userテーブルで、指定条件(=email)に合致するnameカラム $sql = "SELECT name FROM user WHERE email = :email"; このとき、  Array ( [name] => 伊藤 ) ではなく、  伊藤 だけを取得したいです

    • ベストアンサー
    • PHP
  • データがある場合のカラムの削除

    データがあるカラムを削除したいのですが、出来ません! drop column column_name だとデータ無しの場合しか通用しなくて・・・。 削除対象のカラムのデータだけを消そうかと、 delete from table_name where column_name=値; も考えたのですが、 where句で引っ掛かったレコードが全部消えてしまいます・・・。 1カラムだけ削除する方法を教えて下さい(><) 宜しくお願いします。

  • あるカラムに同じ値を持つレコードの2件目以降を削除

    あるカラムに同じ値を持つレコードの2件目以降を削除するSQLを教えて下さい。 例) テーブル名:T キーカラム名:K 同じ値を持つかチェックするカラム名:S SELECT K,S FROM T; K S ---- 1 a 2 b 3 b 4 c 5 d 6 e 7 e 上記の場合、K=2または3と、K=6または7の2レコードを削除したい。

  • コラムの値からコラム・テーブルを検索

    プライマリキーが様々なテーブルで別の名前で利用されていると、テーブル同士の関連の全てが把握できずに困っています。以前にコラム名からテーブルを検索する方法を質問したのですが、私が扱っているデータベースでは、プライマリキーがシステムの別の場所で少しだけ異なる名前で利用されていることが多いので、その方法では把握できない関連が出てきます。 具体的には、EMPLOYEES__KEYというEMPLOYEESテーブルのプライマリキーがPERSONALIZE_EMPOYEESというテーブルでPSNLZ_EMP__KEYという名前で使われている状況を考えていただきたいと思います。PSNLZ_EMP__KEYのコラムのレコードは全てEMPLOYEES__KEY内のデータからとられているとします。 以前にselect TABLE_NAME from USER_TAB_COLUMNS where COLUMN_NAME = 'EMPLOYEES__KEY' というSQLで特定のコラムを使っているテーブルを全てリストアップできると教えていただいたのですが、今回のケースでは、同じような内容のコラムなのですが名前が異なるため上記のSQLでは検索できないテーブルがある場合、それをどうやってとってきたらよいのかということです。 コラムの値にtaro, jiro, hanakoなどのようにテーブルまたはシステム内でユニークな値が指定されている場合、コラムの値を指定し、「その値が使われているコラム・テーブルを列挙せよ」というような命令を与えればよいのだということまでは分かりますが、どのようにSQLを書けば良いか教えてください。

  • PHP pdo mysql 周りについて教えてください。

    現在PDOの勉強をしています。 ソースコードを見ると $pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true); というコードが書いてあって色々と調べたのですが、 fetch()を2回使用すると、エラーとなり、その対処として $pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true); を使っているのかなと思いました。 しかし、このコードはmysqlのみ対応となっていました。 汎用性を考えるともう一つの対処で、fetch allを使った対処の方が良いのかと思ったのですが、どうでしょうか。 fetchAllだと配列の配列となるそうなので、値をどうやって取れば良いのか悩むところです・・・ あとはmysqlの文字コードですが、よく掲載されているのが、my.cnfを設定し直すということが掲載されていますが、 サーバーに依存すると思ったのであまりこの対処は良くないのかなと思ったりしています。 現段階では、sqlquerybrowserなどで、DBを作成の前に、文字コードを設定して対処していますが、いかがでしょうか。 最後に、上記の対応を行っていた場合など、DBを他の文字コードに変更しなければいけない場合はみなさんはどのように対処しますか? 現場での経験がないので、この疑問に答えて頂けると嬉しいです。

    • 締切済み
    • PHP
  • PHPのPDOについて

    例えば手続き型でしたら、値をデータベースに追加するとき $sql = sprintf( 'INSERT INTO member SET id=%d, message="%s" ', mysql_real_escape_string($id), mysql_real_escape_string($message) ); mysql_query($sql) or die(mysql_error()); など「mysql_real_escape_string」を使って多少なりともセキュリティーをかけると思うのですが、PDOですと下記に書かれている以外に見たことないのですが、「mysql_real_escape_string」などはやらなくても大丈夫ということなのでしょうか? PDOの場合 $sql = 'INSERT INTO member SET id=?, message=?'; $stmt = $db->prepare($sql); $stmt->execute(array($id, $message)); 色々調べてみたのですがいまいち分からないためよろしくお願いします。

    • ベストアンサー
    • PHP
  • PDOのプレースホルダで変数でUPDATE出来ない

    bindValueに値を直接入れると動くのに、変数だと動かない状態になっており、質問をさせて頂きました。 MySQLに「serialcode」と「count」というテーブルを作り、POSTでシリアルコードを送信するとデータベースから対応した今の「count」をマイナス1した値を「count」にUPDATEするというものを作ろうとしております。 下記のコードで動かすと、シリアルコードは正しいものなのに、「count」がマイナス1されません。 ですが最後のechoには入力された値が表示されます。 なのでechoでは値が表示されるのでPOSTの値は受け取っていると思われます。 またbindValueの「$_POST["serialcode"]」の箇所を直接シリアルコードの値にして書き換えると「count」はマイナス1されます。 どのようにしたら変数でUPDATEを動作させる事が出来るでしょうか? -------------------------------------------------------------------------------------------- $pdo = new PDO($dsn, $user, $password); $sql = "UPDATE serialcode_table SET count = count - 1 WHERE serialcode = :serialcode2"; $stm = $pdo->prepare($sql); $stm->bindValue(':serialcode2', $_POST["serialcode"], PDO::PARAM_STR); $stm->execute(); <div> echo "シリアルコード:{$_POST["serialcode"]}" </div> -------------------------------------------------------------------------------------------- まだまだ勉強不足のところがあり恐縮ですが、原因についてご教示頂けますよう、何卒お願い致します。

    • ベストアンサー
    • PHP

専門家に質問してみよう