Skocz do zawartości
PL
Szukaj na Pecetowiczu
  • Utwórz konto

Ostatni dzień miesiąca


Rekomendowane odpowiedzi

Skrypt, który ma pokazać ile dni ma dany miesiąc po wskazaniu miesiąca i roku z formularza przez użytkownika.  

Nie wiem gdzie mam błąd. Proszę o poprawienie błędu w kodzie php.

<form action="ostatni_dzien_miesiaca.php" method="post">
<label for="miesiac">Miesiąc:</label>
    <select name="miesiac">
        <?php 
    			 for($l=1; $l<=12;++$l)
    	     echo '<option value="'.$l.'">'.$l.'</option>';
        ?>
    </select></br></br>
	<label for="rok">Rok:</label>
    <select name="rok">
        <?php 
    			 for($i=1900; $i<=2090;++$i)
    	     echo '<option value="'.$i.'">'.$i.'</option>';
        ?>
    </select></br></br>
	     </br></br><input type="submit" name="sprawdz"  value="Sprawdź dzień tygodnia" />
	     </br></br><input type="reset" name="reset"  value="Wyczyść" />
    </form>
<?php
 $rok['rok'] = $miesiac['miesiac'];
        for ($i = 1; $i <= 12; $i++) {
            $miesiac[$i] = date("t", mktime(0, 0, 0, $i, 1, $rok));
        }
		 var_dump($miesiac);
?>
Odnośnik do komentarza
Udostępnij na innych stronach

To musi być `select`?

<?php

declare(strict_types=1);

function getIntFromPost(string $inputName, int $min, int $max): ?int
{
  $options = [
    'default' => null,
    'min_range' => $min,
    'max_range' => $max,
  ];
  
  return filter_var(filter_input(INPUT_POST, $inputName, FILTER_SANITIZE_NUMBER_INT), FILTER_VALIDATE_INT, [
    'options' => $options,
  ]);
}

$month = getIntFromPost('miesiac', 1, 12);
$year = getIntFromPost('rok', 1900, 2090);

if ($month === null || $year === null) {
  return 0;
}

$dateTime = \DateTimeImmutable::createFromFormat('Y.m', sprintf('%d.%d', $year, $month), new \DateTimeZone('Europe/Warsaw'));
return (int)($dateTime->format('t'));
Odnośnik do komentarza
Udostępnij na innych stronach

Ten kod nie działa. 

Użytkownik wybiera z formularza miesiąc  np. czerwiec i rok np. 2020, klika sprawdź. 

Pisze błąd  declare(strict_types=1);

Usunęłam  declare(strict_types=1); klikam sprawdź i nic nie wyświetla.

Powinno mu się wyświetlić 30 a tu nic się nie wyświetla

Odnośnik do komentarza
Udostępnij na innych stronach

51 minut temu, Marta Długa napisał:

Pisze błąd  declare(strict_types=1);

To jaką Ty masz wersję PHP?

A to, że się nie wyświetla, to przez to, że są return (dwa ostatnie), a nie echo.

Odnośnik do komentarza
Udostępnij na innych stronach

Korzystam z xamp i pisze kod w notepad++

Odnośnik do komentarza
Udostępnij na innych stronach

2 minuty temu, Marta Długa napisał:

Korzystam z xamp

No ale aktualny Xampp ma wersję PHP 7.4 z tego co widzę: https://www.apachefriends.org/pl/download.html

Odnośnik do komentarza
Udostępnij na innych stronach

Tak aktualny instalowałam najnowszą wersje

Nie przyjmuje declare(strict_types=1); wywala błąd

Jest jakiś inny łatwiejszy sposób dla początkujących ?

Odnośnik do komentarza
Udostępnij na innych stronach

34 minuty temu, Marta Długa napisał:

Nie przyjmuje declare(strict_types=1); wywala błąd

Daj konkretną treść błędu.

34 minuty temu, Marta Długa napisał:

Jest jakiś inny łatwiejszy sposób dla początkujących ?

Pewnie że jest - strukturalnie. Podobnie jak zrobiłaś to z 'kalkulatorem'.

Tylko, że w swoim kodzie nawet nie odebrałaś danych z formularza. Nie wiem też po co tam jest ta pętla.

Odnośnik do komentarza
Udostępnij na innych stronach

Błąd 

Fatal error: strict_types declaration must be the very first statement in the script in C:\xampp\htdocs\Data\ostatni_dzien_miesiaca.php on line 21

Odnośnik do komentarza
Udostępnij na innych stronach

No, musi być na samym początku. Co masz wcześniej?

Odnośnik do komentarza
Udostępnij na innych stronach

