Ustwienie wartości kolumn tabeli bazy

0

Dzień dobry, chciałbym poniższym kodem ustawić w tabeli datę początku subskrypcji (data_oplac), okres trwania subskrypcji (czas_subskr) oraz datę końca (koniec_subskr).
Kolumny „data_oplac” oraz “koniec_subskr” mają format „date” i domyślną wartość NULL. Kolumna „czas_subskr” ma format INT w wartość domyślną 0.
Wykonanie poniższego kodu nie generuje błędów ale tez nic nie zmienia w tabeli.
Będę wdzięczny za wszelkie sugestie.

<?php
$uczestnik[0] ['nip'] = $_POST['nip_0'];                // identyfikacja uczestnika        
$uczestnik[0] ['data'] = $_POST['data_0'];              // data początku subskrypcji w formacie 2024-07-26
$uczestnik[0] ['status_opl'] = $_POST['status_opl_0'];  // okres subskrypcji 6 lub 12 (miesięcy)

$uczestnik[1] ['nip'] = $_POST['nip_1'];
$uczestnik[1] ['data'] = $_POST['data_1'];
$uczestnik[1] ['status_opl'] = $_POST['status_opl_1'];

$uczestnik[2] ['nip'] = $_POST['nip_2'];
$uczestnik[2] ['data'] = $_POST['data_2'];
$uczestnik[2] ['status_opl'] = $_POST['status_opl_2'];

foreach ($uczestnik as $numer_indeksu){                 

    $uczestnik_nip = $numer_indeksu['nip'];
    $uczestnik_data = $numer_indeksu['data'];
    $okres_sub = $numer_indeksu['status_opl'];
    $okres_sub = 'P'.$okres_sub.'M';                     // ustawienie wymaganego formatu P6M lub P12M
    $poczatek = new DateTime($uczestnik_data);                              
    $okres = new DateInterval($okres_sub);               // ustawienie okresu subskrypcji (6 lub 12 m-cy)
    $koniec =  new DateTime($uczestnik_data);  
    $koniec->add($okres);                                // ustawienie daty końca okresu subskrupcji

    $sql = "UPDATE sprzedajacy
            SET data_oplac = :data_op,    czas_subskr = :czas_sub,    koniec_subskr = :koniec_sub
            WHERE NIP = :nip ;";

    $instrukcja = $pdo->prepare($sql);
    $instrukcja->bindValue('nip', $uczestnik_nip, PDO::PARAM_INT);
    $instrukcja->bindValue('data_op', $uczestnik_data, PDO::PARAM_STR);
    $instrukcja->bindParam('czas_sub', $okres, PDO::PARAM_INT);       
    $instrukcja->bindParam('koniec_sub', $koniec, PDO::PARAM_STR);
    $instrukcja->execute();
}
?>
2

To co pobierasz z POST aż prosi się o pętlę.
Na pewno NiP nie powinien być Intem.
Może tu po konwersji nie wyszukuje Ci wierszy przez co update się nie wykona.
NIP trzymaj i w bazie i w kodzie jako string.
DateTimeInteravl to obiekt. Musisz wyciągnąć z niego taką wartość jaką chcesz zapisać w bazie. SQL się sam nie domyśli się co tam wpisać.
Raczej w bazie powinieneś trzymać koniec subskrypcji i jak już wyciągać okres zakończenia z daty startu lub obecnej i daty końca.

Na wszelki wypadek zobacz czy nie masz błędów SQL.
Dodaj:

$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

Pro tip.
Waliduj. Jeśli np. w POST nie masz wszystkich danych lub są one nie prawidłowe reszta kodu się nie powinna wykonywać. NIP raczej powinien mieć określoną długość. Daty nie powinny być np. z przeszłości itd.
Bez walidacji też narażasz kod na różne potencjalne luki.

0

Twoja odpowiedź okazała się trafna Dziękuję. Metoda format() i rzutowanie typu załatwiło sprawę.
Opcję PDO::ERRMODE_EXCEPTION mam ustawioną w obiekcie PDO od początku pracy.
Chciałem jeszcze zapytać, dlaczego nie zalecasz numeru NIP jako INT? W formularzu niejako wymuszam NIP ograniczając znaki do 10 i informuję w opisie, że NIP bez kresek.
Pozdrawiam

1

NIP pomimo, że skalda się z cyfr jest identyfikatorem a nie liczbą. Czy kiedykolwiek wykonasz operacje matematyczne na NIP? Np. je dodasz?
Idąc dalej masz NIP europejski gdzie zaczyna się on od PL.
W Intach miałbyś problem jeśli NIP miałby wiodące zero np. 00123456 stałoby się 123456
NIP będziesz raczej walidować pod kątem długości a to też łatwiej robić na string.

0

Rozumiem

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.