• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Php problem z przesyłem danych

VPS Starter Arubacloud
0 głosów
345 wizyt
pytanie zadane 20 września 2016 w PHP przez Ditrix Mądrala (5,650 p.)

Witam!

Na lekcji programowania robiliśmy proste ćwiczenie (przygotowanie do e.14). Mieliśmy za zadanie przesłać zawartość formularza metodą post do pliku php. Nauczyciel pokazał nam wygodna metodę.

Wygląda ona tak.

echo "Faktura: ".($_POST['faktura'] == 'on' ? 'Tak' : 'Nie')."<br>";

I odnosi się to do

<input type="checkbox" name="faktura" style="margin-left:8px">

Ogólnie ma to wyglądać tak, że jeśli zaznaczymy checkbox'a to ma wyświetlić na ekranie "tak", a jeśli nie zaznaczymy to ma wyświetlić "nie". Jeśli zaznaczymy to wszystko przebiega zgodnie z planem, lecz jeśli nic nie zaznaczymy, to wyskakuję błąd. Wg mnie, jeśli nic nie zaznaczymy, to metodą post nie jest przesyłany ten checkbox, więc interpreter php nie może znaleźć name="faktura". Nauczyciel twierdzi inaczej. Kazał nam wpisać "@" w wiersz, dokładnie tak.

echo "Faktura: ".@($_POST['faktura'] == 'on' ? 'Tak' : 'Nie')."<br>";

Błędu nie pokazuje, lecz znak małpy z tego co zrozumiałem, ma omijać błędy. To jak to naprawić bez @ ? Dlaczego on wyskakuje i jak się go pozbyć ?

Cały kod. Html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta http-equiv="content-type" content="text-html">
<meta name="description" content="opis">
<meta name="author" content="ja">
</head>

<body>
	
	<h2>Zamówienie</h2> <br>
	<form action="zamowienie.php" method="post">
	Proszę o podanie imienia <input type="name" name="name" style="margin-left:50px"><br>
	Proszę o podanie nazwiska <input type="name" name="second_name" style="margin-left:38px"><br>
	Proszę o przygotowanie faktury <input type="checkbox" name="faktura" style="margin-left:8px"> <br>
	<input type="radio" name="napoj" value="herbata" checked="checked"> herbata <br>
	<input type="radio" name="napoj" value="kawa"> kawa <br>
	<input type="radio" name="napoj" value="pepsi"> pepsi <br>
	<input type="radio" name="napoj" value="woda mineralna"> woda mineralna <br>
	
	<input type="submit" value="wyślij">
	<input type="reset" value="reset">
	</form>
	
</body>
</html>

Php

<?php
	//$faktura = $_POST['faktura'];
	$napoj = $_POST['napoj'];
	$name = $_POST['name'];
	$second_name = $_POST['second_name'];
	
	echo "Imie: $name <br>";
	echo "Nazwisko: $second_name <br>";
	echo "Faktura: ".($_POST['faktura'] == 'on' ? 'Tak' : 'Nie')."<br>";
	echo "Zamówienie: ";
	switch($napoj)
	{
		case 'herbata': echo "herabata"; break;
		case 'kawa': echo "herabata"; break;
		case 'pepsi': echo "herabata"; break;
		case 'woda mineralna': echo "woda mineralna"; break;
	}
	echo "<br>";
	echo "Zamówienie złożone: ".date('H:i, js F');
?>

 

2 odpowiedzi

+3 głosów
odpowiedź 20 września 2016 przez efiku Szeryf (75,160 p.)
wybrane 20 września 2016 przez Ditrix
 
Najlepsza

 Nauczyciel twierdzi inaczej. Kazał nam wpisać "@" w wiersz, dokładnie tak.

Zaproś go tu na forum, chętnie pokażemy mu jaki zacofany w PHP jest ;) 

