人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

PHPでSQL文を分割し配列に格納する方法を教えてください。

MYSQLからphpMyAdminを利用して出力したSQLファイルがあります。

このSQLファイルは以下のようにINSERT文が入っております。

=================================================================
INSERT INTO (・・・・・) VALUES
(1,'データ'),
(2,'データ');
INSERT INTO (・・・・・) VALUES
(1,'データ'),
(2,'データ');
INSERT INTO (・・・・・) VALUES
(1,'データ'),
(2,'データ');
=================================================================

これをフォームのPOST値で受け取り、INSERT文をひとつずつ実行したいと思ってます。

その為に
行頭の「INSERT INTO (」
という文字で分割して配列に格納する方法を教えてください。

よろしくお願いいたします。


この分割し配列に格納する方法を

●質問者: ruijio
●カテゴリ:コンピュータ ウェブ制作
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● じゅぴたー
●150ポイント ベストアンサー

$_POST['hoge']を受け取って、配列 $ar[1][0], $ar[1][1]... に代入していくプログラムです。

文字コードは utf-8 を前提にしています。

$str = mb_convert_encoding($_POST['hoge'], 'utf-8', 'auto'); //必要なら

preg_match_all("/(INSERT INTO.+?;)\n/ims", $str, $ar, PREG_PATTERN_ORDER);

//参考
foreach ($ar[1] as $val) echo $val . "<br />\n";
◎質問者からの返答

早速、ご回答ありがとうございます。

結果は残念ながら上手く行きませんでした。

文字コードはUTF-8です。


INSERT INTO `tbl` (`no`,`data`) VALUES

(1, 'データ'),

(1, 'データ');

INSERT INTO `tbl` (`no`,`data`) VALUES

(1, 'データ'),

(1, 'データ');

ためしに上記のデータを入れて実行し、結果配列の$arをprint_rすると

Array ( [0] => Array ( ) [1] => Array ( ) )

となりました。

1行目のUTF-8への変換を入れてもはずしても、同様でした。


INSERT INTO が一行で終わる場合もあるので、

INSERT INTO `tbl` (`no`,`data`) VALUES

(1, 'データ');

INSERT INTO `tbl` (`no`,`data`) VALUES (2,'データ');

INSERT INTO `tbl` (`no`,`data`) VALUES (4,'データ');

INSERT INTO `tbl` (`no`,`data`) VALUES

(1, 'データ'),

(1, 'データ'),

(1, 'データ');

INSERT INTO `tbl` (`no`,`data`) VALUES (4,'データ');

上記の場合も考慮いただければと思います。

引き続き解りましたアドバイス頂けると助かります。

【23:16 追記です】

preg_match_all("/(INSERT INTO.+?;)/ims", $str, $ar, PREG_PATTERN_ORDER);

このように修正したら、上記SQL文は分割できました。

これから実データで試してみたいと思います。


2 ● うぃんど
●50ポイント

厳密にやろうとすると要素毎に分解するような手間が必要になってきますが、

ご質問のように構造が一定のパターンを示している場合には下記のようにする手などもあります

(正規表現は万能ではないですし、必ずしも効率いいものでも無いです)

<?php
// 必要なら事前処理ってのは回答No.1に同じ
$str = $_POST['fuga'];

// 文字が消えてしまうのが欠点(実行時に補えばいい)の explode を使う方法
$array = explode('INSERT INTO', $str);
print_r($array);

// 信頼性はまだ低いstr_getcsv(php5.3.0以降に装備)を使う方法
$array = str_getcsv($str, ';', "'");
print_r($array);
◎質問者からの返答

回答有難うございます。返信遅くなりましてスミマセン。

explodeの方法もありましたね。ただやはりデータ内にINSERT INTO があると上手くいかないのでむずかしいところですですが、最初の回答に返信させていただいた方法で、今回は処理できました。

大変助かりました。ありがとうございます。

関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