У меня есть 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);
?>
Вы можете создать 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 из БД в цикле, вы можете создать массив SKU из БД, используя один запрос перед циклом, затем вы можете сравнить два arrays
с помощью array_intersect
, а остальная часть процесса такая же. Вы также можете добавить индексацию в столбец SKU для оптимизации.
Итак, я сохраняю тот же запрос, но помещаю результаты в массив с двумя столбцами, а затем сравниваю значения в нем с помощью array_intersect?
Я обновил ответ в соответствии с вашим требованием.
Я только что проверил код, я думаю, что есть ошибка, когда SQL-запрос не возвращает код GEAN, возникает ошибка. Я проверил, и файл был перемещен + следующая ошибка «Предупреждение: in_array () ожидает, что параметр 2 будет массивом, задано логическое значение»
Я предположил, что могут быть некоторые результаты, обновил код, чтобы настроить, если результат false
Тот же результат... письмо не отправляется и файл с ошибкой перемещается в другую папку..
обновил код, теперь должно быть исправлено
Всегда один и тот же файл перемещается, а почты нет. Вам нужно больше информации в моем вопросе?
Просто вопрос, моя таблица SKU содержит много записей и скрипт долго проходит всю таблицу. Есть ли способ оптимизировать его или вместо этого мне нужно изменить его непосредственно в моей базе данных?