NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: Podmínka pro prázdnou proměnnou

V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Zdenek
Člen
Avatar
Zdenek:4.2.2017 7:41

Zdravím,
chtěl bych poprosit o radu jak ošetřit prázdnou proměnnou. Nevím si rady s případem, kdy jsou z pěti hodnot vždy čtyři prázdné a jedna nabývá hodnoty 0 nebo 1. Potřeboval bych ošetřit ty prázdné hodnoty, aby se s nimi dále nic nedělalo. Nějaká rada prosím ?

$_SESSION['qA01_1'] = $_POST['qA01_1'];
$_SESSION['qA01_2'] = $_POST['qA01_2'];
$_SESSION['qA01_3'] = $_POST['qA01_3'];
$_SESSION['qA01_4'] = $_POST['qA01_4'];
$_SESSION['qA01_5'] = $_POST['qA01_5'];
 
Odpovědět
4.2.2017 7:41
Avatar
Michal
Člen
Avatar
Odpovídá na Zdenek
Michal:4.2.2017 8:37

Ahoj, k ověření prázdnosti slouží funkce empty(). Díky podobným indexům v poli POST navíc lze celý příklad vyřešit v cyklu, a tudíž není třeba rozepisovat zvlášť všechny řádky.

for ($i = 1; $i < 6; $i++) {
   $index = 'qA01_' . $i; // Index do pole POST bude nabývat hodnot qA01_1 až qA01_5.
   if (isset($_POST[$index] && !empty($_POST[$index])) {
      $_SESSION[$index] = $_POST[$index]; // Hodnota z POST se vloží do SESSION pouze pokud není prázdná.
   }
}
Editováno 4.2.2017 8:38
 
Nahoru Odpovědět
4.2.2017 8:37
Avatar
Zdenek
Člen
Avatar
Zdenek:4.2.2017 12:14

Děkuji za radu, asi tu jen chyběla závorka ?
Počítal jsem, že se zbavím i "chybové hlášky", ale nestalo se tak. Půjde to nějak udělat?

Editováno 4.2.2017 12:17
 
Nahoru Odpovědět
4.2.2017 12:14
Avatar
Zdenek
Člen
Avatar
Odpovídá na Zdenek
Zdenek:4.2.2017 12:20

Chybovou hláškou mám na mysli:

 
Nahoru Odpovědět
4.2.2017 12:20
Avatar
Odpovídá na Zdenek
Neaktivní uživatel:4.2.2017 13:01

Ahoj, ono záleží, jak plánuješ ošetřit ty prázdné hodnoty. Obecně se to dělá tak, že ověříš, zda existují, a pokud ne, tak jim přiřadíš nějakou výchozí hodnotu, nebo s nimi vůbec nebudeš počítat. Ve tvém případě bych doporučoval něco na způsob

$_SESSION['qA01_1'] = (isset($_POST['qA01_1'])) ? $_POST['qA01_1'] : 0;

Což je zkrácený zápis pro klasickou if podmínku. V případě, že daná proměnná existuje, vrátí ji, jinak vrátí nulu. Tedy můžeš si být jistý, že vždy bude nadefinována ona proměnná a nebudeš dostávat chyby typu notice.

Jak již psal Michal, můžeš všechny řádky dát do cyklu

for ($i = 1; $i <= 5; $i++) {
    $_SESSION['qA01_' . $i] = (isset($_POST['qA01_' . $i])) ? $_POST['qA01_' . $i] : 0;
}
Nahoru Odpovědět
4.2.2017 13:01
Neaktivní uživatelský účet
Avatar
Zdenek
Člen
Avatar
Odpovídá na Neaktivní uživatel
Zdenek:4.2.2017 14:59

Díky, ale raději bych s proměnnými, které jsou prázdné nedělal dále již nic a zároveň se zbavil "chybové hlášky". Stačí pak místo 0 dát empty() ?

for ($i = 1; $i <= 5; $i++) {
    $_SESSION['qA01_' . $i] = (isset($_POST['qA01_' . $i])) ? $_POST['qA01_' . $i] : empty();
}
 
Nahoru Odpovědět
4.2.2017 14:59
Avatar
Odpovídá na Zdenek
Neaktivní uživatel:4.2.2017 16:31

Ahoj, pak tedy použij klasickou if podmínku, která se spustí pouze pokud bude proměnná definována.

for ($i = 1; $i <= 5; $i++) {
    if (isset($_POST['qA01_' . $i])) {
        $_SESSION['qA01_' . $i] = $_POST['qA01_' . $i];
    }
}

Ale pořád nechápeš, proč se ta notice zobrazuje. Ona ti říká, že se pokoušíš přistupovat k neexistujícímu indexu, takže si teď musíš dát pozor, aby ses nepokoušel získat obsah například $_SESSION['qA01_1'] i když nebude existovat, protože by se ti opět zobrazila. Vyzkoušej, jestli funguje a pokud se ti to stále bude zobrazovat, tak pošli ten kus kódu, kde se vyskytuje chyba. Taky je ještě možné tento typ hlášení vypnout.

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
4.2.2017 16:31
Neaktivní uživatelský účet
Avatar
Zdenek
Člen
Avatar
Odpovídá na Neaktivní uživatel
Zdenek:6.2.2017 20:40

Tak to funguje, díky :-) .
Snažil jsem se něco podobného aplikovat pro nadefinování proměnných, ale nějak to není ono.

