我正在尝试创建一个 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
用and尝试过%50
,两者都不起作用。不断收到应该导致胜利的00000
错误(成功,尽管对我来说它仍然失败,数据库中没有任何内容)
如果我有时间,我会手动完成,但这不会是一次性事件,所以我需要解决这个问题。有没有一种好方法可以将查询拆分成批次(以及如何?),这将允许重复此操作并一个接一个地执行查询?我一直在查看关于 SO(和其他地方)的一大堆问题,但找不到适合我需要的问题。
UPDATE - 已回答,需要稍作修改,如下所示:
if (!( $i % 25 === 0 )){
if(!( $i == ( count( $users ) - 1 ))){
$sql = $sql . ', ';
}
}