komentarz 20 września 2016 przez Ditrix Mądrala (5,650 p.)
Chętnie bym zaprosił, ale to wychowawca i ogólnie już mu podpadłem w paru kwestiach, podobnych do tej. Głupio mu przyznać rację dla ucznia, bo to wkońcu on jest nauczyciel, który ma wiedzieć wszystko.
komentarz 20 września 2016 przez efiku Szeryf (75,160 p.)
<?php
/**
 * Created by PhpStorm.
 * User: efik
 * Date: 20.09.16
 */
///////////////////////// TEST //////////////////


$_POST = [
    'faktura' => 'on',
    'napoj' => 'herbata',
    'name' => 'Krzysi',
    'second_name' => 'dd'
];

$_SERVER["REQUEST_METHOD"]  = 'POST';


/////////////////////// KONIEC DANYCH TESTOWYCH /////////



    if($_SERVER["REQUEST_METHOD"] !== "POST") {
        exit;
    }

    if(!(['faktura', 'napoj', 'name', 'second_name'] === array_keys($_POST))){
        echo "Wszystkie pola muszą być wypełnione! <br>";
        exit;
    }

    $faktura = $_POST['faktura']  == 'on'  ? 'Tak' : 'Nie';
    $napoj = $_POST['napoj'];
    $name = $_POST['name'];
    $secondName = $_POST['second_name'];
    $orderDate = (new DateTime())->format("H:i, Y-m-d");

    echo "Imie: {$name} <br>";
    echo "Nazwisko: {$secondName} <br>";
    echo "Faktura: {$faktura}<br>";
    echo "Zamówienie: ";
    switch($napoj)
    {
        case 'herbata': echo "herabata"; break;
        case 'kawa': echo "herabata"; break;
        case 'pepsi': echo "herabata"; break;
        case 'woda mineralna': echo "woda mineralna"; break;
    }
    echo "<br>";
    echo "Zamówienie złożone: {$orderDate} ";

 

Przykładowa obsługa nieistniejących kluczy.  Zero małpy, faktura działa jak trzeba.
https://3v4l.org/X0r65 - bez faktury request

https://3v4l.org/SkuvS - z faktura

 

Dokładnie, tacy są nauczyciele. ;) Idź za swoim głosem serca i rozsądku, dobrze idziesz :) 

 

komentarz 20 września 2016 przez Ditrix Mądrala (5,650 p.)

Hmm nie wiem czy wszystko robię dobrze, ale czy zaznaczę tak czy nie to i tak wyświetla mi, że faktura była.

A jeśli

$_POST = [
    'faktura' => 'on',
    'napoj' => 'herbata',
    'name' => 'Krzysi',
    'second_name' => 'dd'
];

Dam w komentarz, to za każdym razem pokazuję mi się, że wszystkie pola muszą być wypełnione.

komentarz 20 września 2016 przez efiku Szeryf (75,160 p.)
To jest właśnie magia kopiowania skryptów. To co dałem w komentarzu z danymi - oo prostu nie pokazałeś formularza wiec wziąłem tylko te pola z tego skryptu które byly. Sprawdź czy klucze takie jak faktura napoj nam secondname pokrywaja się z input name w formularzu. Możliwe że przesyłasz też submit. Pokaż formularz.
komentarz 20 września 2016 przez efiku Szeryf (75,160 p.)
A dobra teraz widze. Formularz masz dziwny :) do przebudowy.
komentarz 20 września 2016 przez Boshi VIP (100,240 p.)
patrz post efika, prosty i czytelny. @ to zło i koniec.

