• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:テストdataの作成について)

PHPでダミーデータ10万件をinsertする方法

このQ&Aのポイント
  • プログラム初心者がPHPでダミーデータ10万件をinsertする方法について教えてください。
  • XAMPP(ローカル)環境で負荷がかかっても問題ありません。カラムはuser_id、gif_id、tagの三つですが、user_idとgif_idは空でも構いません。tagは1文字をランダムに値を変化させながら入れることもできます。
  • mysqlのmysqli_query関数を使用してINSERT文を実行し、ダミーデータをデータベースに挿入します。

質問者が選んだベストアンサー

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.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); ?>

flash0
質問者

お礼

回答ありがとうございます 書き込めました。 executeに配列で渡せるのですね、勉強不足でした PDO速いですね9秒くらいで10万行書き込めました 感謝いたします

その他の回答 (3)

  • agunuz
  • ベストアンサー率65% (288/438)
回答No.3

>慣れてないのでバインド変数値の所をドンドンと変えて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

flash0
質問者

お礼

理解していませんでした。すいません

  • ahoo_ok
  • ベストアンサー率31% (30/95)
回答No.2

こういうときこそプレースホルダの出番。 プレースホルダは、セキュリティ対策のみの機能ではない。 同じSQLでバインド変数値の所をドンドンと変えてSQLを実行できるからこそ便利な機能。 知らない人だとわざわざ同じSQLを何回も書いてっていう無駄なことをやるからね。質問者もそうならないように機能の本質を理解しておこう。

flash0
質問者

お礼

回答ありがとうございます 一晩勉強して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)
回答No.1

>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('あ'),('い'),・・・・ という書式でやる方が効率的です まとめ具合によりますが数倍から数十倍スピードが違うと思います。 (まとめすぎるとオーバーフローするので適当に調整が必要ですが)

flash0
質問者

お礼

回答ありがとうございます そんな感じです。こうやるんですね。勉強になりました しかし、効率よくテストDATA作る方法がピンときません PDOを勉強して少し使えるようになったのでプレースホルダ使って効率よくINSERTする方法がありましたらよろしくお願いします

関連するQ&A