Использование результата PHP для нового файла - PullRequest
0 голосов
/ 03 января 2019

Мой вопрос о том, как мне правильно распечатать результат моего ответа PHP. Что я делаю, так это запрашиваю данные с сервера, используя пару параметров, которые я беру из CSV-файла, и это работает, но на выходе это не дружественный пользователь. Это мой сценарий:

<?php
 $file = fopen("fac_vig2.csv","r");

 while (($data = fgetcsv($file)) !== FALSE) {

     $emisor = $data[0];
     $receptor = $data[1];
     $total = $data[2];
     $uuid = $data[3];

     echo "FACTURA $uuid";

     $soap = sprintf('<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/"><soapenv:Header/><soapenv:Body><tem:           Consulta><tem:expresionImpresa>?re=%s&amp;rr=%s&amp;tt=%s&amp;id=%s</tem:expresionImpresa></tem:Consulta></soapenv:Body></soapenv:Envelope>', $emisor,$receptor,$total,         $uuid);    //encabezados
     $headers = [
     'Content-Type: text/xml;charset=utf-8',
     'SOAPAction: http://tempuri.org/IConsultaCFDIService/Consulta',
     'Content-length: '.strlen($soap)
     ];

     $url = 'https://consultaqr.facturaelectronica.sat.gob.mx/ConsultaCFDIService.svc';
     $ch = curl_init();
     curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1);
     curl_setopt($ch, CURLOPT_URL, $url);
     curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
     curl_setopt($ch, CURLOPT_POST, true);
     curl_setopt($ch, CURLOPT_POSTFIELDS, $soap);
     curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
     curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
     curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
     $res = curl_exec($ch);
     curl_close($ch);
     $xml = simplexml_load_string($res);
     $data = $xml->children('s', true)->children('', true)->children('', true);
     $data = json_encode($data->children('a', true), JSON_UNESCAPED_UNICODE);
     print_r(json_decode($data));

 }

 fclose($file)

 ?>

И результат этого следующий:

PHP Warning:  PHP Startup: Unable to load dynamic library 'xmlrpc' (tried: /usr/lib/php/20170718/xmlrpc (/usr/lib/php/20170718/xmlrpc: cannot open shared object file: No such file or directory), /usr/lib/php/20170718/xmlrpc.so (/usr/lib/php/20170718/xmlrpc.so: cannot open shared object file: No such file or directory)) in Unknown on line 0
FACTURA 34243316-AD33-493A-A41C-6ABC94D67EA4stdClass Object
(
    [CodigoEstatus] => S - Comprobante obtenido satisfactoriamente.
    [EsCancelable] => Cancelable con aceptación
    [Estado] => Vigente
    [EstatusCancelacion] => stdClass Object
        (
        )

)
FACTURA 9DA24941-ACD0-4640-B9EC-DEE508867779stdClass Object
(
    [CodigoEstatus] => S - Comprobante obtenido satisfactoriamente.
    [EsCancelable] => Cancelable con aceptación
    [Estado] => Vigente
    [EstatusCancelacion] => stdClass Object
        (
        )

)
FACTURA CEBB0FEE-9FA5-413B-A333-57085FFBD881stdClass Object
(
    [CodigoEstatus] => S - Comprobante obtenido satisfactoriamente.
    [EsCancelable] => Cancelable con aceptación
    [Estado] => Vigente
    [EstatusCancelacion] => stdClass Object
        (
        )

)

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

PHP Warning:  PHP Startup: Unable to load dynamic library 'xmlrpc' (tried: /usr/lib/php/20170718/xmlrpc (/usr/lib/php/20170718/xmlrpc: cannot open shared object file: No such file or directory), /usr/lib/php/20170718/xmlrpc.so (/usr/lib/php/20170718/xmlrpc.so: cannot open shared object file: No such file or directory)) in Unknown on line 0
FACTURA 34243316-AD33-493A-A41C-6ABC94D67EA4object(stdClass)#3 (4) {
  ["CodigoEstatus"]=>
  string(44) "S - Comprobante obtenido satisfactoriamente."
  ["EsCancelable"]=>
  string(26) "Cancelable con aceptación"
  ["Estado"]=>
  string(7) "Vigente"
  ["EstatusCancelacion"]=>
  object(stdClass)#4 (0) {
  }
}
FACTURA 9DA24941-ACD0-4640-B9EC-DEE508867779object(stdClass)#4 (4) {
  ["CodigoEstatus"]=>
  string(44) "S - Comprobante obtenido satisfactoriamente."
  ["EsCancelable"]=>
  string(26) "Cancelable con aceptación"
  ["Estado"]=>
  string(7) "Vigente"
  ["EstatusCancelacion"]=>
  object(stdClass)#2 (0) {
  }
}
FACTURA CEBB0FEE-9FA5-413B-A333-57085FFBD881object(stdClass)#2 (4) {
  ["CodigoEstatus"]=>
  string(44) "S - Comprobante obtenido satisfactoriamente."
  ["EsCancelable"]=>
  string(26) "Cancelable con aceptación"
  ["Estado"]=>
  string(7) "Vigente"
  ["EstatusCancelacion"]=>
  object(stdClass)#1 (0) {
  }
}

