![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
以前似たような質問をしたモノですが、
Perl(cgi)ファイルからテーブル内の一定の項目をDELETEしようとしています
具体的にいうと、多数あるチェックボックスにチェックされた項目のみを削除するプログラムで、チェックされた値はハッシュに格納し読み込み、削除をしています。
foreach $key (keys %hash)
{
# 取り出した値を$noに代入
$no = $hash{$key};
# SQL発行
$sql = $db->prepare("DELETE FROM テーブル名 WHERE レコード指定名='$no'");
# SQL実行
$sql->execute;
}
もしくは
# ハッシュに入れた値をカウント
$n = keys( %hash );
# プレースホルダを使用し削除の実行
$sql = $db->prepare("DELETE FROM テーブル名 WHERE レコード指定名=?");
for($i=0; $i<$n; $i++)
{
# SQL実行
$sql->execute(@hash{$i});
}
上記の方法でどちらも問題なく実行できているのですが、ご覧のようにハッシュに格納されている数だけ$sql->execute;を実行しているため効率が悪い、と担当者から指摘をうけました。
少しでもマシンの負担を軽くし、スムーズにするためにexecuteをまとめて実行することを求められています。
selectcol_arrayref などを使う方法などを検索できたのですが、具体的なサンプルがないとまだ分からない初心者で、上記のプログラムに当てはめる方法が分からないでいます。
ご教授のほどよろしくお願いします。
![](http://oshiete.xgoo.jp/images/v2/common/profile/M/noimageicon_setting_15.png?e8efa67)
No.2ベストアンサー
- 回答日時:
perlのmysql 用モジュールの方は使ったことはないけど、phpと同様だろうと考えて回答してみます。
せっかくプレースホルダーを使ったsql文が使えているのだから、プレースホルダーに入れるようにすれば、データが数値か文字列かのチェックやエスケープ対策も出来るはずです。
# ハッシュに入れた値をカウント
$n = keys( %hash );
# プレースホルダーを使用し削除用 sql文 作成
$sql = $db->prepare("DELETE FROM テーブル名 WHERE カラム名 in (". join(',', map{'?'}[1..$n]) . ")");
### データバインド用の関数があるはずなので、データ配列と、データ型指定用配列または文字列をセットする。
### 関数名、引数の与えかたは使ってるモジュールのドキュメントを調べて下さい。
$sql->?bind?( データ、カラム型指定 );
# sql 実行
$sql->execute();
hrm_mmm様、回答ありがとうございます。
かなり勉強になるソースありがとうございます。
map関数はもちろん、このようなプレースホルダーの効率の良い使用方法があるんですね。
参考にさせて頂きます。
ちなみに、今回のようなSQL文をいろいろ応用し作成するやり方を知るいいサイト、もしくは参考書はあるのでしょうか?
経験し積み重ねていくしかないのでしょうか?
もし、参考見聞があれば教えて下さい。
No.3
- 回答日時:
> ループで文字を連結させていく方法が思いつかなかったので、join関数を
> 使い強引に文字を連結させてみました。
> 今回は、値が全て数値だったのでこの方法でできましたが、値が文字列
> だった場合join関数では『”(ダブルコーテーション)』で区切るわけでは
> ないのでできなくなります。
joinする前にmap関数でシングルクォートでくくるというのはどうですか。
@a = ( 'a','b','c','d' );
$b = join( ",", map{ "'".$_."'"; } @a );
$sql = "select * from テーブル where カラム in ( $b )";
みたいに
nora1962様、回答ありがとうございます。
回答頂いたやり方で文字列も解決できそうです。
プログラムを勉強し始めて2ヶ月たつのですが、今回のような関数の見つけ方が未熟で皆さんにお手数かけています。
早く自分で解決できるように力を付けたいと思います。
ありがとうございました。
No.1
- 回答日時:
「=」条件でprepare&executeするのでなく、in条件を指定すればいいのでは?
ループ内ではSQL文の組み立て(in条件の値リストをどんどん文字連結していく)を行い、ループから抜けた後にprepareとexecuteするといった方法です。
「select ~ from ~ where 列名 in(値1,値2, ~ ,値n)」といったSQLを作ることになります。
この回答への補足
chukenkenkou様、ご返答ありがとうございます。とても助かりました。
下記のプログラムで一応動かすことができました。
@s_del = values(%hash); # ハッシュの値のみを全て配列に代入
@s_del = join( ',', @s_del); # 配列を連結
$sql = $db->prepare("DELETE FROM テーブル名 WHERE レコード名 IN (@s_del)");
$sql->execute;
ループで文字を連結させていく方法が思いつかなかったので、join関数を使い強引に文字を連結させてみました。
今回は、値が全て数値だったのでこの方法でできましたが、値が文字列だった場合join関数では『”(ダブルコーテーション)』で区切るわけではないのでできなくなります。
ループ内でSQL文の組み立て(in条件の値リストをどんどん文字連結していく)方法として何かいい方法はあるでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- SQL Server [SQLServer] テーブル名からカラム名を取得する 1 2022/08/23 21:20
- PHP DBのハッシュ化したパスワードをpassword_verifyで戻し照合したのですが上手く行きません 2 2023/02/06 13:24
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- Access(アクセス) アクセス 削除するレコードを含んだテーブルを指定してくださいのエラー対処方法 1 2022/11/24 15:01
- PHP 重複を防ぐ記述について教えて下さい。 3 2023/04/03 14:35
- MySQL 書籍の内容はまともでしょうか? 1 2023/01/22 03:07
- SQL Server AccessのInsertクエリのあとつづけてDeleteクエリを行いたいがSQLでどう書いたらいい 3 2023/05/27 14:12
- Oracle sqlで質問です。 aテーブルとbテーブルがあり、下記のsqlで取得したidとnameに一致しないレ 1 2022/04/20 20:34
- Visual Basic(VBA) access count数を変数に格納 2 2022/03/30 19:21
- PHP コメント機能に返信欄を矢印で追加したい 1 2022/05/09 21:17
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
SQLです教えてください。
-
SQLです教えてくださいお願いし...
-
SQLです教えてくださいお願いし...
-
次の時間帯の勝率の合計を求め...
-
PhpMyAdminで作成して実行せよ...
-
テーブル名が可変の場合のクエ...
-
#1062 - '0' は索引 'PRIMARY' ...
-
下記の問合せを行うクエリを、 ...
-
SQLです教えてくださいお願いし...
-
SQLで漢字名称を都道府県や市区...
-
SQL構文です 画像のようにした...
-
SQLです!!教えてください。
-
下記の問合せを行うクエリを、P...
-
日本の全市区町村を人口密度が...
-
エラー 1068 (42000): 複数の主...
-
utf8bomとutf8mb4の違いがいま...
-
SQLです教えてくださいお願いし...
-
mysqlのupdate構文についての質...
-
SQLです。こんな感じですか?あ...
-
下記の問合せを行うクエリを、P...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
phpからinsertできない
-
PHP+MySQLから結果セット取得後...
-
コメントが消えてしまいます
-
.sqlのファイルをそのままコマ...
-
ダブルコーテーションやシング...
-
検索後のソートについて
-
SQLiteについて
-
【php+mysql】mysqlのレコード...
-
MySQL記述でアドバイスを
-
レコード新規・編集時に自動で...
-
PHP+MySQLでデータ登録がうまく...
-
Perlでexecuteをまとめて実行し...
-
複数条件の検索について
-
PHPで特定のレコードを取り出す
-
PHP+MySQLによるINSERTについて
-
mySQLで複雑な演算
-
接続ができません
-
SQLのVARCHARとVARCHAR2の違い
-
副問合せにLIKE文を使う方法は...
-
ODP.NETのバージョン確認
おすすめ情報