sql >> Database >  >> RDS >> Mysql

php geeft geen variabelen door

De HTML bevat een paar fouten en het formulier dat wordt gebruikt om naar campings te zoeken, geeft eigenlijk geen gegevens door, hoogstwaarschijnlijk vanwege enkele fouten in de HTML. Een ul element kan li . hebben elementen alleen als kinderen - maar die li elementen kunnen andere inhoud hebben (meestal niet de beste manier om het in dit geval IMO te doen) en invoerelementen van welk type dan ook zouden een naamattribuut en in het algemeen een waarde moeten hebben. In het geval van het reserveringsformulier fire ,electric en sewer moet als zodanig worden genoemd met een waarde van 1 (zie vorige vraag). De datumkiezers moeten namen hebben, dus ofwel in plaats van een ID of ook, noem ze startdate en enddate omdat het php-script ze verwacht in de POST-array.

Als het formulier de gegevens met succes heeft ingediend en de sql-query goed is uitgevoerd, waar zouden dan de resultaten verschijnen? Ik kan zien dat de actie van het formulier is includes/reserve.inc.php dat is het tweede deel van de code ( PHP ) maar dat levert geen inhoud op.

Het bewerken van de HTML in de browser om attributen toe te voegen aan de verschillende formulierelementen en het wijzigen van hun waarden voordat het formulier werd verzonden, leverde de volgende POST-parameters op de live-pagina op...

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

Terwijl voorheen alleen de submit1 verscheen. Er is echter nog steeds geen resultaat teruggestuurd.

Zoals je al hebt jQuery op de pagina voor verschillende taken zou het misschien zijn om ajax te gebruiken om de gegevens naar het backend PHP-script te POST en de callback te gebruiken om de HTML-inhoud aan de huidige pagina toe te voegen? Zeker iets om over na te denken.

<?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>

Door naar het backend-script.

Heeft u tafels met de naam campsite en campsites ? De sql-statements hebben allemaal ingebouwde variabelen die, ondanks het gebruik van mysqli_real_escape_string , maakt uw code mogelijk kwetsbaar voor SQL-injectie, dus u moet prepared statements gebruiken wanneer u door de gebruiker geleverde invoer gebruikt. Er is slechts één veld nodig dat kan worden misbruikt om het hele systeem in gevaar te brengen! Ik kon een deel van de logica niet helemaal volgen met wat daar aan de hand was (waarschijnlijk nog niet genoeg cafeïne), dus het volgende kan niet kloppen

<?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('Locatie:/index.php?error=no_available_camps')); } } else { echo "Kan SQL-query niet voorbereiden"; } }?>

Er waren andere sql-statements, maar zoals ik al zei, ik kon de logica niet helemaal volgen, dus het bovenstaande is hoogstwaarschijnlijk onvolledig/fout, maar zou in ieder geval een beetje moeten helpen met voorbereide statements.

Andere punten

Je hebt een onverwerkte fout op de campground.php pagina die onthult

includes/reserve.php en /reserve.php beide geven een 404-Not Found fout

Gebruik misschien een .htaccess bestand binnen de images directory om hotlinking of browsen door directory's te voorkomen.

Er zitten een aantal verbluffende afbeeldingen in, maar sommige zijn, om eerlijk te zijn, absoluut enorm en ondanks dat de meerderheid van de mensen snel breedband heeft, downloadt het downloaden van een 3.7Mb jpg als onderdeel van de HTML-stroom de zaken enigszins - dus misschien zou wat beeldoptimalisatie een goede zijn idee ook. Dat gezegd hebbende - ik zou zelf graag naar deze plek gaan!




  1. Dynamische SQL Pivot (met CONVERT DateField

  2. Niet alle parameters werden gebruikt in de SQL-instructie bij gebruik van python en mysql

  3. Best practice meertalige website

  4. Kardinaliteitsschatting:dichtheidsstatistieken combineren