電子書籍の厳選無料作品が豊富!

プログラム初心者です

テスト用にmysqlのテストdataをつくりたいです

PHPでダミーDATA10万件をinsertする方法を教えてください

カラムはuser_id gif_id tag の三つです

user_id gif_idはなにも記入しなくてもいいです。(数字が入る予定です)

tagはあ~お、か~こまで1文字をランダムに値を変化させながら入れられますか?(無理なら同じタグでいいです)

XAMPP(ローカル)で作るので負荷かかってもかまいません

mysqli_query($link,sprintf('INSERT INTO tag(user_id,gif_id,tag) VALUES(%d,%d,"%s"),(%d,%d,"%s","%s")',
mysqli_real_escape_string($link,$id),
mysqli_real_escape_string($link,$gif_id),
mysqli_real_escape_string($link,$tag),

mysqli_real_escape_string($link,$id),
mysqli_real_escape_string($link,$gif_id),
mysqli_real_escape_string($link,$tag2)

));

よろしくお願いします

A 回答 (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);
?>
    • good
    • 0
この回答へのお礼

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

お礼日時:2014/02/27 19:33

>慣れてないのでバインド変数値の所をドンドンと変えて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
    • good
    • 0
この回答へのお礼

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

お礼日時:2014/02/27 18:27

こういうときこそプレースホルダの出番。


プレースホルダは、セキュリティ対策のみの機能ではない。
同じSQLでバインド変数値の所をドンドンと変えてSQLを実行できるからこそ便利な機能。

知らない人だとわざわざ同じSQLを何回も書いてっていう無駄なことをやるからね。質問者もそうならないように機能の本質を理解しておこう。
    • good
    • 0
この回答へのお礼

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

お礼日時:2014/02/27 03:28

>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('あ'),('い'),・・・・
という書式でやる方が効率的です

まとめ具合によりますが数倍から数十倍スピードが違うと思います。
(まとめすぎるとオーバーフローするので適当に調整が必要ですが)
    • good
    • 0
この回答へのお礼

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

お礼日時:2014/02/27 03:35

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!