Zaproś nauczyciela ;)
komentarz 20 września 2016 przez Ditrix Mądrala (5,650 p.)
Ale co dokładnie mam zmienić w formularzu ? ^^
komentarz 20 września 2016 przez Boshi VIP (100,240 p.)
myślę, że nie ma czegos takiego jak type=name
komentarz 20 września 2016 przez efiku Szeryf (75,160 p.)
Caly formularz . Brak Ci select dla napoj. Faktura tez jest zle zrobiona. Teraz zostało Ci w sumie tylko html formularz dobrze zrobix i przejdzie. W sumie... wroce zaraz do domu to podeślę. Mam dziś dobry dzień. Nie wiem, może już taki mój los by gasić mądrości "nauczycieli ". Eh nic się nie zmieniło od technikum.
komentarz 20 września 2016 przez efiku Szeryf (75,160 p.)
<form action="" method="POST">
    <p>Imie: <input type="text" name="name" placeholder="Twoje Imię"></p>
    <p>Nazwisko: <input type="text" name="second_name" placeholder="Nazwisko"></p>
    <p>Faktura:
        <label>
            Tak <input type="radio" name="faktura" value="on">
            Nie <input type="radio" name="faktura" value="off">
        </label>
    <p>Napoj: <label>
            <select name="napoj">
                <option value="herbata">herbata</option>
                <option value="kawa">kawa</option>
                <option value="pepsi">pepsi</option>
                <option value="woda mineralna">woda mineralna</option>
            </select>
        </label>
    </p>
    <button type="submit">Zapisz</button>
</form>

Okej a więc tak, zobacz jak po kolei masz ustawione w inputach name.

  • name
  • second_name
  • faktura
  • napoj

Pytanie, dlaczego to nie będzie działać w skrypcie? Otóż dlatego:

 if(!(['faktura', 'napoj', 'name', 'second_name'] === array_keys($_POST)))

Sprawdzamy tutaj czy tablica z naszymi kluczami formularza jest identyczna do kluczy tej w zmiennej $_POST.  Jak widać, nie. (klucze są w złej kolejności) Wystarczy zamienić ich kolejność:

if (!(['name', 'second_name', 'faktura', 'napoj'] === array_keys($_POST)))

I działa.

<html>
<body>
<form action="" method="POST">
    <p>Imie: <input type="text" name="name" placeholder="Twoje Imię"></p>
    <p>Nazwisko: <input type="text" name="second_name" placeholder="Nazwisko"></p>
    <p>Faktura:
        <label>
            Tak <input type="radio" name="faktura" value="on">
            Nie <input type="radio" name="faktura" value="off">
        </label>
    <p>Napoj: <label>
            <select name="napoj">
                <option value="herbata">herbata</option>
                <option value="kawa">kawa</option>
                <option value="pepsi">pepsi</option>
                <option value="woda mineralna">woda mineralna</option>
            </select>
        </label>
    </p>
    <button type="submit">Zapisz</button>
</form>
</body>


</html>


<?php
/**
 * Created by PhpStorm.
 * User: efik
 * Date: 20.09.16
 */


if ($_SERVER["REQUEST_METHOD"] !== "POST") {
    exit;
}

if (!(['name', 'second_name', 'faktura', 'napoj'] === array_keys($_POST))) {
    echo "Wszystkie pola muszą być wypełnione! <br>";
    echo "<pre>";
    print_r($_POST);
    echo "</pre>";
    exit;
}

$faktura = $_POST['faktura'] == 'on' ? 'Tak' : 'Nie';
$napoj = $_POST['napoj'];
$name = $_POST['name'];
$secondName = $_POST['second_name'];
$orderDate = (new DateTime())->format("H:i, Y-m-d");

echo "Imie: {$name} <br>";
echo "Nazwisko: {$secondName} <br>";
echo "Faktura: {$faktura}<br>";
echo "Zamówienie: ";
switch ($napoj) {
    case 'herbata':
        echo "herabata";
        break;
    case 'kawa':
        echo "herabata";
        break;
    case 'pepsi':
        echo "herabata";
        break;
    case 'woda mineralna':
        echo "woda mineralna";
        break;
}
echo "<br>";
echo "Zamówienie złożone: {$orderDate} ";

 

Lub sam PHP. (Polecam to rozwiązanie)

<?php
/**
 * Created by PhpStorm.
 * User: efik
 * Date: 20.09.16
 */


if ($_SERVER["REQUEST_METHOD"] !== "POST") {
    exit;
}

