передача значений с помощью ошибки ajax


У меня есть процедура для обновления состояния и баланса документа, это код jquery

$("#invBtnPay").on("click", function (event) {
        alertify.confirm("Pagar Factura", "El Saldo de la Factura es de $" + $("#idt_saldo").text(),
            function () {
                var invoiceStatus = {
                    'inv_id': $("#inv_id").val(),
                    'inv_status': "Pagada",
                    'inv_pay': $("#idt_saldo").text(),
                };
                $.ajax({
                    type: 'POST',
                    url: './core/invoiceStatus.php',
                    data: invoiceStatus,
                    dataType: 'json',
                    encode: true
                })
                    .done(function (invoiceStatus) {
                        if (invoiceStatus.success) {
                            $('#inv_status').addClass('badge badge-warning');
                            $('#inv_status').text(invoiceStatus.status);
                            window.location.href = "account.php?page=adm_add_invoice&title=Facturacion";
                        }
                        else {
                            alertify.error(invoiceStatus.message);
                        }
                    });
            },
            function () {
                alertify.warning('Accion Cancelada!');
            }).set('labels', { ok: 'Hacer el Pago', cancel: 'Cancelar' });

и это php код

<?php
    require_once("../config.php");

    $inv_id = $_POST['inv_id'];
    $inv_status = $_POST['inv_status'];
    $inv_pay = (!isset($_POST['inv_pay']) ? 0 : $_POST['inv_pay']); //toma el valor y lo divide entre 1000

    $update = "UPDATE doc_master SET balance = balance - ?, status = ? WHERE id = ? LIMIT 1"; 
    $stmt = $conn->prepare($update);

    $stmt->bindParam(1, $inv_pay, PDO::PARAM_STR);
    $stmt->bindParam(2, $inv_status, PDO::PARAM_STR);
    $stmt->bindParam(3, $inv_id, PDO::PARAM_INT);

    $stmt->execute();

    $invoiceStatus = []; 

    if($update){
        $invoiceStatus ['success'] = true;
        $invoiceStatus ['invoiceId'] = $inv_id;
        $invoiceStatus ['message'] = "Factura ".$inv_status." con Exito!";
        $invoiceStatus ['status'] = $inv_status;
        echo json_encode($invoiceStatus);
    }
    else
    {
        $invoiceStatus ['success'] = false;
        $invoiceStatus ['message'] = "Algo salio mal, No fue posible actualizar en estado de la Factura!";
        echo json_encode($invoiceStatus);
    }
?>

Как вы видите, я отправляю идентификатор документа ($inv_id), новое состояние ($inv_status) и значение, подлежащее дисконтированию ($inv_pay), и в этом проблема, бывает, что значение 5,300.00 отправляется и в php приходит 5.3, и это значение, которое дисконтируется от общего количества документа таким образом, что баланс остается в 5,294. 70

introducir la descripción de la imagen aquí

на картинке видно, как значения остаются после оплаты

как я могу исправить этот недостаток?

Спасибо за вашу помощь.

Author: Juan Carlos, 2018-04-09

2 answers

То, что вы получаете на сервере, является string, и вы можете преобразовать это значение в float, а затем выполнить вычитание. Для преобразования у вас есть функция floatval. На странице документации у вас есть еще одна функция для рассмотрения разделителя тысяч (среди прочего):

function tofloat($num) {
    $dotPos = strrpos($num, '.');
    $commaPos = strrpos($num, ',');
    $sep = (($dotPos > $commaPos) && $dotPos) ? $dotPos : 
        ((($commaPos > $dotPos) && $commaPos) ? $commaPos : false);

    if (!$sep) {
        return floatval(preg_replace("/[^0-9]/", "", $num));
    } 

    return floatval(
        preg_replace("/[^0-9]/", "", substr($num, 0, $sep)) . '.' .
        preg_replace("/[^0-9]/", "", substr($num, $sep+1, strlen($num)))
    );
}

$num = '1.999,369€';
var_dump(tofloat($num)); // float(1999.369)
$otherNum = '126,564,789.33 m²';
var_dump(tofloat($otherNum)); // float(126564789.33)
////Con tus valores:
$num='5,325.23';
var_dump(tofloat($num)); // float(5325.23)

Demo (со страницы документации, которую я оставил вам):

Затем вы можете взять это значение и вычесть в базе данных.

 0
Author: Mario L, 2018-04-09 15:26:26

Php считывает значение 5,300 как: пять точек 3, а не пять тысяч триста. Это потому, что вы отправляете десятичный разделитель после пятого. Если вы хотите, чтобы вы выполняли функции, вам придется удалить разделитель, чтобы php интерпретировал его как пять тысяч триста.

В разделе отправить: 5,300.00. Вы должны отправить 5300.00.

Попробуйте это:

//..

var invoiceStatus = {
 'inv_id': $("#inv_id").val(),
 'inv_status': "Pagada",
 'inv_pay': $("#idt_saldo").text().replace(',',''), //<-- eliminas el separador , del monto enviado
};

//...
 0
Author: Einer, 2018-04-09 14:02:31