Toto pole se snažím nahradit:

$qA01_1 = $_SESSION['qA01_1'];
$qA01_2 = $_SESSION['qA01_2'];
$qA01_3 = $_SESSION['qA01_3'];
$qA01_4 = $_SESSION['qA01_4'];
$qA01_5 = $_SESSION['qA01_5'];
$qA02_1 = $_SESSION['qA02_1'];
$qA02_2 = $_SESSION['qA02_2'];
$qA02_3 = $_SESSION['qA02_3'];
$qA02_4 = $_SESSION['qA02_4'];
$qA02_5 = $_SESSION['qA02_5'];
$qA03_1 = $_SESSION['qA03_1'];
$qA03_2 = $_SESSION['qA03_2'];
$qA03_3 = $_SESSION['qA03_3'];
$qA03_4 = $_SESSION['qA03_4'];
$qA03_5 = $_SESSION['qA03_5'];

Tímto:

for($i = 0; $i <= 3; $i++) {
                for($j = 0; $j <= 9; $j++) {
                    for($k = 1; $k <= 5; $k++) {
                         if (isset($_SESSION['qA_' . $i . $j. '_' . $k])) {
                            '$qA_' . $i . $j. '_' . $k = $_SESSION['qA_' . $i . $j. '_' . $k];
                         }
                    }
            }
            }

Je to správně?

 
Nahoru Odpovědět
6.2.2017 20:40
Avatar
Odpovídá na Zdenek
Martin Konečný (pavelco1998):7.2.2017 16:11

Zásadně nedoporučuji dělat proměnné proměnné. Na tento účel ti mnohem líp poslouží pole.

$data = array();

// v těch forech pak místo '$qA_' . $i . $j. '_' . $k = $_SESSION['qA_' . $i . $j. '_' . $k];  použiješ
$key = "qA_{$i}{$j}_{$k}";
$data[$key] = $_SESSION[$key];
Editováno 7.2.2017 16:12
Nahoru Odpovědět
7.2.2017 16:11
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
Zdenek
Člen
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Zdenek:10.2.2017 20:29

Nějak jsem to zbastlil, ale háže mi to chybu při zápisu do DB. Můžu poprosit o kontrolu?

1. Zda náhrada proměnných za pole je správně zapsaná ? zda to tak může být ?
2 .a 3. Lze zkrátit zápis sloupců a hodnot do nich vkládaných ?

<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>

        <?php session_start();
            $nick = $_SESSION['nick'];
            $emailaddress = $_SESSION['emailaddress'];
            $age = $_SESSION['age'];
            $sex = $_SESSION['sex'] ;

            // ad.1 pole pro proměnné. Je to takto napsáno správně ?
            $data = array();
            for($i = 0; $i <= 3; $i++) {
                for($j = 0; $j <= 9; $j++) {
                    for($k = 1; $k <= 5; $k++) {
                        $key = "qA_{$i}{$j}_{$k}";
                        $data[$key] = $_SESSION[$key];
                    }
                }
            }

             //MySQL Database Connect
             include "mysql_connect.php";

            $datum = date("d. m. Y"); // promena datum
            $time = date("G:i"); // promena cas

