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 (」
という文字で分割して配列に格納する方法を教えてください。

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


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

回答の条件
  • 1人2回まで
  • 13歳以上
  • 登録:2011/09/26 22:04:23
  • 終了:2011/09/30 19:14:05

ベストアンサー

id:Jupiter2100 No.1

じゅぴたー回答回数444ベストアンサー獲得回数742011/09/26 22:24:02

ポイント150pt

$_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";
id:ruijio

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

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

文字コードは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文は分割できました。

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

2011/09/26 23:16:47

その他の回答(1件)

id:Jupiter2100 No.1

じゅぴたー回答回数444ベストアンサー獲得回数742011/09/26 22:24:02ここでベストアンサー

ポイント150pt

$_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";
id:ruijio

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

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

文字コードは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文は分割できました。

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

2011/09/26 23:16:47
id:windofjuly No.2

うぃんど回答回数2625ベストアンサー獲得回数11492011/09/27 05:16:27

ポイント50pt

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

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

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

<?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);
id:ruijio

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

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

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

2011/09/30 19:12:59
  • id:ruijio
    上記ですが、上手く行ったように思えたのですが、データそのものにセミコロンが入ってた場合、データが途中でINSERT文が途切れてしまい、上手く行きませんでした。

    引き続き、回答をお待ちしております。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません