Home > database >  How to repeat fuction in php?
How to repeat fuction in php?

Time:05-19

Is it possible to repeat a function when it has finished. For Example: I have a function for export mysql to json file with a limit of 100 data. if it is successful create a json file with 100 data. Then it will repeat the same function to create json file 100 more data (no duplicate data) until the data runs out.

my code for generate json file :

$results = $db->SELECT()
                ->FROM( array(  'MM'=>'M_MEMBER'),
                        array(  'MEMBER_ID'      => 'MM.MEMBER_ID',
                                'FIRST_NAME'     => 'MM.FIRST_NAME',
                                'LAST_NAME'      => 'MM.LAST_NAME',
                                'MEMBER_GROUP'   => 'MM.MEMBER_GROUP',
                                'MEMBER_GROUP1'  => 'MM.MEMBER_GROUP1',
                                'PHONE_NUMBER'   => 'MM.PHONE_NUMBER',
                                'MEMBERSHIP'     => 'MM.MEMBERSHIP',
                                'UPLOAD_DATE'    => 'MM.UPLOAD_DATE',
                                'STATUS'         => 'MM.STATUS'
                             )
                      )
                ->WHERE('DATE(MM.UPLOAD_DATE) = CURDATE()')
                ->WHERE('SYNC_FLAG = ?','N')
                ->LIMIT(100)
                ->QUERY()->FETCHALL();

if (!empty($results) && $results['SYNC_FLAG'] != 'Y')
{
    $counter = formatNbr($counterFile);
    $data = array();
    foreach ($results as $key=>$row) {
        $data[$key]         = $row;
        $data[$key]['_id']  = (string) Application_Helper_General::generateIdJsonFile();

        $queryUdateMemberFlag = 'UPDATE M_MEMBER SET SYNC_FLAG = "Y" WHERE MEMBER_ID = '.$row['MEMBER_ID'].'';
         $db->query($queryUdateMemberFlag);
    }

    $out  = array_values($data);
    $jsonAr = json_encode($out);
    $json = substr($jsonAr, 1, -1);
    $jsonData = preg_replace('/[\x00-\x1F\x80-\xFF]/', '', $json);
    $file = $store_path_pos.'dataMember_'.date('Y-m-d').'_'.$counter.'.json';
    $createJson = file_put_contents($file, $jsonData);

    if($createJson){
        echo "Create Json File Success In :".$file;

    }else{
        echo "Create Json Failed";
    }
}

the code can only generate a json file once, how can it be repeated after generating a successful json file

note: I added a flag for each successful data generated json file

CodePudding user response:

You can extract your codes to a function and use the function in the loop.

Example:

function exporter($limit = 100)
{
    $results = $db->SELECT()
                ->FROM( array(  'MM'=>'M_MEMBER'),
                        array(  'MEMBER_ID'      => 'MM.MEMBER_ID',
                                'FIRST_NAME'     => 'MM.FIRST_NAME',
                                'LAST_NAME'      => 'MM.LAST_NAME',
                                'MEMBER_GROUP'   => 'MM.MEMBER_GROUP',
                                'MEMBER_GROUP1'  => 'MM.MEMBER_GROUP1',
                                'PHONE_NUMBER'   => 'MM.PHONE_NUMBER',
                                'MEMBERSHIP'     => 'MM.MEMBERSHIP',
                                'UPLOAD_DATE'    => 'MM.UPLOAD_DATE',
                                'STATUS'         => 'MM.STATUS'
                             )
                      )
                ->WHERE('DATE(MM.UPLOAD_DATE) = CURDATE()')
                ->WHERE('SYNC_FLAG = ?','N')
                ->LIMIT($limit)
                ->QUERY()->FETCHALL();

        if (!empty($results) && $results['SYNC_FLAG'] != 'Y')
        {
            $counter = formatNbr($counterFile);
            $data = array();
            foreach ($results as $key=>$row) {
                $data[$key]         = $row;
                $data[$key]['_id']  = (string) Application_Helper_General::generateIdJsonFile();

            $queryUdateMemberFlag = 'UPDATE M_MEMBER SET SYNC_FLAG = "Y" WHERE MEMBER_ID = '.$row['MEMBER_ID'].'';
             $db->query($queryUdateMemberFlag);
        }

        $out  = array_values($data);
        $jsonAr = json_encode($out);
        $json = substr($jsonAr, 1, -1);
        $jsonData = preg_replace('/[\x00-\x1F\x80-\xFF]/', '', $json);
        $file = $store_path_pos.'dataMember_'.date('Y-m-d').'_'.$counter.'.json';
        $createJson = file_put_contents($file, $jsonData);

        if($createJson) {
            echo "Create Json File Success In :".$file;
        } else {
            echo "Create Json Failed";
        }
}

$numberOfRows = 10000; # use the count query here
$limit = 100;

while($numberOfRows > 0) {
    exporter($limit);
    $numberOfRows -= $limit;
}

Also, you can call your function in your function recursively (https://www.w3schools.blog/php-recursive-functions)

CodePudding user response:

Putting the existing code in a loop seems like the obvious answer here.

do {
    $results = $db
        ->SELECT()
        ->FROM(
            ['MM'=>'M_MEMBER'],
            [
                'MEMBER_ID'      => 'MM.MEMBER_ID',
                'FIRST_NAME'     => 'MM.FIRST_NAME',
                'LAST_NAME'      => 'MM.LAST_NAME',
                'MEMBER_GROUP'   => 'MM.MEMBER_GROUP',
                'MEMBER_GROUP1'  => 'MM.MEMBER_GROUP1',
                'PHONE_NUMBER'   => 'MM.PHONE_NUMBER',
                'MEMBERSHIP'     => 'MM.MEMBERSHIP',
                'UPLOAD_DATE'    => 'MM.UPLOAD_DATE',
                'STATUS'         => 'MM.STATUS',
            ]
        )
        ->WHERE('DATE(MM.UPLOAD_DATE) = CURDATE()')
        ->WHERE('SYNC_FLAG = ?','N')
        ->LIMIT(100)
        ->QUERY()
        ->FETCHALL();

    if (count($results) === 0) {
        break;
    }

    $data = [];
    foreach ($results as $row) {
        $row['_id']  = (string) Application_Helper_General::generateIdJsonFile();
        $data[] = $row;

        //
        // this is UNSAFE and inefficient, use a prepared statement if possible
        //
        $queryUdateMemberFlag = 'UPDATE M_MEMBER SET SYNC_FLAG = "Y" WHERE MEMBER_ID = '.$row['MEMBER_ID'].'';
        $db->query($queryUdateMemberFlag);
    }

    $json = json_encode($out);
    $filename = sprintf(
        "%sdataMember_%s_%s.json",
        $store_path_pos,
        date("Y-m-d"),
        formatNbr($counterFile)
    );

    if ($json && file_put_contents($filename, $json)) {
        echo "Create Json File Success In $file";
    } else {
        echo "Create Json Failed";
    }
} while (true);

I fixed a few inefficiencies in your code; I have no idea what DB library you're using but as a rule you should never inject variables into an SQL query. It's likely safe in this context, but if your library allows you should prepare the statement outside the loop and execute it inside the loop for better performance.

  • Related