Po zmianie na echo błąd

Fatal error: strict_types declaration must be the very first statement in the script in C:\xampp\htdocs\Data\ostatni_dzien_miesiaca.php on line 21

Na początku html i podnim php.

 <form action="ostatni_dzien_miesiaca.php" method="post">
<label for="miesiac">Miesiąc:</label>
    <select name="miesiac">
        <?php 
    			 for($l=1; $l<=12;++$l)
    	     echo '<option value="'.$l.'">'.$l.'</option>';
        ?>
    </select></br></br>
	<label for="rok">Rok:</label>
    <select name="rok">
        <?php 
    			 for($i=1900; $i<=2090;++$i)
    	     echo '<option value="'.$i.'">'.$i.'</option>';
        ?>
    </select></br></br>
	     </br></br><input type="submit" name="sprawdz"  value="Sprawdź" />
	     </br></br><input type="reset" name="reset"  value="Wyczyść" />
    </form>
<?php

declare(strict_types=1);

function getIntFromPost(string $inputName, int $min, int $max): ?int
{
  $options = [
    'default' => null,
    'min_range' => $min,
    'max_range' => $max,
  ];
  
  echo filter_var(filter_input(INPUT_POST, $inputName, FILTER_SANITIZE_NUMBER_INT), FILTER_VALIDATE_INT, [
    'options' => $options,
  ]);
}

$month = getIntFromPost('miesiac', 1, 12);
$year = getIntFromPost('rok', 1900, 2090);

if ($month === null || $year === null) {
  echo 0;
}

$dateTime = \DateTimeImmutable::createFromFormat('Y.m', sprintf('%d.%d', $year, $month), new \DateTimeZone('Europe/Warsaw'));
echo (int)($dateTime->format('t')); 
 ?>

Dałam na początek przed html

<?php
 declare(strict_types=1);
 ?>

I nadal błąd Fatal error: strict_types declaration must be the very first statement in the script in C:\xampp\htdocs\Data\ostatni_dzien_miesiaca.php on line 2

Poproszę o kod prościejszy bo ten jest dla mnie nie zrozumiały. Dopiero się uczę

Odnośnik do komentarza
Udostępnij na innych stronach

<?php

declare(strict_types=1);

function getIntFromPost(string $inputName, ?int $min = null, ?int $max = null): ?int
{
  $options = [];
  $options['default'] = null;

  if ($min !== null) {
    $options['min_range'] = $min;
  }

  if ($max !== null) {
    $options['max_range'] = $max;
  }

  return filter_var(filter_input(INPUT_POST, $inputName, FILTER_SANITIZE_NUMBER_INT), FILTER_VALIDATE_INT, [
    'options' => $options,
  ]);
}

$month = getIntFromPost('miesiac', 1, 12);
$year = getIntFromPost('rok', 1900, 2090);
$days = 0;

if ($month !== null && $year !== null) {
  $dateTime = \DateTimeImmutable::createFromFormat('Y.m', sprintf('%d.%d', $year, $month), new \DateTimeZone('Europe/Warsaw'));
  $days = (int)($dateTime->format('t')); 
}

if ($days > 0) {
  echo sprintf('Ilość dni w mięsiącu: %d', $days);
}

?>

<form action="ostatni_dzien_miesiaca.php" method="post">
  <label for="miesiac">Miesiąc:</label>
  <select name="miesiac">
    <?php 
    for($m = 1; $m <= 12; $m++) {
      echo '<option value="' . $m . '">' . $m . '</option>';
    }
    ?>
  </select>
  <label for="rok">Rok:</label>
  <select name="rok">
    <?php 
    for($y = 1900; $y <= 2090; $y++) {
      echo '<option value="' . $y . '">' . $y . '</option>';
    }
    ?>
  </select>
  <input type="submit" name="sprawdz"  value="Sprawdź" />
  <input type="reset" name="reset"  value="Wyczyść" />
</form>
Odnośnik do komentarza
Udostępnij na innych stronach

Nadal błąd declare(strict_types=1);

Fatal error: strict_types declaration must be the very first statement in the script in C:\xampp\htdocs\Data\ostatni_dzien_miesiaca.php on line 3

Poproszę o kod bez declare(strict_types=1).

To ma być kod dla początkujących łatwy do zrozumienia.

Ten kod jest niezrozumiały.

Odnośnik do komentarza
Udostępnij na innych stronach

Przecież ten kod działa. Testowałem go u siebie... Sprawdź czy plik masz w dobrym kodowaniu: UTF-8 (bez BOM).

Czego nie rozumiesz w tym kodzie? To Ci wytłumaczę.

