Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Získání detailu uživatele z Databáze pomocí odkazu

Aktivity
Avatar
Lukáš Havlíček:30.7.2022 17:50

Ahoj, vytvářím si jednoduchý "Firemní systém", abych se trochu procvičil. Mám vytvořenou databázi s tabulkou zaměstnanců, ve kterých mám uložená data o zaměstnanci. Pomocí cyklu mám vypsaný zaměstnance. Mám vytvořený odkaz, abych mohl rozkliknout detail zaměstnance, ale tady začíná můj problém. Při kliknutí na jméno zaměstnance mě to napíše "Neplatný parametr". Problém bude v odkazu, na který odkazuji.
Stránky mám tvořené jako dynamické, tak aspoň nemusím vždy kopírovat celej design do každé stránky.

Zde přidávám zdrojové kódy:

index.php : Zde mám hlavní stránku, do které vkládám obsah webu

<?php
    session_start();
    require('../Db.php');
    Db::connect('localhost', 'zamestnanci_system', 'root', 'root');

    if (!isset($_SESSION['uzivatel_id']))
    {
        header('Location: ../index.php'); // Pokud není uživatel přihlášenej, přesměrujeme ho na přihlášení
        exit();
    }

    if (isset($_GET['odhlasit']))
    {
        session_destroy();
        header('Location: ../index.php'); // Po odhlášení přesměrujeme na přihlášení
        exit();
    }
?>


<!DOCTYPE html>
<html lang="cs-cz">

        <head>
                <meta charset="utf-8" />
                <meta name="description" content="" /> <!-- Popis stránky -->
                <meta name="keywords" content="" /> <!-- Klíčová slova -->
                <meta name="author" content="" /> <!-- Autor webu -->
                <link rel="shortcut icon" href="obrazky/ikona.ico" />
                <link rel="stylesheet" href="styl.css" type="text/css" />
                <title></title>
        </head>

        <body>
        <header>
            <H1>Firemní systém</H1>

            <nav class="dropdownmenu">
                <ul>
                    <li><a href="index.php?stranka=domu">Domů</a></li>
                    <li><a href="#">Zaměstnanci</a>
                        <ul id="submenu">
                            <li><a href="index.php?stranka=vypisZamestnancu">Výpis zaměstnanců</a></li>
                            <li><a href="index.php?stranka=pridatZamestnance">Přidat zaměstnance</a></li>
                        </ul>
                    </li>
                    <li><a href="#">Pracovní pozice</a>
                        <ul id="submenu">
                            <li><a href="index.php?stranka=vychystavc">Vychystávači</a></li>
                            <li><a href="index.php?stranka=retrakar">Retrakáři</a></li>
                            <li><a href="index.php?stranka=prijem">Fyzický příjem</a></li>
                            <li><a href="index.php?stranka=expedice">Expedice</a></li>
                        </ul>
                    </li>
                    <li><a href="index.php?odhlasit">Odhlásit</a></li>
                </ul>
            </nav>
        </header>

        <article>
            <section>
            <?php
                if (isset($_GET['stranka']))
                $stranka = $_GET['stranka'];
                else
                $stranka = 'domu';
                if (preg_match('/^[a-z0-9A-Z]+$/', $stranka))
                {
                $vlozeno = include('podstranky/' . $stranka . '.php');
                if (!$vlozeno)
                echo('Podstránka nenalezena');
                }
                else
                echo('Neplatný parametr.');
            ?>
            </section>
        </article>

        <footer>
            <p>&copy; 2022 - <?php echo(date('Y')); ?> Lukáš Havlíček</p>
        </footer>
        </body>
</html>

vypis zamestnanců: Tady mám výpis zaměstnanců, ve kterém bude problém

