Как остановить перемещение файла при обнаружении ошибки в PHP?

У меня есть PHP-скрипт, который позволяет мне изменять теги XML-файла в соответствии с запросом SQL и перемещать этот файл в папку после его обработки.

Я добавил условие об ошибке, если SQL-запрос ничего не возвращает, я отправляю электронное письмо, чтобы получить уведомление. Работает хорошо, но файл с ошибкой все равно перемещается в папку. Я хотел бы, чтобы этот файл оставался в базовой папке, а сценарий продолжался с другими файлами.

Я несколько раз пытался изменить порядок выполнения скрипта, но безуспешно... Вы можете мне помочь? Спасибо

И мой скрипт:

<?php
include "include/ODBCaccess.class.php";

$connect = odbc_connect("localhost","root","");
$dirname_source = "D:/xampp/htdocs/xml/";
$dirname_destination = "D:/xampp/htdocs/new_xml/";


$dir = opendir($dirname_source);
while($file = readdir($dir))
{
   $source_file =  $dirname_source.$file;
   $destination_file =  $dirname_destination."Order_".$file;
   if (is_file($source_file))
    {
        // echo $source_file;echo "<br>";
        // echo $destination_file;echo "<br>";
        
        $xml =new DOMDocument("1.0","UTF-8");
        $xml->load($source_file);
        
        $xpath = new DOMXPath($xml);
        foreach ($xpath->query("/Order/OrderLines") as $node)
        {
            $SKU_CODE = $node->getElementsByTagName("Code")->item(0)->nodeValue;
                      
            $query = "select GEAN from SKU where SKU='".$SKU_CODE."'";
            // echo $query; echo "<br>";
            $exec = odbc_exec($connect, $query);
            $result = odbc_fetch_array($exec);

            //ERROR    
            if ($result === false || $result['GEAN'] === null) {
                    // echo "GEAN not found for $SKU_CODE";
                    
                    //email part
                    $to = "[email protected]";
                    $subject = "Error GEAN";
                    
                    $message = "GEAN not found for $SKU_CODE in file $source_file";
                    
                    $header = "From:[email protected] \r\n";
                    $header .= "MIME-Version: 1.0\r\n";
                    $header .= "Content-type: text/html\r\n";
                    
                    $retval = mail ($to,$subject,$message,$header);
                    
                    if ( $retval == true ) {
                        echo "Message sent successfully...";
                    }else {
                        echo "Message could not be sent...";
                    }
         
                }

                // $barcode = (string) $result['GEAN'];
                // echo $barcode; echo "<br>"; //9353970875729   
                            
                $node->getElementsByTagName("SKU")->item(0)->nodeValue = "";
                $node->getElementsByTagName("SKU")->item(0)->appendChild($xml->createTextNode($result['GEAN']));
                                
        }

        $xml->formatOutput = true;
        $xml->save($source_file);
        rename($source_file,$destination_file);
    }
}
closedir($dir);
?>
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
0
46
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете создать flag со значением по умолчанию как true, а в случае error установить для него значение false и сохранить файл, только если flag равно true, как показано ниже:

<?php
include "include/ODBCaccess.class.php";

$connect = odbc_connect("localhost", "root", "");
$dirname_source = "D:/xampp/htdocs/xml/";
$dirname_destination = "D:/xampp/htdocs/new_xml/";


$dir = opendir($dirname_source);
while ($file = readdir($dir)) {
    $source_file = $dirname_source . $file;
    $destination_file = $dirname_destination . "Order_" . $file;
    if (is_file($source_file)) {
        // echo $source_file;echo "<br>";
        // echo $destination_file;echo "<br>";

        $xml = new DOMDocument("1.0", "UTF-8");
        $xml->load($source_file);

        $xpath = new DOMXPath($xml);

        $save = true; // default flag to allow saving
        foreach ($xpath->query("/Order/OrderLines") as $node) {
            $SKU_CODE = $node->getElementsByTagName("Code")->item(0)->nodeValue;

            $query = "select GEAN from SKU where SKU='" . $SKU_CODE . "'";
            // echo $query; echo "<br>";
            $exec = odbc_exec($connect, $query);
            $result = odbc_fetch_array($exec);

            //ERROR
            if ($result === false || $result['GEAN'] === null) {
                $save = false; // set flag to false in case of error to avoid saving

                // echo "GEAN not found for $SKU_CODE";

                //email part
                $to = "[email protected]";
                $subject = "Error GEAN";

                $message = "GEAN not found for $SKU_CODE in file $source_file";

                $header = "From:[email protected] \r\n";
                $header .= "MIME-Version: 1.0\r\n";
                $header .= "Content-type: text/html\r\n";

                $retval = mail($to, $subject, $message, $header);

                if ($retval == true) {
                    echo "Message sent successfully...";
                } else {
                    echo "Message could not be sent...";
                }

            }

            // $barcode = (string) $result['GEAN'];
            // echo $barcode; echo "<br>"; //9353970875729

            $node->getElementsByTagName("SKU")->item(0)->nodeValue = "";
            $node->getElementsByTagName("SKU")->item(0)->appendChild($xml->createTextNode($result['GEAN']));

        }

        if ($save) { // save if the flag is true
            $xml->formatOutput = true;
            $xml->save($source_file);
            rename($source_file, $destination_file);
        }
    }
}
closedir($dir);
?>