Ewentualnie staraj się napisać kod samej, a później odezwij się w temacie. Odebrałaś dane z formularza w poprzednim temacie, więc tutaj też nie powinnaś mieć problemu.

Odnośnik do komentarza
Udostępnij na innych stronach

Już mam o to mi chodziło kod łatwy i zrozumiały.

<form action="ostatni_dzien_miesiaca.php" method="post">
<label for="miesiac">Miesiąc:</label>
    <select name="miesiac">
        <?php
                 for($l=1;$l<=12;++$l)
             echo '<option value="'.$l.'">'.$l.'</option>';
        ?>
    </select></br></br>
	<label for="rok">Rok:</label>
    <select name="rok">
        <?php
                 for($i=1900;$i<=2090;++$i)
             echo '<option value="'.$i.'">'.$i.'</option>';
        ?>
    </select></br></br>
         </br></br><input type="submit" name="sprawdz"  value="Sprawdź dzień tygodnia" />
         </br></br><input type="reset" name="reset"  value="Wyczyść" />
    </form>
<?php
	$miesiac = date('t', strtotime($_POST['miesiac'] . '/1'));
 echo "Wybrany miesiąc ma ".  $miesiac . "dni." ;
?>

Jak zamienić cyferki na miesiące?

Odnośnik do komentarza
Udostępnij na innych stronach

33 minuty temu, Marta Długa napisał:

Jak zamienić cyferki na miesiące?

Na przykład za pomocą switch.

Odnośnik do komentarza
Udostępnij na innych stronach

Nie pokazuje błędu , ale nadal pokazuje cyfry zamiast miesiące. Prosze o pomoc

<form action="ostatni_dzien_miesiaca.php" method="post">
<label for="miesiac">Miesiąc:</label>
    <select name="miesiac">
        <?php
                 for($l=1;$l<=12;++$l)
             echo '<option value="'.$l.'">'.$l.'</option>';
		 switch ($l) {
        case '01': $l = 'stycze?'; break;
        case '02': $l = 'luty'; break;
        case '03': $l = 'marzec'; break;
        case '04': $l = 'kwiecie?'; break;
        case '05': $l = 'maj'; break;
        case '06': $l = 'czerwiec'; break;
        case '07': $l = 'lipiec'; break;
        case '08': $l = 'sierpie?'; break;
        case '09': $l = 'wrzesie?'; break;
        case '10': $l = 'pa?dziernik'; break;
        case '11': $l = 'listopad'; break;
        case '12': $l = 'grudzie?'; break;
      
    } 
        ?>
    </select></br></br>
	<label for="rok">Rok:</label>
    <select name="rok">
        <?php
                 for($i=1900;$i<=2090;++$i)
             echo '<option value="'.$i.'">'.$i.'</option>';
        ?>
    </select></br></br>
         </br></br><input type="submit" name="sprawdz"  value="Sprawdź dzień tygodnia" />
         </br></br><input type="reset" name="reset"  value="Wyczyść" />
    </form>

<?php

	$miesiac = date('t', strtotime($_POST['miesiac'] . '/1'));
 echo "Wybrany miesiąc ma ".  $miesiac . "dni." ;
 
?>
Odnośnik do komentarza
Udostępnij na innych stronach

1 godzinę temu, Marta Długa napisał:

Jak zamienić cyferki na miesiące?

Najwygodniej użyć tablicy. Wtedy `select` będzie wyglądać tak:

<?php
$months = ['Styczeń', 'Luty', 'Marzec', 'Kwiecień', 'Maj', 'Czerwiec', 'Lipiec', 'Sierpień', 'Wrzesień', 'Piździernik', 'Listopad', 'Grudzień'];
?>

<select name="miesiac">
  <?php
  foreach ($months as $number => $monthName) {
    echo '<option value="' . $number + 1 . '">' . $monthName . '</option>';
  }
  ?>
</select>

Polecam zabrać się za 'czyste' programowanie. Nie rozumiesz podstaw, więc będzie ciężko Ci zrozumieć niektóre mechanizmy. Najlepiej zacząć od C++ i programowania strukturalnego w konsoli.

Nie możesz użyć zmiennej wcześniej niż jej deklaracja, bo będzie rzucać błędem.

Tak samo ze switch() - użyłaś instrukcji po samym wyświetleniu `option`.

Odnośnik do komentarza
Udostępnij na innych stronach

13 minut temu, Marta Długa napisał:

Nie pokazuje błędu , ale nadal pokazuje cyfry zamiast miesiące. Prosze o pomoc


