PHP导数据脚本模板


<?php
/**
 * 1.配置$config参数
 * 2.DEBUG声明true,观察日志,sql组织是否正确
 * 3.DEBUG声明false,执行数据处理
**/

define('DEBUG', true);
$config = array(
    'host'      =>  '127.0.0.1',
    'port'      =>  '3306',
    'dbname'    =>  'xx',
    'username'  =>  'xx',
    'password'  =>  'xx',

    'transaction' => false,

    'pagestep'  =>  500,
);


set_time_limit(0);
ini_get('log_errors') OR ini_set('log_errors', 'on');
error_reporting(E_ALL ^ E_NOTICE);

error_log("-- 数据处理开始 --");

try{
    $dsn = "mysql:dbname={$config['dbname']};host={$config['host']};port=3306";
    $db = new PDO($dsn, $config['username'], $config['password']);
    $db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);
    $db->exec('SET NAMES utf8');

    $config['transaction'] AND $db->beginTransaction();

    $st = $db->query('select count(1) from AAA where status is not NULL');
    $total = $st->fetchColumn(); //需要处理的总记录数

    if ($total) {
        $i = 0;
        $start = 0;

        do{
            $i++;

            $cnt = ($start + $config['pagestep'] - 1 > $total) ? ($total-$start+1) : $config['pagestep'];
            $get_sql = "select * from AAA where status is not NULL and status <> '' limit {$start}, {$cnt}";
            DEBUG AND error_log("第{$i}轮读取 {$start} 起 {$cnt} 条:\n" . $get_sql);
            $st = $db->query($get_sql);

            $insert_sql = 'insert into BBB(...) values';
            foreach ($st->fetchAll() as $item) {
                $insert_sql .= "(...),";
            }

            $insert_sql = rtrim($insert_sql, ',');
            DEBUG AND error_log("第{$i}轮写入 {$start} 起 {$cnt} 条\n" . $insert_sql);

            DEBUG OR $db->exec($insert_sql);

            $start += $config['pagestep'];
        }while($start <= $total);

        $config['transaction'] AND $db->commit();

        error_log('-- 数据处理结束 --');
    }
} catch (PDOException $e) {
    $config['transaction'] AND $db->rollBack();
    error_log("-- PDO异常 --\n" . $e->getMessage());
}


你可能感兴趣的:(PHP,导数据)