Best practice: Import mySQL file in PHP; split queries

后端 未结 13 619
Happy的楠姐
Happy的楠姐 2020-11-29 00:08

I have a situation where I have to update a web site on a shared hosting provider. The site has a CMS. Uploading the CMS\'s files is pretty straightforward using FTP.

<
13条回答
  •  迷失自我
    2020-11-29 00:32

    First at all thanks for this topic. This saved a lot of time for me :) And let me to make little fix for your code. Sometimes if TRIGGERS or PROCEDURES is in dump file, it is not enough to examine the ; delimiters. In this case may be DELIMITER [something] in sql code, to say that the statement will not end with ; but [something]. For example a section in xxx.sql:

        DELIMITER //
        CREATE TRIGGER `mytrigger` BEFORE INSERT ON `mytable`
        FOR EACH ROW BEGIN
             SET NEW.`create_time` = NOW();
        END
        //
        DELIMITER ;
    

    So first need to have a falg, to detect, that query does not ends with ; And delete the unqanted query chunks, because the mysql_query does not need delimiter (the delimiter is the end of string) so mysql_query need someting like this:

        CREATE TRIGGER `mytrigger` BEFORE INSERT ON `mytable`
        FOR EACH ROW BEGIN
             SET NEW.`create_time` = NOW();
        END;
    

    So a little work and here is the fixed code:

        function SplitSQL($file, $delimiter = ';')
        {
            set_time_limit(0);            
            $matches = array();
            $otherDelimiter = false;
            if (is_file($file) === true) {
                $file = fopen($file, 'r');
                if (is_resource($file) === true) {
                    $query = array();
                    while (feof($file) === false) {
                        $query[] = fgets($file);
                        if (preg_match('~' . preg_quote('delimiter', '~') . '\s*([^\s]+)$~iS', end($query), $matches) === 1){     
                            //DELIMITER DIRECTIVE DETECTED
                            array_pop($query); //WE DON'T NEED THIS LINE IN SQL QUERY
                            if( $otherDelimiter = ( $matches[1] != $delimiter )){
                            }else{
                                //THIS IS THE DEFAULT DELIMITER, DELETE THE LINE BEFORE THE LAST (THAT SHOULD BE THE NOT DEFAULT DELIMITER) AND WE SHOULD CLOSE THE STATEMENT                                
                                array_pop($query);
                                $query[]=$delimiter;
                            }                                                                                    
                        }                        
                        if ( !$otherDelimiter && preg_match('~' . preg_quote($delimiter, '~') . '\s*$~iS', end($query)) === 1) {                            
                            $query = trim(implode('', $query));
                            if (mysql_query($query) === false){
                                echo '

    ERROR: ' . $query . '

    ' . "\n"; }else{ echo '

    SUCCESS: ' . $query . '

    ' . "\n"; } while (ob_get_level() > 0){ ob_end_flush(); } flush(); } if (is_string($query) === true) { $query = array(); } } return fclose($file); } } return false; }

    I hope i could help somebody too. Have a nice day!

提交回复
热议问题