質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

3回答

2217閲覧

PHPで「SELECT」してから「DROP TABLE」すると動作しない

jinba

総合スコア310

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

1クリップ

投稿2019/10/09 05:53

PHP

1$dsn = "sqlite:../sql/base.sqlite"; 2$pdo = new PDO($dsn); 3 4$stmt = $pdo -> prepare("DROP TABLE '削除テーブル'"); 5$stmt->execute();

上記ソースですと「削除テーブル」の削除に成功します

PHP

1$dsn = "sqlite:../sql/base.sqlite"; 2$pdo = new PDO($dsn); 3 4$st = $pdo->query("SELECT * FROM task WHERE num='1'"); 5$data = $st->fetch(); 6$del_table = $data["del_table"]; 7 8$stmt = $pdo -> prepare("DROP TABLE '{$del_table}'"); 9$stmt->execute();

SELECTをしてからテーブル削除をすると何故か削除が行われません
何か書き方に問題があるのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2019/10/09 06:05

そもそも正しく想定の情報をSELECTできてますか?
m.ts10806

2019/10/09 06:06

また、try-catchでPDOException拾うように組んでご確認ください。
jinba

2019/10/09 06:10

SELECT後にSELECTした文を使わず $stmt = $pdo -> prepare("DROP TABLE '削除テーブル'"); としても動作しないので正しく想定の情報はSELECTできた環境で試せています try-catchいまから試します
jinba

2019/10/09 06:22

try-catch試してみたところ catchを通らずエラーなく終了するのですがテーブルが削除されません try内でもSELECTしないと削除されました
yoorwm

2019/10/09 06:33

シングルクォーテーションで文字列を囲むとリテラルとして扱われるのですが、意味が分かっていてシングルクォーテーションにしているのでしょうか? それとも'削除テーブル'などと本当のテーブル名のように見えないので、その部分は実際に使うテーブル名に置き換えている、という事でしょうか?
m.ts10806

2019/10/09 06:37

try-catch導入したコードを提示してください
jinba

2019/10/09 06:42

string(58) "SQLSTATE[HY000]: General error: 6 database table is locked" 上記エラーが出ておりました saziさんの回答「closeCursor」をすることで解決できました、ありがとうございます ちなみにテーブル名がランダムでテーブル名先頭に数字が来てしまう場合があったためシングルコーテーションで囲っておりました (先頭に数字来ないように修正すればいいのですが…)
guest

回答3

0

ベストアンサー

selectされた状態が解放されていないのかもしれません。
試しに、select後にcloseCursorしてみてはどうでしょう。

PDOStatement::closeCursor

投稿2019/10/09 06:22

sazi

総合スコア25138

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jinba

2019/10/09 06:46

$data = $st->fetch(); $del_table = $data["del_table"]; $st->closeCursor(); //追加 上記のよう追加したら思ったように動作しました。 SELECT状態の開放初めて知りました おかげさまで解決することができましたありがとうございました!
guest

0

直接の回答ではありませんが、以下のようにしてエラーを表示すれば、解決の糸口がつかめますし、エラーメッセージを読んで、jinba さん自身で問題を把握できるかもしれません。

php

1try { 2 $dsn = "sqlite:../sql/base.sqlite"; 3 $pdo = new PDO($dsn); 4 $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // 追加 5 6 $st = $pdo->query("SELECT * FROM task WHERE num='1'"); 7 $data = $st->fetch(); 8 $del_table = $data["del_table"]; 9 10 $stmt = $pdo->prepare("DROP TABLE '{$del_table}'"); 11 $stmt->execute(); 12} catch (PDOException $e) { 13 var_dump($e->getMessage()); 14}

投稿2019/10/09 06:06

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jinba

2019/10/09 06:23

try-catch試してみたところ catchを通らずエラーなく終了するのですがテーブルが削除されません try内でもSELECTしないと削除されました
jinba

2019/10/09 06:23

追加見落としていました、追加含めもう一度試してみます
jinba

2019/10/09 06:39

string(58) "SQLSTATE[HY000]: General error: 6 database table is locked" 上記エラーが出ておりました こやってエラーチェックするのですね、次回から自己解決するためにも とても参考になりましたありがとうございました。
退会済みユーザー

退会済みユーザー

2019/10/09 06:49

> こやってエラーチェックするのですね そうです。 さらに、「General error: 6 database table is locked」でググれば、解決方法が簡単に見つかります。
guest

0

反対に質問ですが、なぜ SELECT のタイミングで DROP TABLE したいのですか?そんな使い方をしなければならない場面が思い浮かびません。
DELETE でテーブルのレコードを削除するのではダメなのですか?

投稿2019/10/09 06:09

Orlofsky

総合スコア16415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jinba

2019/10/09 06:21

サブテーブルをたくさん使うプログラムを作っており そのテーブル一覧表のテーブルがあります。 なのでテーブル一覧表からはレコードを削除し サブテーブル自体は丸ごと削除したいのです
m.ts10806

2019/10/09 06:38

横から失礼します テーブルの正規化おこなったほうが良さそうです。テーブルの削除が必要なシステムってなかなかないですよ。
tacsheaven

2019/10/09 06:40

やってせいぜい truncate ですかね。デーブルそのものを drop ってのは……それやるくらいなら temporary table 作りますよねえ……
m.ts10806

2019/10/09 06:46

私もtemporary table案件だと思いました。定時処理とかではよく用いますね。
jinba

2019/10/09 07:02

初心者過ぎて気づけてない部分が大きいのですが、かなり強引なシステムなんでしょう… テーブルdropするようなシステム自体がおかしいことに気付けるよう精進します ご指摘ありがとうございました。
Orlofsky

2019/10/09 08:00

まともに正規化されていないとか、かなりテーブル設計に無理があるものと想像します。 SQLをシンプルにパフォーマンス良く実行できるように、データベースのテーブルはデータベースの正規化 https://oss-db.jp/measures/dojo_info_04.shtml に沿って設計します。通常、第3正規化まで行います。
m.ts10806

2019/10/09 09:05

業務改善のポイントと同じなのですが「ムリ」「ムダ」「ムラ」の三点で検討すると良いと思います。 初めは多少強引で良いので仮説を立てるところから。その仮説を検証していく形です。 幾ら設計だけにらめっこしても話は進まないですし、動かしたり簡単な検証プログラムを作ったり。大量のサンプルデータを投入してみたり、ですね。 熟練者が見たからって一瞬で見抜けるわけではなく地道な要件確認と検証で詰めていくものなので時間はかかりますが、事故があったときの損害に比べれば小さいものと思います
jinba

2019/10/10 02:43

デザインが本業でシステム的なことに関しては教えていただける方が居らず完全独学状態です。 みなさんのご指摘で新たに勉強しなければならない分野が絞れます とても参考になりました、ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問