// ad.2 a 3 - lze nejak zkratit nize uvedene nazvy sloupcu resp. hodnot ?
            $query = "INSERT INTO abc1234
                    (datum,time,nick,emailaddress,age,sex,
                     qA01_1,qA01_2,qA01_3,qA01_4,qA01_5,
                     qA02_1,qA02_2,qA02_3,qA02_4,qA02_5,
                     qA03_1,qA03_2,qA03_3,qA03_4,qA03_5,
                     qA04_1,qA04_2,qA04_3,qA04_4,qA04_5,
                     qA05_1,qA05_2,qA05_3,qA05_4,qA05_5,
                     qA06_1,qA06_2,qA06_3,qA06_4,qA06_5,
                     qA07_1,qA07_2,qA07_3,qA07_4,qA07_5,
                     qA08_1,qA08_2,qA08_3,qA08_4,qA08_5,
                     qA09_1,qA09_2,qA09_3,qA09_4,qA09_5,
                     qA10_1,qA10_2,qA10_3,qA10_4,qA10_5,
                     qA11_1,qA11_2,qA11_3,qA11_4,qA11_5,
                     qA12_1,qA12_2,qA12_3,qA12_4,qA12_5,
                     qA13_1,qA13_2,qA13_3,qA13_4,qA13_5,
                     qA14_1,qA14_2,qA14_3,qA14_4,qA14_5,
                     qA15_1,qA15_2,qA15_3,qA15_4,qA15_5,
                     qA16_1,qA16_2,qA16_3,qA16_4,qA16_5,
                     qA17_1,qA17_2,qA17_3,qA17_4,qA17_5,
                     qA18_1,qA18_2,qA18_3,qA18_4,qA18_5,
                     qA19_1,qA19_2,qA19_3,qA19_4,qA19_5,
                     qA20_1,qA20_2,qA20_3,qA20_4,qA20_5,
                     qA21_1,qA21_2,qA21_3,qA21_4,qA21_5,
                     qA22_1,qA22_2,qA22_3,qA22_4,qA22_5,
                     qA23_1,qA23_2,qA23_3,qA23_4,qA23_5,
                     qA24_1,qA24_2,qA24_3,qA24_4,qA24_5,
                     qA25_1,qA25_2,qA25_3,qA25_4,qA25_5,
                     qA26_1,qA26_2,qA26_3,qA26_4,qA26_5,
                     qA27_1,qA27_2,qA27_3,qA27_4,qA27_5,
                     qA28_1,qA28_2,qA28_3,qA28_4,qA28_5,
                     qA29_1,qA29_2,qA29_3,qA29_4,qA29_5,
                     qA30_1,qA30_2,qA30_3,qA30_4,qA30_5) VALUES
                    ('$datum', '$time', '$nick', '$emailaddress', '$age', '$sex',
                    '$qA01_1', '$qA01_2', '$qA01_3', '$qA01_4', '$qA01_5',
                    '$qA02_1', '$qA02_2', '$qA02_3', '$qA02_4', '$qA02_5',
                    '$qA03_1', '$qA03_2', '$qA03_3', '$qA03_4', '$qA03_5',
                    '$qA04_1', '$qA04_2', '$qA04_3', '$qA04_4', '$qA04_5',
                    '$qA05_1', '$qA05_2', '$qA05_3', '$qA05_4', '$qA05_5',
                    '$qA06_1', '$qA06_2', '$qA06_3', '$qA06_4', '$qA06_5',
                    '$qA07_1', '$qA07_2', '$qA07_3', '$qA07_4', '$qA07_5',
                    '$qA08_1', '$qA08_2', '$qA08_3', '$qA08_4', '$qA08_5',
                    '$qA09_1', '$qA09_2', '$qA09_3', '$qA09_4', '$qA09_5',
                    '$qA10_1', '$qA10_2', '$qA10_3', '$qA10_4', '$qA10_5',
                    '$qA11_1', '$qA11_2', '$qA11_3', '$qA11_4', '$qA11_5',
                    '$qA12_1', '$qA12_2', '$qA12_3', '$qA12_4', '$qA12_5',
                    '$qA13_1', '$qA13_2', '$qA13_3', '$qA13_4', '$qA13_5',
                    '$qA14_1', '$qA14_2', '$qA14_3', '$qA14_4', '$qA14_5',
                    '$qA15_1', '$qA15_2', '$qA15_3', '$qA15_4', '$qA15_5',
                    '$qA16_1', '$qA16_2', '$qA16_3', '$qA16_4', '$qA16_5',
                    '$qA17_1', '$qA17_2', '$qA17_3', '$qA17_4', '$qA17_5',
                    '$qA18_1', '$qA18_2', '$qA18_3', '$qA18_4', '$qA18_5',
                    '$qA19_1', '$qA19_2', '$qA19_3', '$qA19_4', '$qA19_5',
                    '$qA20_1', '$qA20_2', '$qA20_3', '$qA20_4', '$qA20_5',
                    '$qA21_1', '$qA21_2', '$qA21_3', '$qA21_4', '$qA21_5',
                    '$qA22_1', '$qA22_2', '$qA22_3', '$qA22_4', '$qA22_5',
                    '$qA23_1', '$qA23_2', '$qA23_3', '$qA23_4', '$qA23_5',
                    '$qA24_1', '$qA24_2', '$qA24_3', '$qA24_4', '$qA24_5',
                    '$qA25_1', '$qA25_2', '$qA25_3', '$qA25_4', '$qA25_5',
                    '$qA26_1', '$qA26_2', '$qA26_3', '$qA26_4', '$qA26_5',
                    '$qA27_1', '$qA27_2', '$qA27_3', '$qA27_4', '$qA27_5',
                    '$qA28_1', '$qA28_2', '$qA28_3', '$qA28_4', '$qA28_5',
                    '$qA29_1', '$qA29_2', '$qA29_3', '$qA29_4', '$qA29_5',
                    '$qA30_1', '$qA30_2', '$qA30_3', '$qA30_4', '$qA30_5')";
            //if($query){echo 'data has been placed'}
            mysql_query($query) or die(mysql_error());

        ?>
    </BODY>
