Сохранять всю стоимость, полученные с simplexml

У меня есть деталь, попробовав сохранять всю стоимость, полученную с xml (счет)

Код идет что-либо подобное: Я получаю данные simplexml, который властвовал посредством post.

$filex = $_FILES['myfile']['tmp_name'];
$ID = $_POST['numero_factura'];
$numero_factura_u = $ID;
$xml = simplexml_load_file($filex); 
$ns = $xml->getNamespaces(true);
$xml->registerXPathNamespace('cfdi', $ns['cfdi']);
$xml->registerXPathNamespace('t', $ns['tfd']);

Esmpiezo в asiganr переменные во все полученные данные о счете.

foreach ($xml->xpath('//cfdi:Comprobante//cfdi:Emisor') as $Emisor){
    $emisor=$Emisor['Rfc'];  
    $emisor_nombre=$Emisor['Nombre'];
    } 
foreach ($xml->xpath('//cfdi:Comprobante//cfdi:Emisor//cfdi:DomicilioFiscal') as $DomicilioFiscal){ 
    $emisor_pais=$DomicilioFiscal['Pais']; 
    $emisor_calle=$DomicilioFiscal['Calle']; 
    $emisor_estado=$DomicilioFiscal['Estado']; 
    $emisor_colonia=$DomicilioFiscal['Colonia']; 
    $emisor_municipio=$DomicilioFiscal['Municipio']; 
    $emisor_noexterior=$DomicilioFiscal['NoExterior']; 
    $emisor_codigopostal=$DomicilioFiscal['CodigoPostal'];
    }
foreach ($xml->xpath('//cfdi:Comprobante//cfdi:Receptor') as $Receptor){
    $receptor=$Receptor['Rfc'];
    $receptor_nombre=$Receptor['Nombre'];
    }

foreach ($xml->xpath('//cfdi:Comprobante//cfdi:Conceptos//cfdi:Concepto') as $Concepto){ 
    $concepto_unidad=$Concepto['Unidad']; 
    $concepto_importe=$Concepto['Importe']; 
    $concepto_cantidad=$Concepto['Cantidad']; 
    $concepto_descripcion=$Concepto['Descripcion']; 
    $concepto_valorunitario=$Concepto['ValorUnitario'];
    }     
foreach ($xml->xpath('//cfdi:Comprobante//cfdi:Impuestos//cfdi:Traslados//cfdi:Traslado') as $Traslado){ 
    $traslado_tasa=$Traslado['Tasa'];
    $traslado_importe=$Traslado['Importe'];
    $traslado_impuesto=$Traslado['Impuesto']; 
    }
foreach ($xml->xpath('//t:TimbreFiscalDigital') as $tfd) {
    $tfd_sellocfd=$tfd['SelloCFD']; 
    $tfd_fechatimbrado=$tfd['FechaTimbrado']; 
    $uuid=$tfd['UUID']; 
    $tfd_nocertificadoSAT=$tfd['NoCertificadoSAT']; 
    $tfd_Version=$tfd['Version']; 
    $tfd_SelloSAT=$tfd['SelloSAT'];
    }

Позже я реализую консультацию, чтобы вводить данные в базе данных:

$insertxml=mysqli_query($con,"INSERT INTO 
            xml (
            id_oc, 
            cfdi_version, 
            cfdi_fecha, 
            cfdi_sello, 
            emisor, 
            emisor_nombre,
            concepto_unidad, 
            concepto_importe, 
            concepto_cantidad, 
            concepto_descripcion, 
            concepto_valorunitario
            )

            VALUES (
            '$numero_factura_u', 
            '$cfdi_version', 
            '$cfdi_fecha', 
            '$cfdi_sello', 
            '$emisor', 
            '$emisor_nombre',
            '$concepto_unidad', 
            '$concepto_importe', 
            '$concepto_cantidad', 
            '$concepto_descripcion',
            '$concepto_valorunitario'
            );");

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

но я немного потерян в теме.

Заранее большое спасибо.

0
задан 26.11.2019, 23:38
1 ответ

Первое, я automatizarГ - в стоимость, которая извлекается из XML:

$grupos = [
  [
    'grupo' => 'emisor',
    'xpath' => '//cfdi:Comprobante//cfdi:Emisor',
    'campos' = ['Rfc', 'Nombre'],
  ],
  [
    'grupo' => 'emisor',
    'xpath' => '//cfdi:Comprobante//cfdi:Emisor//cfdi:DomicilioFiscal',
    'campos' = ['Pais', 'Calle', 'Estado', 'Colonia', 'Municipio', 'NoExterior', 'CodigoPostal'],
  ],
  // y así...
];
$datos = [];
foreach ($grupos as $grupo) {
  foreach ($xml->xpath($grupo['xpath']) as $index => $xmldata) {
    // aquí creo que es donde no consigues extraer varias entradas
    // pero no estoy seguro
    if ( !isset($datos[$index]) ) {
      $datos[$index] = [];
    }
    foreach ($grupo['campos'] as $campo) {
      $datos[$index][$grupo['grupo'] . '_' . strtolower($campo)] = $xmldata[$campo];  
    }
  }
}

Потом, уже ты можешь делать несколько inserts:

$campos = '(id_oc, cfdi_version, cfdi_fecha, cfdi_sello, emisor, emisor_nombre, concepto_unidad, concepto_importe, concepto_cantidad, concepto_descripcion, concepto_valorunitario)';
$valores = '(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)'; // 11 valores

foreach ($datos as $elemento) {
  $insertxml = $mysqli->prepare("INSERT INTO xml $campos VALUES $valores");
  $insertxml->bind_param("si",
    $numero_factura_u,
    $cfdi_version, // estos tres cfdi_* no se dabe de dónde salen
    $cfdi_fecha, 
    $cfdi_sello, 
    $elemento['emisor_rfc'],
    $elemento['emisor_nombre'],
    $elemento['concepto_unidad'], 
    $elemento['concepto_importe'], 
    $elemento['concepto_cantidad'], 
    $elemento['concepto_descripcion'],
    $elemento['concepto_valorunitario']
  );
  $insertxml->execute();
  $insertxml->close();
}
0
ответ дан 01.12.2019, 10:47

Теги

Похожие вопросы