Есть идеи, как я могу использовать вывод?

Спасибо заранее!

Ответы [ 2 ]

0 голосов
/ 03 января 2019

Как сказал @MarcosAM в предыдущем ответе, лучше получать значения из XML напрямую. Я использовал $data = $xml->children('s', true)->children('', true)->children('', true)->children('a', true);, чтобы добраться до нужного дочернего объекта, а затем просто присвоил нужные значения переменным $estatus = $data->CodigoEstatus;.

Как только вы это сделаете, просто нужно использовать file_put_contents и присвоить переменные, которые вы хотели, строковой переменной file_put_contents('validacion_facturas.csv', $resultado.PHP_EOL , FILE_APPEND | LOCK_EX); Я использовал _FILE_APPEND_, чтобы продолжать запись в тот же файл и создавать заголовки в начале скрипта.

Это последний сценарий, если он хорош:

<?php
libxml_use_internal_errors(true);

$file = fopen("foo.csv","r");
$headers = "EMISOR,RECEPTOR,TOTAL,UUID,ESTATUS,ESTADO,CANCELABLE,ESTATUS CANCELACION";

file_put_contents('validacion_facturas.csv', $headers.PHP_EOL , FILE_APPEND | LOCK_EX);

while (($data = fgetcsv($file)) !== FALSE) {

    $emisor = $data[0];
    $receptor = $data[1]; 
    $total = $data[2];
    $uuid = $data[3];

    $soap = sprintf('<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/"><soapenv:Header/><soapenv:Body><tem:Consulta><tem:expresionImpresa>?re=%s&amp;rr=%s&amp;tt=%s&amp;id=%s</tem:expresionImpresa></tem:Consulta></soapenv:Body></soapenv:Envelope>', $emisor,$receptor,$total,$uuid);    //encabezados
    $headers = [
    'Content-Type: text/xml;charset=utf-8',
    'SOAPAction: http://tempuri.org/IConsultaCFDIService/Consulta',
    'Content-length: '.strlen($soap)
    ];

    $url = 'https://consultaqr.facturaelectronica.sat.gob.mx/ConsultaCFDIService.svc';
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1);
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $soap);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    $res = curl_exec($ch);
    curl_close($ch);
    $xml = simplexml_load_string($res);
    if ($xml === false) {
        echo "Failed loading XML: ";
        foreach(libxml_get_errors() as $error) {
            echo "<br>", $error->message;
        }
    }
    else {
       $data = $xml->children('s', true)->children('', true)->children('', true)->children('a', true);
       $estatus = $data->CodigoEstatus;
       $cancelable = $data->EsCancelable;
       $estado = $data->Estado;
       $estatus_cancelacion = $data->EstatusCancelacion;

    }

    $resultado = "$emisor,$receptor,$total,$uuid,$estatus,$estado,$cancelable,$estatus_cancelacion";

    file_put_contents('validacion_facturas.csv', $resultado.PHP_EOL , FILE_APPEND | LOCK_EX); 

}

fclose($file)

?>
0 голосов
/ 03 января 2019

Вероятно, вы следуете методу, используемому в этом сообщении .

Но вы можете получить значения непосредственно из XML внутри цикла while, используя объект Simple XML, и сохранять значения вмассив, вы можете увидеть более подробную информацию о том, как получить доступ к значениям узла здесь .

Небольшой короткий пример:

<?php
 $file = fopen("fac_vig2.csv","r");
 $arr_data = [];

 while (($data = fgetcsv($file)) !== FALSE) {
     ...
     $data = $xml->children('s', true)->children('', true)->children('', true);
     $data = $data->children('a', true);

     $arr_data[] = [
              'CodigoEstatus' => $data->CodigoEstatus,
              'EsCancelable' => $data->EsCancelable,
              ...
     ];
 }

После этого вы можете сгенерировать CSVподайте файл «на лету» или сохраните его где-нибудь, используя значения $ arr_data .

Надеюсь, что-то поможет ...

...