Невозможно сохранить последние четыре цифры карты в базе данных - PullRequest
0 голосов
/ 12 марта 2020

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

 $return_code = Payment::where('id', $transactionId)->update([
            'return_code' => $status,
            'return_message' => $status == 'success'? 'Successfully Captured': 'Payment Failed - ' .$errorMessage,
            'tx_ref' => $transactionReference,
            'transaction_amount' => !empty($amount) ? $amount : 0.00,
            'brand' => $cardType,
            'last4' => str_pad(substr($maskedPAN, -4), strlen(4), '*', STR_PAD_LEFT),
            'holder' => $cardholderName,
            'expiry' => $expiry,
            'payment_gateway' => 3,
        ]);

        return $status == 'success'?true : false;

Из этого кода он сохраняет последние четыре цифры в базе данных, только если последние четыре цифры начинаются без нуля . Это означает, что если номер карты равен 4111 1111 1111 1 111, он сохраняется в базе данных как 1111 .

Но, если последние четыре цифры карта начинается с нуля , она сохраняет только 111 в базу данных. Это означает, что если номер карты равен 4000 4000 0000 0 111, то в базу данных сохраняется только 111 .

Пожалуйста, помогите мне сохранить последние четыре цифры карта, даже если последние четыре цифры начинаются с нуля 4000 4000 0000 0 111.

Спасибо.

Ответы [ 3 ]

1 голос
/ 12 марта 2020

Использование int в качестве типа данных удалит нули слева.

Если вам нужно сохранить его, вы должны перейти на varchar.

В laravel вы можете создать миграцию чтобы изменить его (https://laravel.com/docs/5.8/migrations#modifying -колонки ):

public function up()
{
    Schema::table('myTable', function (Blueprint $table) {
        $table->string('last4', 4)->change();
    });
}

Вам может потребоваться выполнить composer require doctrine/dbal

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

0 голосов
/ 12 марта 2020

Поскольку вы не можете изменить тип поля таблицы с int на varchar, лучшим решением было бы сохранить ваше значение как int, например

$return_code = Payment::where('id', $transactionId)->update([
               // other fields
               'last4' => (int)substr($maskedPAN, -4),
               // other fields
               ]);

return $status == 'success'?true : false;

Тогда , всегда используйте метод, который возвращает требуемое количество цифр для извлечения поля last4 из Payment

function getLast4($intval) {
    return str_pad($intval, 4, 0, STR_PAD_LEFT);
}

$var = Payment::where('id', $transactionId)->pluck('last4');
$last4 = getLast4($var[0]);
0 голосов
/ 12 марта 2020

Полагаю, вы используете MySQL.

Поскольку ваш столбец это INT, вы не можете, потому что это число, а число не сохраняется с нулями слева, если только Вы указываете столбец ZEROFILL int. Что вы можете сделать, это изменить его, ALTER столбец и добавить ZEROFILL к столбцу (без изменения типа), чтобы заполнить нулями, когда число меньше 4 цифр.

Также, INT(4) не означает, что принимаются только 0 или 4 цифры, вы даже можете хранить 20 или более 4 цифр, его диапазон не меняется, вам следует прочитать this , чтобы лучше понять его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...