データをかなり速く挿入しようとすると失敗するため、データをバッチに分割する php 関数を作成しようとしています。
何千ものユーザーデータのレコードを同じデータベースの別の形式に挿入し、後で別のデータベースにエクスポートしようとしています。ただし、クエリは失敗します。
以下のコメントと回答に基づいて、コードを次のように更新しました。それでも失敗します。
値を挿入するコード:
function insertUsers( $users ){
error_reporting(E_ALL);
ini_set('display_errors',1);
global $pdo;
//insert into database
$i = 0;
$base = 'INSERT INTO tth_user_accounts (user_login, user_pass, user_email, user_registered,
user_firstname, user_lastname ) VALUES ';
$sql = '';
var_dump($users);
while( $i < count( $users ) ){
$sql = $sql . ' ("' .
$users[$i]['user_login'] . '", "' .
$users[$i]['user_pass'] . '", "' .
$users[$i]['user_email'] . '", "' .
$users[$i]['user_registered'] . '", "' .
$users[$i]['meta_value']['first_name'] . '", "' .
$users[$i]['meta_value']['last_name'] . '")';
if (!( $i % 25 === 0 )){
$sql = $sql . ', ';
}
if ($i % 25 === 0) {
//execute $base + $query here
$sql = $base . $sql;
$query = $pdo->prepare( $sql );
echo 'check query: <br />';
print_r( $query );
if( $query->execute() ){
echo '50 users succesfully added to the database';
} else {
echo 'Query failed: ';
print_r( $pdo->errorInfo() );
echo '<br />';
}
$sql = ''; //Re-init query string
}
$i++;
}
if ( strlen( $sql ) > 0 ) { // Execute remainder, if any
//execute $base + $query here
$sql = $base . $sql;
$query = $pdo->prepare( $sql );
echo 'check query: <br />';
print_r($query);
if( $query->execute() ){
echo 'User succesfully added to the database';
} else {
echo 'Query failed: ';
print_r( $pdo->errorInfo() );
echo '<br />';
}
}
}
クエリを確認してください:
PDOStatement Object ( [queryString] => INSERT INTO tth_user_accounts (user_login, user_pass, user_email, user_registered, user_firstname, user_lastname ) VALUES ("John Smith", "4\/\/350M3 P4sS\/\/0r|)", "john.smith@greatmail.com", "2013-04-11 11:18:58", "John", "Smith") )
クエリに失敗しました:Array ( [0] => 00000 [1] => [2] => )
%25
とで試してみましたが%50
、どちらも機能しません。勝利につながるはずの00000
エラーが発生し続けます(成功、私にとってはまだ失敗しますが、DBには何もありません)
時間があれば手動で行いますが、これは 1 回限りのイベントではないため、この問題の解決策が必要です。これを繰り返してクエリを次々に実行できるように、クエリをバッチに分割する良い方法はありますか? 私はすでにSO(および他の場所)に関するたくさんの質問を見てきましたが、私のニーズに合ったものを見つけることができません.
更新- 回答済みです。以下に示すように小さな変更が必要です。
if (!( $i % 25 === 0 )){
if(!( $i == ( count( $users ) - 1 ))){
$sql = $sql . ', ';
}
}