sql >> Databáze >  >> RDS >> Mysql

php nepředávají proměnné

HTML obsahuje několik chyb a formulář používaný k vyhledávání kempů ve skutečnosti neodesílá žádná data, pravděpodobně kvůli některým chybám v HTML. ul prvek může mít li prvky pouze jako děti - ale ty li prvky mohou mít jiný obsah (v tomto případě to obvykle není nejlepší způsob, jak to udělat IMO) a tvořit vstupní prvky jakéhokoli typu, které by měly mít atribut názvu a obecně hodnotu. V případě rezervačního formuláře fire ,electric a sewer by měl být takto pojmenován s hodnotou 1 (viz předchozí otázka). Výběr data musí mít jména, takže buď místo ID, nebo také, pojmenujte je startdate a enddate protože je očekává php skript v poli POST.

Pokud by formulář úspěšně odeslal data a dotaz SQL proběhl v pořádku, kde by se zobrazily výsledky? Vidím, že akce formuláře je includes/reserve.inc.php což je druhá část kódu ( PHP ), ale nevydává žádný obsah.

Úprava kódu HTML v prohlížeči za účelem přidání atributů k různým prvkům formuláře a změna jejich hodnot před odesláním formuláře přinesla na aktivní stránce následující parametry POST...

startdate=01%2F03%2F2018&enddate=01%2F17%2F2018&fire=1&electric=1&sewer=1&submit1=

Zatímco dříve pouze submit1 se objevoval. Stále však nebyl odeslán zpět žádný výsledek.

Jak již máte jQuery na stránce pro různé úkoly by možná bylo třeba použít ajax k POST dat do backendového PHP skriptu a použít zpětné volání k přidání obsahu HTML na aktuální stránku? Možná určitě něco k zamyšlení.

<?php
    @session_start();
    require_once("includes/dbh.inc.php");
?>

<!DOCTYPE html>
<html>
    <head>
        <script src="//ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
        <script>

            $(document).ready(function(){
              $('#login-trigger').click(function(){
                $(this).next('#login-content').slideToggle();
                $(this).toggleClass('active');

                if ($(this).hasClass('active')) $(this).find('span').html('&#x25B2;')
                  else $(this).find('span').html('&#x25BC;')
                })
            });

            $(document).ready(function(){
              $('#reserve-trigger').click(function(){
                $(this).next('#reserve-content').slideToggle();
                $(this).toggleClass('active');
                })
            });

            $('#reserve-trigger').on('focusout', function () {
              $(this).toggleClass('active');
            });

            $('#login-trigger').on('focusout', function () {
              $(this).toggleClass('active');
            });
        </script>
        <link rel="stylesheet" href="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/themes/smoothness/jquery-ui.css">
        <script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
        <script src="//ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/jquery-ui.min.js">
        <script>
            $(document).ready(function() {  $("#startdate").datepicker();  });
            $(document).ready(function() {  $("#enddate").datepicker();  });
        </script>
        <link rel="stylesheet" href="./css/style.css">
    </head>
    <body>
        <header>
            <div class='container'>
                <div id='branding'>
                    <h1><span class='highlight'>Whispering</span> Winds Park</h1>
                </div>
                <nav>
                    <ul>
                        <li class='current'><a href='index.php'>Home</a></li>
                        <li><a href='mission.php'>Our Mission</a></li>
                        <li><a href='donate.php'>Donate</a></li>
                        <li><a id='reserve-trigger' href='#'>Camping</a>
                            <div id='reserve-content' tabindex='-1'>

                                <form action='includes/reserve.inc.php' method='POST'>
                                    <fieldset>
                                        <!--

                                            child elements of a `ul` should be `li` only
                                            so you required a few more `<li></li>` around
                                            certain items here

                                            Form input elements require a name attribute and a type for the datepickers

                                        -->
                                        <ul>
                                            <li><input type='text' id='startdate' name='startdate' placeholder='Start Date' /></li>
                                            <li><input type='text' id='enddate' name='enddate' placeholder='End Date'/></li>
                                            <!--

                                                The checkboxes require a name attribute otherwise they will not appear
                                                in the POST array data. Set the value to `1` as it is a bit stored in 
                                                the db anyway

                                            -->
                                            <li><label for='fire'>Fire Pit: </label><input type='checkbox' name='Fire' value=1></li>
                                            <li><label for='electric'>Electricity: </label><input type='checkbox' name='Electric' value=1></li>
                                            <li><label for='sewer'>Sewage: </label><input type='checkbox' name='Sewer' value=1></li>
                                            <li><button type='submit' class='button3' name='submit1'>Find a Reservation</button></li>
                                        </ul>
                                    </fieldset>
                                </form>

                            </div>
                        </li>

                        <!-- /*login button*/ -->
                        <?php
                            if( isset( $_SESSION["u_uid"] ) ) {
                                echo '
                                <li>
                                    <form action="includes/logout.inc.php" method="POST">
                                        <button type="submit" class="button_1" name="Submit">Logout</button>
                                    </form>
                                </li>';

                            } else {

                                echo
                                '<li id="login">
                                    <a id="login-trigger" href="#">
                                        <button class="button_1">Log in <span>▼</span></button>
                                    </a>
                                    <div id="login-content" tabindex="-1">
                                        <form action="includes/login.inc.php" method="POST">
                                            <fieldset id="inputs">
                                                <input type="text" name="uid" placeholder="Username" required>
                                                <input type="password" name="pwd" placeholder="Password" required>
                                                <button type="submit" class="button3" name="Submit">Log In</button>
                                            </fieldset>
                                        </form>
                                    </div>
                                </li>
                                <li id="signup">
                                    <a href="signup.php"><button class="button_1">Sign up</button></a>
                                </li>';
                            }
                            if( isset( $_SESSION["u_admin"] ) ) {
                                echo '
                                <li id="signup">
                                  <a href="admin.php"><button class="button_1">Admin</button></a>
                                </li>';
                            }
                        ?>
                  </ul>
                </nav>
            </div>
        </header>
    </body>