</HTML>
 
Nahoru Odpovědět
10.2.2017 20:29
Avatar
Odpovídá na Zdenek
Martin Konečný (pavelco1998):10.2.2017 20:32

Toto mi zavání špatným návrhem DB. Na co potřebuješ v tabulce abc1234 ty sloupce qA01_1 atd.?

Nahoru Odpovědět
10.2.2017 20:32
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
Zdenek
Člen
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Zdenek:10.2.2017 21:20

Zápis do DB mi funguje dobře, jen bych ho rád zkrátil. Náhodně vybírám vždy jednu z pěti otázek a ta pak nabude hodnoty 1 nebo 0. Zbývající 4 otázky pak zůstanou prázdné, nic se nezapíše do DB. Jsem spokojený a je to i pro mě v DB přehledné, ale asi hádám, že dle tvojí rekce by to mělo být jinak :-) ?

 
Nahoru Odpovědět
10.2.2017 21:20
Avatar
Odpovídá na Zdenek
Martin Konečný (pavelco1998):10.2.2017 22:31

Chápu tedy správně, že qA01_1 až qA01_5 je jedna sada otázek, z nichž se vybere jedna, která bude mít hodnotu 1 a ostatní hodnotu 0?
V takovém případě by bylo lepší udělat si tabulku s otázkami, jen si teď nedokážu představit, jak ta aplikace má fungova, a tudíž, jak správně rozvrhnout strukturu dalších tabulek :(

Nahoru Odpovědět
10.2.2017 22:31
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
Zdenek
Člen
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Zdenek:11.2.2017 6:47

Skoro to chápeš dobře, jedna sada otázek je jak píšeš qA01_1 až qA01_5, z ní se vybere náhodně jedna otázka např. qA01_3 a ta nabude hodnoty buď 1 nebo 0. Ostatní otázky dané sady jsou pak prázdné. Všechno tohle mi funguje včetně zápisu do DB. Takže na první pohled v DB vidím, jaká otázka byla vylosována a zda nabyla hodnoty 1 nebo 0. Snažím se to ted nejak zkrátit a eliminovat chybové hlášky. Děkuji za pomoc

 
Nahoru Odpovědět
11.2.2017 6:47
Avatar
Odpovídá na Zdenek
Martin Konečný (pavelco1998):11.2.2017 12:02

V tom případě by ti mělo stačit si udělat tabulku "otazka", ve které budeš mít ID, název otázky (hodnota pak qA01_1) a "zvoleno" (hodnota pak 1 / 0 případně NULL, pokud to bude jako prázdné).
No a ty když pak budeš chtít hledat otázky, které nejsou prázdné, položíš jednoduchý dotaz

SELECT * FROM otazka
WHERE zvoleno IS NOT NULL

Nevím, jaké je konkrétní použití, ale ještě správněji by se to mělo rozdělit i podle té sady, tzn. tabulka "sada", ve které bude ID, nějaký název / číslo atp., to bude značit to "01", "02" na začátku.
V tabulce otázka pak bude ID, název/číslo (1,2,3,4,5) a ID sady.
Takže když pak budeš hledat všechny otázky v sadě s čísllem 4, uděláš dotaz

SELECT * FROM otazka
INNER JOIN sada ON otazka.sada_id = sada.id
WHERE sada.cislo = 4

// případně pokud bys měl ID sady a ne jen její číslo
SELECT * FROM otazka
WHERE sada_id = 5

Neznám ale konkrétní použití těch otázek, takže je třeba můj návrh špatně nebo nevyhovuje tomu, co konkrétně potřebuješ. No a také nevím, jakou znalost SQL máš, jestli pro tebe není JOIN přílišná magie pro začátek

Nahoru Odpovědět
11.2.2017 12:02
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
Zdenek
Člen
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Zdenek:11.2.2017 21:22

Tabulku v phpMyadmin mám vytvořenou tak jak potřebuji, a funguje mi i zápis. Do JOINu pokud to nebude nutné bych se zatím nerad pouštěl, nemám zkušenosti. Chtěl bych pro začátek jen zjednodušit zápis a zbavit se "chybových hlášek" typu Undefined index... Založím nato novou diskuzi, protože co jsem potřeboval v této diskuzi, bylo vyřešeno už výše ;-) .

 
Nahoru Odpovědět
11.2.2017 21:22
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 16 zpráv z 16.