<?php
    if (!isset($_SESSION['uzivatel_id']))
    {
        header('Location: ../index.php'); // Pokud není uživatel přihlášenej, přesměrujeme ho na přihlášení
        exit();
    }

    if (isset($_GET['odhlasit']))
    {
        session_destroy();
        header('Location: ../index.php'); // Po odhlášení přesměrujeme na přihlášení
        exit();
    }

    /**
     * Vybereme všechny záznamy z tabulky zamestnanci podle jejich ID
     */
     $zamestnanci = Db::queryAll('
             SELECT *
             FROM zamestnanci
             ORDER BY zamestnanci_id
             ');
?>

<H1>Výpis zaměstnanců firmy</H1>


<?php
     echo('<table id="zamestnanci">');
     echo('<tr>');
     echo('<td><strong>Jméno</strong></td>');
     echo('<td><strong>Datum narození</strong></td>');
     echo('</tr>');

     /**
      * Pomocí cyklu foreach vypíšeme zaměstnance firmy
      */
     foreach ($zamestnanci as $zamestnanec)
     {
         echo('<tr><td>
                 <a href="index.php?stranka=detail=' . htmlspecialchars($zamestnanec['zamestnanci_id']) . '">
                     ' . htmlspecialchars($zamestnanec['jmeno']) . ' ' . htmlspecialchars($zamestnanec['prijmeni']) .
                 '</a></td>');
         $datumNarozeni = date("d.m.Y", strtotime($zamestnanec['datum_narozeni'])); // Převedeme databázové datum na naše datum
         echo('<td>' . htmlspecialchars($datumNarozeni) . '</td></tr>');
     }
     echo('</table>');
?>

Problém bude v odkazu na tomto řádku:

echo('<tr><td>
                 <a href="index.php?stranka=detail=' . htmlspecialchars($zamestnanec['zamestnanci_id']) . '">
                     ' . htmlspecialchars($zamestnanec['jmeno']) . ' ' . htmlspecialchars($zamestnanec['prijmeni']) .
                 '</a></td>');

Vážně už nevím, jak mám pokračovat, tak bych byl rád, kdyby mě někdo nějako navedl, jak by měl ten odkaz vypadat, aby se mi to přesměrovalo na stránku detail s výpisem dat zaměstnance.

Zkusil jsem: Zkoušel jsem všelijak měnit odkaz, aby mě to přesměrovalo tam, kam potřebuji.

Chci docílit: Chci docílit toho, aby mě odkaz přesměroval na stránku s detailem zaměstnance.

 
Odpovědět
30.7.2022 17:50
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:1.8.2022 8:21
  1. nepouzivej primy vypis pres echo, ukladej to do promenych
  2. echo neni klasicka funkce, nepisi se kolem ni zavorky (), pokud vim. Mozna jsou dokonce zavorky jako eval()
  3. parametry do url je nutne escapova (zakodovat) pres urlencode a pak to az cele escapovat na html. Ale, muzes to samozrejme escapovat i postupne.
  4. parametry pro url se spojuji andem
// tvuj chybny kod
//index.php?stranka=detail=' . htmlspecialchars($zamestnanec['zamestnanci_id']) . '">
//                     ' . htmlspecialchars($zamestnanec['jmeno']) . ' ' . htmlspecialchars($zamestnanec['prijmeni'])

$url = 'index.php?stranka='.urlencode('detail').'&'.neco='.urlencode($zamestnanec['zamestnanci_id']);
$html .= '<a href="'.htmlspecialchars($url).'">'.'.htmlspecialchars($zamestnanec['jmeno']) . ' ' . $zamestnanec['prijmeni']).'</a>';

$url = 'index.php?stranka=detail&'.neco='.urlencode($zamestnanec['zamestnanci_id']); // nebo takto, pokud jsi si jisty, ze tam nebude zadny parazitni znak

// nebo to melo vypadat takto, coz se proti tvemu kodu znacne lisi, ze?
$html .= '<a href="'.htmlspecialchars('index.php?stranka=detail&'.neco='.urlencode($zamestnanec['zamestnanci_id'])).'">'.'.htmlspecialchars($zamestnanec['jmeno']) . ' ' . $zamestnanec['prijmeni']).'</a>';

// nebo takto, pokud jsi si jisty, ze ani pro html tam nebude parazitni znak

$html .= '<a href="index.php?stranka=detail&amp;neco='.htmlspecialchars(urlencode($zamestnanec['zamestnanci_id'])).'">'.'.htmlspecialchars($zamestnanec['jmeno']) . ' ' . $zamestnanec['prijmeni']).'</a>';

---

//Nebo skladej adresu pres pole nebo si na to udelej funkci
$p = array();
$p[] = 'stranka='.urlencode('detail')
$p[] = 'neco='.urlencode($zamestnanec['zamestnanci_id'])
$url = 'index.php?'.implode('&', $p);
$html .= '<a href="'.htmlspecialchars($url).'">'.'.htmlspecialchars($zamestnanec['jmeno']) . ' ' . $zamestnanec['prijmeni']).'</a>';

function createUrl ($url_main, $p) // a mam pocit, ze v php7 uz takova funkce nekde je
{
foreach ($p as $key=>$value)
  {$p[$key] = $key.'='.urlencode($value);}
return $url_main'.implode('&', $p);
}
$html .= '<a href="'.htmlspecialchars(createUrl('index.php?', array(
        'stranka' => 'detail',
        'neco'=>$zamestnanec['zamestnanci_id']
        ))).'">'.'.htmlspecialchars($zamestnanec['jmeno']) . ' ' . $zamestnanec['prijmeni']).'</a>';

// ja mam treba funkci, ktera mi vykresuje cely tag A, protoze to pouzivam casto (asi trochu jinaci kod, toto plodim z hlavy)
createOdkaz('index.php', array('name'=>'str', 'id'=>'str', 'text'=>'123', 'target'=>'123', 'onclick'=>'123', 'p'=>array(
        'stranka' => 'detail',
        'neco'=>$zamestnanec['zamestnanci_id']
)));

function createOdkaz($url, $opt)
{
$text = '';
if (isset($opt['text'])) {$text = $opt['test']; unset($opt['text']);}
if (isset($opt['p'])) {$p = $opt['p']; unset($opt['p']);}
$p = array();
if (isset($opt['p'])) {$p = $opt['p']; unset($opt['p']);}
foreach ($p as $key=>$value) {$p[$key] = $key.'='.urlencode($value);}
foreach ($opt as $key=>$value) {$opt[$key] = $key.'='.htmlspecialchars($value);}
$html .= '<a href="'.htmlspecialchars($ur'.'?'.implode('&', $p)).'"'.implode(' ', $opt)).'>'.htmlspecialchars($text).'</a>';
}
 
Nahoru Odpovědět
1.8.2022 8:21
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:1.8.2022 8:36

5. zkus si vypsat v prohlizeci html kod stranky a zkus ten kod projet validatorem html, aspon https://validator.w3.org/#… a pak se zkus podivat, zda je ten html kod v poradku, podle vsech pravidel, jake se html kod pise.
6. Kdyz si nejsi jisty, jaky html kod vyplodis phpckem, tak si ho zkus napsat nejdriv spravne v html.
7. Nebo si muze html kod vypisovat do stranky

$html = '';
$code = '';

$html .= '<a href="index.php?stranka=detail&amp;neco='.htmlspecialchars(urlencode($zamestnanec['zamestnanci_id'])).'">'.'.htmlspecialchars($zamestnanec['jmeno']) . ' ' . $zamestnanec['prijmeni']).'</a>';
$code .= $html; // nejsi si jisty, zda tahle cast php kodu je ok, tak ji pridas do promene $code
echo '<pre>'.htmlspecialchars($code).'</pre>'; // a hned na obrazovce vidis i html kod

A radeji mit html kod rozkouskovany na 10.000 promenych nech to placat do jedne nudlicky...

$html .= '
<nav>
  <a href="stranka.php">odkaz</a>
  <a href="stranka.php">odkaz</a>
  <a href="stranka.php">odkaz</a>
</nav>
';

echo $nav;

// nebo
$nav = array();
$nav[] = '<a href="stranka.php">odkaz</a>';
$nav[] = '<a href="stranka.php">odkaz</a>';
$nav[] = '<a href="stranka.php">odkaz</a>';
$nav = implode("\n  ", $nav)

$html .= '
<nav>'.$nav.'</nav>
';

Hlavne v dobe, kdyz jsi zacatecnik, tak bych nemachroval s expert zapisy, kdy my to dokazeme seskladat by oko bez chyb, pripadnou chybu najit. Ale ty jsi si nejisty, co vlastne hledas. Nevis, zda se odkaz vypsal spravne, url vyspalo spravne atd.

8. Viz 7, kod ktery vypises php nemusi byt tentyz, ktery zobrazi www prohlizec jako zobrazit-zdrojovy kod. To je dobre mit na pameti, ze html prohlizec si z tveho html kodu sklada jakysi vlastni a odstranuje z nej chyby. Takze prohlizec vzdy zobrazi spravny kod. Ikdyz je treba uplne jiny, nez jsi mu poslal. To je dobre mit na pameti, a ten kod si prave prohlizet v prohlizeci a nespolechat na to, co jsem psal v bode 7.
Pokus se stane, ze ti presklada html kod, pak mas ve svem kodu chybu. A pak se dostavat opet do nejistoty, tenky led, kdy ti kazdy prohlizec ten kod muze preskladat jinym zpusobem a muze fungovat uplne jinak. Nehlede na to, ze obcas funguje jinak i se spravnym kodem :)

 
Nahoru Odpovědět
1.8.2022 8:36
Avatar
Odpovídá na Peter Mlich
Lukáš Havlíček:1.8.2022 17:08

Ahoj, děkuji za vysvětlení. Až budu mít po práci čas, tak se nato pořádně kouknu, vyzkouším a dám vědět :).

 
Nahoru Odpovědět
1.8.2022 17:08
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 4 zpráv z 4.