- ベストアンサー
PHPでダミーデータ10万件をinsertする方法
- プログラム初心者がPHPでダミーデータ10万件をinsertする方法について教えてください。
- XAMPP(ローカル)環境で負荷がかかっても問題ありません。カラムはuser_id、gif_id、tagの三つですが、user_idとgif_idは空でも構いません。tagは1文字をランダムに値を変化させながら入れることもできます。
- mysqlのmysqli_query関数を使用してINSERT文を実行し、ダミーデータをデータベースに挿入します。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
PDOでプリペアド処理するとして一行ずつ投入するのはナンセンス まとめて投入してください。 ざっとテストしてみて14~15倍スピード差がありました。 <?PHP $pdo = new PDO($dsn,$user,$password); $a=array("あ","い","う","え","お","か","き","く","け","こ"); $count=100000; val=""; $datas=array(); for($i=0;$i<$count;$i++){ $num=rand(0,count($a)-1); $datas[]=$a[$num]; if($val!=="") $val.=","; $val.="(?)"; } $sql = "insert ignore into tbl(tag) values".$val; $stmt = $pdo->prepare( $sql); $num=rand(0,count($a)-1); $stmt->bindValue(1,$a[$num]); $stmt->execute($datas); ?>
その他の回答 (3)
- agunuz
- ベストアンサー率65% (288/438)
>慣れてないのでバインド変数値の所をドンドンと変えてSQLを実行する方法がわかりません 「慣れていない」のではなく「理解していない」だけ。 $stmt = $pdo->prepare('INSERT INTO tag(user_id, gif_id, tag) VALUES (?, ?, ?)'); を実行したら $stmt->bindValueと$stmt->execute();は繰り返し実行出来る(ループ内でbindする値を変えてexecuteする) マニュアルにもPDOstatement(prepareの戻り値)に対して複数のexecuteを実行する例が載っている(というか、その例しか載っていない)。 http://www.php.net/manual/ja/pdo.prepare.php
お礼
理解していませんでした。すいません
- ahoo_ok
- ベストアンサー率31% (30/95)
こういうときこそプレースホルダの出番。 プレースホルダは、セキュリティ対策のみの機能ではない。 同じSQLでバインド変数値の所をドンドンと変えてSQLを実行できるからこそ便利な機能。 知らない人だとわざわざ同じSQLを何回も書いてっていう無駄なことをやるからね。質問者もそうならないように機能の本質を理解しておこう。
お礼
回答ありがとうございます 一晩勉強してPDO接続から疑問符プレースホルダを使えるまでになりました しかし、慣れてないのでバインド変数値の所をドンドンと変えてSQLを実行する方法がわかりません もし、よければ教えてください。 よろしくお願いします $stmt = $pdo->prepare('INSERT INTO tag(user_id, gif_id, tag) VALUES (?, ?, ?)'); $stmt->bindValue(1, 67, PDO::PARAM_INT); $stmt->bindValue(2, 95, PDO::PARAM_INT); $stmt->bindValue(3, 'あ'); $stmt->execute();
- yambejp
- ベストアンサー率51% (3827/7415)
>tagはあ~お、か~こまで1文字をランダムに値を変化させながら入れられますか? の言いたいところがいまいちわかりませんが、こういうこと? <?PHP $a=array("あ","い","う","え","お","か","き","く","け","こ"); for($i=0;$i<100;$i++){ $num=rand(0,count($a)-1); print($a[$num]); } ?> ちなみに、getやpostでうけとるわけでもない安全なデータであれば エスケープしたりsprintfする必要はないかと。 それと1件ごとinsertを発行すると無駄が多いです 100データとか1000データをまとめて INSERT INTO tag(tag) VALUES('あ'),('い'),・・・・ という書式でやる方が効率的です まとめ具合によりますが数倍から数十倍スピードが違うと思います。 (まとめすぎるとオーバーフローするので適当に調整が必要ですが)
お礼
回答ありがとうございます そんな感じです。こうやるんですね。勉強になりました しかし、効率よくテストDATA作る方法がピンときません PDOを勉強して少し使えるようになったのでプレースホルダ使って効率よくINSERTする方法がありましたらよろしくお願いします
お礼
回答ありがとうございます 書き込めました。 executeに配列で渡せるのですね、勉強不足でした PDO速いですね9秒くらいで10万行書き込めました 感謝いたします