</html>

Přecházíme na backendový skript.

Máte stoly s názvem campsite? a campsites ? Všechny příkazy sql mají vložené proměnné, které navzdory použití mysqli_real_escape_string , ponechává váš kód potenciálně zranitelný vůči SQL Injection, takže byste měli používat prepared statements kdykoli používáte vstup dodaný uživatelem. Stačí jedno pole, které lze zneužít ke kompromitaci celého systému! Nemohl jsem se docela dobře řídit logikou toho, co se tam dělo (pravděpodobně ještě není dost kofeinu), takže následující může být hodně nadprůměrné

<?php
    session_start();

    /* Prevent direct access to this script in the browser */
    if ( realpath(__FILE__) == realpath( $_SERVER['SCRIPT_FILENAME'] ) ) {

        /* could send a 403 but Not Found is probably better */
        header( 'HTTP/1.0 404 Not Found', TRUE, 404 );
        die( header( 'location: /index.php' ) );
    }

    if( $_SERVER['REQUEST_METHOD']=='POST' && isset( $_POST['submit1'], $_POST['startdate'], $_POST['enddate'], $_POST['fire'], $_POST['electric'], $_POST['sewer'] ) ) {

        if ( empty( $_POST['startdate'] ) || empty( $_POST['enddate'] ) ) {
            exit( header( 'Location: ../index.php?index=empty_dates' ) );
        }


        /* results from search query will be stored in this array for later use */
        $output=array();

        require_once('dbh.inc.php');

        /*
            Do startdate and enddate need to be session variables???
        */
        $startdate = filter_input( INPUT_POST,'startdate',FILTER_SANITIZE_SPECIAL_CHARS );
        $enddate = filter_input( INPUT_POST,'enddate',FILTER_SANITIZE_SPECIAL_CHARS );
        $fire = filter_var( filter_input( INPUT_POST,'fire', FILTER_SANITIZE_NUMBER_INT ), FILTER_VALIDATE_INT );
        $electric = filter_var( filter_input( INPUT_POST,'electric', FILTER_SANITIZE_NUMBER_INT ), FILTER_VALIDATE_INT );
        $sewer = filter_var( filter_input( INPUT_POST,'sewer', FILTER_SANITIZE_NUMBER_INT ), FILTER_VALIDATE_INT );

        /*
            Dates from the DatePicker are in mm/dd/yyyy
            but typically we would want to use yyyy/mm/dd
            in the database.
        */
        $startdate=DateTime::createFromFormat( 'm/d/Y', $startdate )->format('Y-m-d');
        $enddate=DateTime::createFromFormat( 'm/d/Y', $enddate )->format('Y-m-d');



        if( $fire > 1 or $fire < 0 or is_string( $fire ) ) $fire=0;
        if( $electric > 1 or $electric < 0 or is_string( $electric ) ) $electric=0;
        if( $sewer > 1 or $sewer < 0 or is_string( $sewer ) ) $sewer=0;


        $sql='select `site_id`,`uid`,`startdate`,`enddate`,`s_price` from `campsite` 
                where `water`=? and `fire`=? and `electric`=? and `site_id` not in ( 
                    select `site_id` 
                    from `reservation` 
                    where `startdate` >= ? and `startdate` <= ?
                )';

        $stmt=$conn->prepare( $sql );
        if( $stmt ){

            $stmt->bind_param('iiiss', $sewer, $fire, $electric, $startdate, $enddate );
            $result = $stmt->execute();
            $rows = $result->num_rows;

            if( $result && $rows > 0 ){

                $stmt->store_result();
                $stmt->bind_result( $id, $uid, $start, $end, $price );

                while( $stmt->fetch() ){
                    $output[]=array(
                        'site_id'   =>  $id,
                        'uid'       =>  $uid,
                        'startdate' =>  $start,
                        'enddate'   =>  $end,
                        's_price'   =>  $price
                    );
                }
                $stmt->free_result();
                $stmt->close();
                $conn->close();

                /* 
                    Now we should have an array with the recordset data from the search
                    Depending upon form submission method ( standard or ajax ) you need to
                    do something with that data. Typically you would let the user know the
                    results of the search ( otherwise what is the point of letting them search? )

                    So, you could format the results here as HTML or send back json etc
                */
                foreach( $output as $index => $site ){
                    echo "
                    <pre>
                        {$site['site_id']}
                        {$site['uid']}
                        {$site['startdate']}
                        {$site['enddate']}
                        {$site['s_price']}
                    </pre>";
                }

            } else {
                exit( header('Location: /index.php?error=no_available_camps') );
            }
        } else {
            echo "Failed to prepare sql query";
        }
    }