Обновлять:

получить массив всех SKU, у которых есть GEAN null, и проверить в цикле, выходит ли SKU цикла в array, как показано ниже:

<?php
include "include/ODBCaccess.class.php";

$connect = odbc_connect("localhost", "root", "");
$dirname_source = "D:/xampp/htdocs/xml/";
$dirname_destination = "D:/xampp/htdocs/new_xml/";

$query = "select SKU from SKU where GEAN IS NULL";

$exec = odbc_exec($connect, $query);
$result = odbc_fetch_array($exec); // array of all SKUs where GEAN is null

$exec = odbc_exec($connect, "select SKU from SKU");
$allSKUs = odbc_fetch_array($exec); // array of all SKUs where GEAN is null

$dir = opendir($dirname_source);
while ($file = readdir($dir)) {
    $source_file = $dirname_source . $file;
    $destination_file = $dirname_destination . "Order_" . $file;
    if (is_file($source_file)) {
        // echo $source_file;echo "<br>";
        // echo $destination_file;echo "<br>";

        $xml = new DOMDocument("1.0", "UTF-8");
        $xml->load($source_file);

        $xpath = new DOMXPath($xml);

        $save = true; // default flag to allow saving
        foreach ($xpath->query("/Order/OrderLines") as $node) {
            $SKU_CODE = $node->getElementsByTagName("Code")->item(0)->nodeValue;

            //ERROR
            if (($result && in_array($SKU_CODE, $result)) || !in_array($SKU_CODE, $allSKUs)) { // if sku exits in result array, this means that its GEAN is null OR SKU is not present in the DB
                $save = false; // set flag to false in case of error to avoid saving

                // echo "GEAN not found for $SKU_CODE";

                //email part
                $to = "[email protected]";
                $subject = "Error GEAN";

                $message = "GEAN not found for $SKU_CODE in file $source_file";

                $header = "From:[email protected] \r\n";
                $header .= "MIME-Version: 1.0\r\n";
                $header .= "Content-type: text/html\r\n";

                $retval = mail($to, $subject, $message, $header);

                if ($retval == true) {
                    echo "Message sent successfully...";
                } else {
                    echo "Message could not be sent...";
                }

            }

            // $barcode = (string) $result['GEAN'];
            // echo $barcode; echo "<br>"; //9353970875729

            $node->getElementsByTagName("SKU")->item(0)->nodeValue = "";
            $node->getElementsByTagName("SKU")->item(0)->appendChild($xml->createTextNode($result['GEAN']));

        }

        if ($save) { // save if the flag is true
            $xml->formatOutput = true;
            $xml->save($source_file);
            rename($source_file, $destination_file);
        }
    }
}
closedir($dir);
?>

Просто вопрос, моя таблица SKU содержит много записей и скрипт долго проходит всю таблицу. Есть ли способ оптимизировать его или вместо этого мне нужно изменить его непосредственно в моей базе данных?

Eric27 04.05.2022 12:58

Вместо того, чтобы получать SKU из БД в цикле, вы можете создать массив SKU из БД, используя один запрос перед циклом, затем вы можете сравнить два arrays с помощью array_intersect, а остальная часть процесса такая же. Вы также можете добавить индексацию в столбец SKU для оптимизации.

Haseeb Hassy 04.05.2022 13:02

Итак, я сохраняю тот же запрос, но помещаю результаты в массив с двумя столбцами, а затем сравниваю значения в нем с помощью array_intersect?

Eric27 04.05.2022 14:08

Я обновил ответ в соответствии с вашим требованием.

Haseeb Hassy 04.05.2022 14:39

Я только что проверил код, я думаю, что есть ошибка, когда SQL-запрос не возвращает код GEAN, возникает ошибка. Я проверил, и файл был перемещен + следующая ошибка «Предупреждение: in_array () ожидает, что параметр 2 будет массивом, задано логическое значение»

Eric27 04.05.2022 15:24

Я предположил, что могут быть некоторые результаты, обновил код, чтобы настроить, если результат false

Haseeb Hassy 04.05.2022 15:28

Тот же результат... письмо не отправляется и файл с ошибкой перемещается в другую папку..

Eric27 04.05.2022 15:35

обновил код, теперь должно быть исправлено

Haseeb Hassy 04.05.2022 15:38

Всегда один и тот же файл перемещается, а почты нет. Вам нужно больше информации в моем вопросе?

Eric27 04.05.2022 15:48

Другие вопросы по теме