<form action="ostatni_dzien_miesiaca.php" method="post">
<label for="miesiac">Miesiąc:</label>
    <select name="miesiac">
        <?php
                 for($l=1;$l<=12;++$l)
             echo '<option value="'.$l.'">'.$l.'</option>';
		 switch ($l) {
        case '01': $l = 'stycze?'; break;
        case '02': $l = 'luty'; break;
        case '03': $l = 'marzec'; break;
        case '04': $l = 'kwiecie?'; break;
        case '05': $l = 'maj'; break;
        case '06': $l = 'czerwiec'; break;
        case '07': $l = 'lipiec'; break;
        case '08': $l = 'sierpie?'; break;
        case '09': $l = 'wrzesie?'; break;
        case '10': $l = 'pa?dziernik'; break;
        case '11': $l = 'listopad'; break;
        case '12': $l = 'grudzie?'; break;
      
    } 
        ?>
    </select></br></br>
	<label for="rok">Rok:</label>
    <select name="rok">
        <?php
                 for($i=1900;$i<=2090;++$i)
             echo '<option value="'.$i.'">'.$i.'</option>';
        ?>
    </select></br></br>
         </br></br><input type="submit" name="sprawdz"  value="Sprawdź dzień tygodnia" />
         </br></br><input type="reset" name="reset"  value="Wyczyść" />
    </form>

<?php

	$miesiac = date('t', strtotime($_POST['miesiac'] . '/1'));
 echo "Wybrany miesiąc ma ".  $miesiac . "dni." ;
 
?>

 

Bo zmieniasz je po wyświetleniu. Zmienną $l bierze wtedy z pętli.

Odnośnik do komentarza
Udostępnij na innych stronach

7 minut temu, -n3veR napisał:

Polecam zabrać się za 'czyste' programowanie. Nie rozumiesz podstaw, więc będzie ciężko Ci zrozumieć niektóre mechanizmy. Najlepiej zacząć od C++ i programowania strukturalnego w konsoli.

Zaczynałam od C++ ale tam jeszcze gorzej mi szło. 

Zależy mi na nauczeniu się PHP bo chce projektować strony . 

U mnie jest problem taki że nie wiem co do czego wykorzystać.

Odnośnik do komentarza
Udostępnij na innych stronach

1 minutę temu, Marta Długa napisał:

U mnie jest problem taki że nie wiem co do czego wykorzystać.

Cieszę się, że masz determinację i wiesz co chcesz robić w przyszłości, ale zacznij od kursów i tutoriali - będziesz mniej sfrustrowana 'nierozumieniem'.

Mamy sporo tematów z tego zakresu.

Odnośnik do komentarza
Udostępnij na innych stronach

Przeczytałam wszystkie kursy w internecie  chyba . 

Odnośnik do komentarza
Udostępnij na innych stronach

Przeczytać a przeczytać i zrozumieć to dwie różne rzeczy. Nie jestem za bardzo w temacie, ale przede wszystkim podstawy. Bez podstaw ciężko będzie cokolwiek pojąć.

14 minut temu, Marta Długa napisał:

Zależy mi na nauczeniu się PHP bo chce projektować strony . 

Jeśli chcesz projektować strony pod względem wizualnym to PHP na wstępnym etapie jest zbędne.

Tutaj wchodzi tak zwany UI (wygląd strony) oraz UX (to jakie odczucia ma użytkownik korzystając ze strony) oraz HTML, CSS oraz JS - dzięki temu projektuje się strony wizualnie. W wersji statycznej nic nie jest więcej potrzebne.

Potem można zacząć wchodzić na wyższy poziom ucząc się frameworków do JS (React, Vue, Angular) lub wspomnianego tutaj PHP i także jego frameworków.

Obie te części rozdziela się na kilka sekcji.

Front-end - HTML, CSS, JS + frameworki

Back-end - bazy danych, PHP + frameworki

Full-stack - wszystko co wyżej + duża znajomość rzeczy z programowania

Na początkowym etapie warto sobie zadać pytanie, co chcę robić programując/kodując bo potem można sobie nieźle w bani namieszać.

Odnośnik do komentarza
Udostępnij na innych stronach

Najpierw nauczyłam się HTML  i CSS z tym problemu nie miałam.

Chce wszystko robić co jest związane z html i CSS ale żeby przyjęli mnie do pracy musze znać jeszcze PHP i JS.

Odnośnik do komentarza
Udostępnij na innych stronach

@Marta Długa nie wiem na jakim poziomie masz angielski, więc podrzucam video po polsku: 

Odnośnik do komentarza
Udostępnij na innych stronach

Kontynuuj dyskusję

Dołącz do Pecetowicza, aby kontynuować dyskusję w tym wątku.

  • Dodaj nową pozycję...
  • Dodaj nową pozycję...