if (!(['name', 'second_name', 'faktura', 'napoj'] === array_keys($_POST))) {
    echo "Wszystkie pola muszą być wypełnione! <br>";
    echo "<pre>";
    print_r($_POST);
    echo "</pre>";
    exit;
}

$faktura = $_POST['faktura'] == 'on' ? 'Tak' : 'Nie';
$napoj = $_POST['napoj'];
$name = $_POST['name'];
$secondName = $_POST['second_name'];
$orderDate = (new DateTime())->format("H:i, Y-m-d");

echo "Imie: {$name} <br>";
echo "Nazwisko: {$secondName} <br>";
echo "Faktura: {$faktura}<br>";
echo "Zamówienie: ";
switch ($napoj) {
    case 'herbata':
        echo "herabata";
        break;
    case 'kawa':
        echo "herabata";
        break;
    case 'pepsi':
        echo "herabata";
        break;
    case 'woda mineralna':
        echo "woda mineralna";
        break;
}
echo "<br>";
echo "Zamówienie złożone: {$orderDate} ";

 

+1 głos
odpowiedź 20 września 2016 przez Arkadiusz Waluk Ekspert (287,550 p.)

Wg mnie, jeśli nic nie zaznaczymy, to metodą post nie jest przesyłany ten checkbox, więc interpreter php nie może znaleźć name="faktura". 

Tak, dobrze mówisz. Jeśli nie zaznaczymy checkboxa to nie jest on przesyłany, więc stąd zgłaszany jest błąd o nieistniejącym elemencie w tablicy $_POST. Możesz to rozwiązać bardzo prosto, sprawdzając przy użyciu isset czy taki element tablicy istnieje.

Nauczyciel twierdzi inaczej. Kazał nam wpisać "@" w wiersz, dokładnie tak.

A to pozostawię bez komentarza... Zamiast problem rozwiązać lepiej go ukryć (@ ukrywa błędy), gratuluję podejścia. Fajnie, że sam się zainteresowałeś i nie robisz takiej głupoty ;) 

komentarz 20 września 2016 przez Ditrix Mądrala (5,650 p.)
Jego zdaniem ta metoda właśnie ma działać na takiej zasadzie, że jeśli zaznaczymy to pokazuje pierwszy wariant, a jeśli nie zaznaczymy to pokazuje drugi wariant. Jak powiedziałem, że biorąc to na logikę, iż nie zaznaczając nie przesyłamy nic do tablicy _POST, dziwnie się na mnie spojrzał i powiedział  to co napisałem wyżej :)

Czyli ten sposób jest do niczego. Chyba, że ma zastosowanie gdzie indziej.
komentarz 20 września 2016 przez CzlowiekSkrypt Nałogowiec (26,340 p.)
Zaskocz go tym issetem na następnej lekcji :) ogólnie jak dostajesz warningi albo notice to znaczy że coś po prostu jest źle zrobione i trzeba to poprawić a nie walić @ :)
komentarz 20 września 2016 przez Arkadiusz Waluk Ekspert (287,550 p.)
Nie wiem co więcej powiedzieć, @ to zło, ukrywasz błędy, a później jak coś się dzieje to szukasz nie wiadomo czego bo masz poukrywane wszystko... Możesz z całą pewnością powiedzieć swojemu nauczycielowi, że to nie jest dobry sposób.

Rozwiązaniem tego problemu może być po prostu użycie isset, jak widzę efik w swojej odpowiedzi podał też ulepszoną wersję Twojego kodu, warto przeanalizować ;)

Podobne pytania

0 głosów
1 odpowiedź 1,326 wizyt
pytanie zadane 20 lipca 2018 w PHP przez dobre.rece Nowicjusz (200 p.)
–2 głosów
4 odpowiedzi 4,224 wizyt
pytanie zadane 29 maja 2017 w PHP przez VendE Użytkownik (980 p.)
0 głosów
3 odpowiedzi 464 wizyt
pytanie zadane 2 czerwca 2015 w PHP przez sulas99 Początkujący (340 p.)

92,454 zapytań

141,262 odpowiedzi

319,089 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...