?>
"; } } else { exit( header('Umístění:/index.php?error=no_available_camps') ); } } else { echo "Nepodařilo se připravit dotaz SQL"; } }?>

Byly tam další příkazy SQL, ale jak jsem řekl, nemohl jsem se úplně řídit logikou, takže výše uvedené je s největší pravděpodobností neúplné/špatné, ale mělo by to alespoň trochu pomoci s připravenými příkazy.

Další body

Máte neošetřenou chybu na campground.php stránku, která odhaluje

includes/reserve.php a /reserve.php oba dávají 404-Not Found chyba

Možná použijte .htaccess soubor v images adresář, aby se zabránilo buď hotlinkingu, nebo procházení adresářů.

Je tam několik úžasných obrázků, ale některé jsou, abych byl upřímný, naprosto obrovské, a přestože většina lidí má rychlé širokopásmové stahování 3,7 Mb jpg jako součást toku HTML věci poněkud zpomaluje - takže možná by byla dobrá nějaká optimalizace obrázků nápad taky. To znamená – rád bych na toto místo šel sám!




  1. Zobrazení MySQL – Kdy použít a kdy ne

  2. Použití sqlalchemy k dotazu pomocí více sloupců kde v klauzuli

  3. Nejlevnější způsob, jak zjistit, zda je připojení MySQL stále živé

  4. chyba syntaxe pro deklaraci proměnné mysql