Diskuze: Problém s registrací

PHP PHP Problém s registrací American English version English version

Avatar
Michal Kuba
Redaktor
Avatar
Michal Kuba:

Zdravím.
Naprosto nechápu, co se děje. Už jsem na jiném webu v pohodě zprovoznil registraci, teď mi to ale nejde. Databázi mám vytvořenou, ovšem když po zadání nějakých hodnot kliknu na registrovat, načte se mi zpátky bílá stránka registrovat.php . Nevíte, v čem je zakopaný pes?

Viz. kód níže (informace pro připojení k databázi jsem vymazal až zde)

<?php

session_start();
require('Db.php');
Db::connect('');



if ($_POST)
{
        if ($_POST['rok'] != date('Y'))
                $zprava = 'Chybně vyplněný antispam.';
        else if ($_POST['heslo'] != $_POST['heslo_znovu'])
                $zprava = 'Hesla nesouhlasí';
        else
        {
                $existuje = Db::querySingle('
                        SELECT COUNT(*)
                        FROM uzivatele
                        WHERE jmeno=?
                        LIMIT 1
                ', $_POST['jmeno']);
                if ($existuje)
                        $zprava = 'Uživatel s touto přezdívkou je již v databázi obsažen.';
                else
                {
                        Db::query('
                                INSERT INTO uzivatele (jmeno, heslo)
                                VALUES (?, SHA1(?))
                        ', $_POST['jmeno'], $_POST['heslo'] . "t&#ssdf54gh" );
                        $_SESSION['uzivatel_id'] = Db::getLastId();
                        $_SESSION['uzivatel_jmeno'] = $_POST['jmeno'];

                        $_SESSION['uzivatel_admin'] = 0;
                        header('Location: administrace.php');
                        exit();
                }
        }
}
?>
<!DOCTYPE html>
<html lang="cs-cz">
<head>
       <meta charset="utf-8" />


                <link rel="stylesheet" href="css/styl.css" type="text/css" />
        <title>Registrace</title>
</head>

<body>
      <header>
            <div id="nazev"><a>Brněnský Mikuláš 2014</a></div>
            <nav>
                <ul>
                    <li><a href="index.php">Domů</a></li>
                    <li><a href="objednavka.php">Domluvit návštěvu</a></li>
                    <li><a href="fotogalerie.php">Fotogalerie</a></li>
                    <li><a href="oNas.php">O nás</a></li>
                    <li><a href="kontakt.php">Kontakt</a></li>
                </ul>
            </nav>
        </header>
        <article>

                        <header>
                                Registrace
                        </header>
                        <section>
                                <?php
                                        if (isset($zprava))
                                                echo('<p>' . $zprava . '</p>');
                                ?>

                                <form method="post">
                                        Jméno<br />
                                        <input type="text" name="jmeno" /><br />
                                        Heslo<br />
                                        <input type="password" name="heslo" /><br />
                                        Heslo znovu<br />
                                        <input type="password" name="heslo_znovu" /><br />

                                        Zadejte aktuální rok (antispam)<br />
                                        <input type="text" name="rok" /><br />
                                        <input type="submit" value="Registrovat" />
                                </form>
 
Odpovědět 5.10.2014 21:37
Avatar
Odpovídá na Michal Kuba
Martin Konečný (pavelco1998):

Zkus na začátek souboru hodit

error_reporting(E_ALL);

Přijde mi, že je tam někde chyba, ale máš vypnutý hlášení.

 
Nahoru Odpovědět  +2 5.10.2014 22:04
Avatar
Richard
Člen
Avatar
Richard:

else if -> elseif ?

Nahoru Odpovědět 5.10.2014 22:04
$action = $_GET['Life']; | Když dáš mínus, napiš proč!
Avatar
Matúš Petrofčík
Šéfredaktor
Avatar
Odpovídá na Richard
Matúš Petrofčík:

else if je to isté ako elseif bez medzery

Nahoru Odpovědět 5.10.2014 22:48
obsah kocky = r^2 ... a preto vlak drnká
Avatar
Richard
Člen
Avatar
Odpovídá na Matúš Petrofčík
Richard:

Ano máš pravdu, moje chyba. Jen přidám, že else if lze použít pouze v případě,, že jsou použity {} závorky, to je to co mě zmátlo.

Nic jsem tam nenašel, není chyba v Db.php, případně v Db::connect ?

Nahoru Odpovědět 5.10.2014 23:06
$action = $_GET['Life']; | Když dáš mínus, napiš proč!
Avatar
Matúš Petrofčík
Šéfredaktor
Avatar
Odpovídá na Richard
Matúš Petrofčík:

Človeče fakt, toto som ani netušil :) každopádne môže to byť tá chyba tak si Michal Kuba zapni zobrazovanie chýb tak ako ti radil pavelco1998

http://php.net/…s.elseif.php : "Note: Note that elseif and else if will only be considered exactly the same when using curly brackets as in the above example. When using a colon to define your if/elseif conditions, you must not separate else if into two words, or PHP will fail with a parse error."

Nahoru Odpovědět 5.10.2014 23:16
obsah kocky = r^2 ... a preto vlak drnká
Avatar
Matúš Petrofčík
Šéfredaktor
Avatar
Matúš Petrofčík:

Ono je najlepšie všetky IF, ELSE, WHILE, FOR.... bloky uzatvárať do kučeravých zátvoriek {} aj keď je tam len jeden riadok

Ja to tak robím vždy, môžem tak dopísať ďaľší kód bez toho aby som musel pridávať zátvorky.

Richard: a možno preto som o tomto probléme nevedel, lebo som sa s ním nikdy nestretol :D

<?php

/* Incorrect Method: */
if($a > $b):
    echo $a." is greater than ".$b;
else if($a == $b): // Will not compile.
    echo "The above line causes a parse error.";
endif;


/* Correct Method: */
if($a > $b):
    echo $a." is greater than ".$b;
elseif($a == $b): // Note the combination of the words.
    echo $a." equals ".$b;
else:
    echo $a." is neither greater than or equal to ".$b;
endif;

?>
Nahoru Odpovědět  +1 5.10.2014 23:20
obsah kocky = r^2 ... a preto vlak drnká
Avatar
Michal Kuba
Redaktor
Avatar
Odpovídá na Richard
Michal Kuba:

Připojení k databázi by mělo být v pořádku, kdyby nebylo, tak by se ta stránka ani nenačetla, ne?
Hlavně mi vrtá hlavou, proč při kliknutí na odeslat se znovu načte bílá stránka registrace.php , i když je v Location: header udána jiná stránka. Jinak Db.php používám zde z devbooku a nic jsem tuším neměnil, pro jisotu kód, ale v tom bych chybu neviděl.

<?php


class Db
{

        private static $connection;


        private static $options = array(
                PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING,
                PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8",
                PDO::ATTR_EMULATE_PREPARES => false,
        );

        /**
         * Připojí se k databázi pomocí daných údajů
         * @param string $host Název hostitele
         * @param string $database Název databáze
         * @param string $user Uživatelské jméno
         * @param string $password Heslo
         */
        public static function connect($host, $database, $user, $password)
        {
                if (!isset(self::$connection)) {
                        $dsn = "mysql:host=$host;dbname=$database";
                        self::$connection = new PDO($dsn, $user, $password, self::$options);
                }
        }

        /**
         * Spustí dotaz a vrátí PDO statement
         * @param array $params Pole, kde je prvním prvkem dotaz a dalšími jsou parametry
         * @return \PDOStatement PDO statement
         */
        private static function executeStatement($params)
        {
                $query = array_shift($params);
                $statement = self::$connection->prepare($query);
                $statement->execute($params);
                return $statement;
        }


        public static function query($query) {
                $statement = self::executeStatement(func_get_args());
                return $statement->rowCount();
        }

        /**
         * Spustí dotaz a vrátí z něj první sloupec prvního řádku. Dále se předá libovolný počet dalších parametrů.
         * @param string $query Dotaz
         * @return mixed Hodnota prvního sloupce z prvního řádku
         */
        public static function querySingle($query) {
                $statement = self::executeStatement(func_get_args());
                $data = $statement->fetch();
                return $data[0];
        }

        /**
         * Spustí dotaz a vrátí z něj první řádek. Dále se předá libovolný počet dalších parametrů.
         * @param string $query Dotaz
         * @return mixed Pole výsledků nebo false při neúspěchu
         */
        public static function queryOne($query) {
                $statement = self::executeStatement(func_get_args());
                return $statement->fetch(PDO::FETCH_ASSOC);
        }

        /**
         * Spustí dotaz a vrátí všechny jeho řádky jako pole asociativních polí. Dále se předá libovolný počet dalších parametrů.
         * @param string $query Dotaz
         * @return mixed Pole řádků enbo false při neúspěchu
         */
        public static function queryAll($query) {
                $statement = self::executeStatement(func_get_args());
                return $statement->fetchAll(PDO::FETCH_ASSOC);
        }

        /**
         * Umožňuje snadné vložení záznamu do databáze pomocí asociativního pole
         * @param string $table Název tabulky
         * @param array $data Asociativní pole, kde jsou klíče sloupce a hodnoty hodnoty
         * @return int Počet ovlivněných řádků
         */
        public static function insert($table, $data) {
                $keys = array_keys($data);
                self::checkIdentifiers(array($table) + $keys);
                $query = "
                        INSERT INTO `$table` (`" . implode('`, `', $keys) . "`)
                        VALUES (" . str_repeat('?,', count($data) - 1) . "?)
                ";
                $params = array_merge(array($query), array_values($data));
                $statement = self::executeStatement($params);
                return $statement->rowCount();
        }

        /**
         * Umožňuje snadnou modifikaci záznamu v databázi pomocí asociativního pole
         * @param string $table Název tabulky
         * @param array $data Asociativní pole, kde jsou klíče sloupce a hodnoty hodnoty
         * @param string $condition Řetězec s SQL podmínkou (WHERE)
         * @return mixed
         */
        public static function update($table, $data, $condition) {
                $keys = array_keys($data);
                self::checkIdentifiers(array($table) + $keys);
                $query = "
                        UPDATE `$table` SET `".
                        implode('` = ?, `', array_keys($data)) . "` = ?
                        $condition
                ";
                $params = array_merge(array($query), array_values($data), array_slice(func_get_args(), 3));
                $statement = self::executeStatement($params);
                return $statement->rowCount();
        }

        /**
         * Vrátí poslední ID posledního záznamu vloženého pomocí INSERT
         * @return mixed Id posledního záznamu
         */
        public static function getLastId()
        {
                return self::$connection->lastInsertId();
        }

        /**
         * Ošetří string proti SQL injekci
         * @param string $string Řetězec
         * @return mixed Ošetřený řetězec
         */
        public static function quote($string)
        {
                return self::$connection->quote($string);
        }

        /**
         * Zkontroluje, zda identifikátory odpovídají formátu identifikátorů
         * @param array $identifiers Pole identifikátorů
         * @throws \Exception
         */
        private static function checkIdentifiers($identifiers)
        {
                foreach ($identifiers as $identifier)
                {
                        if (!preg_match('/^[a-zA-Z0-9\_\-]+$/u', $identifier))
                                throw new Exception('Dangerous identifier in SQL query');
                }
        }
}
 
Nahoru Odpovědět 6.10.2014 22:01
Avatar
Michal Kuba
Redaktor
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Michal Kuba:

To mi právě nejde, ani pomocí tvého kódu, který vložím na začátek php direktivity nebo i do samostatné na začátku :/

 
Nahoru Odpovědět 7.10.2014 13:36
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 10 zpráv z 10.