sql >> Database teknologi >  >> RDS >> Mysql

php sender ikke variabler videre

HTML'en har nogle få fejl, og formularen, der bruges til at søge efter campingpladser, indsender faktisk ikke nogen af ​​dataene, sandsynligvis på grund af nogle af fejlene i HTML'en. En ul element kan have li elementer kun som børn - men de li elementer kan have andet indhold (typisk ikke den bedste måde at gøre det på IMO i dette tilfælde) og danne input-elementer af hvilken som helst type, der skal have en navneattribut og generelt en værdi. I tilfælde af reservationsformularen fire ,electric og sewer skal navngives som sådan med værdien 1 (se forrige spørgsmål). Datovælgerne skal have navne, så enten i stedet for et ID eller samt navngive dem startdate og enddate da php-scriptet forventer dem i POST-arrayet.

Hvis formularen indsendte dataene, og sql-forespørgslen kørte OK, hvor ville resultaterne så blive vist? Jeg kan se, at handlingen i formularen er includes/reserve.inc.php som er den anden del af koden ( PHP ), men som ikke udsender noget indhold.

Redigering af HTML i browseren for at tilføje attributter til de forskellige formularelementer og ændring af deres værdier før indsendelse af formularen gav følgende POST-parametre på livesiden...

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

Mens før kun submit1 dukkede op. Der var dog stadig intet resultat sendt tilbage.

Som du allerede har jQuery på siden til forskellige opgaver ville det måske være at bruge ajax til at POST dataene til backend PHP-scriptet og bruge tilbagekaldet til at tilføje HTML-indholdet til den aktuelle side? Helt sikkert noget at tænke over måske.

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

Går videre til backend-scriptet.

Har du borde med navnet campsite og campsites ? SQL-sætningerne har alle indlejrede variabler, som på trods af brugen af ​​mysqli_real_escape_string , efterlader din kode potentielt sårbar over for SQL Injection, så du bør bruge prepared statements hver gang du bruger brugerleveret input. Det kræver blot et felt, der kan udnyttes til at kompromittere hele systemet! Jeg kunne ikke helt følge noget af logikken med, hvad der foregik der (ikke nok koffein sandsynligvis endnu), så det følgende kan være langt fra målet

<?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('Location:/index.php?error=no_available_camps')); } } else { echo "Kunnede ikke forberede sql-forespørgsel"; } }?>

Der var andre sql-udsagn derinde, men som sagt kunne jeg ikke helt følge logikken, så ovenstående er højst sandsynligt ufuldstændigt/forkert, men burde i det mindste hjælpe lidt med forberedte udsagn.

Andre punkter

Du har en uhåndteret fejl på campground.php side, der afslører

includes/reserve.php og /reserve.php begge giver en 404-Not Found fejl

Brug måske en .htaccess fil i images bibliotek for at forhindre enten hotlinking eller browsing i mapper.

Der er nogle fantastiske billeder derinde, men nogle er, for at være ærlig, helt enorme, og på trods af at de fleste mennesker har hurtigt bredbånd, vil download af en 3,7 Mb jpg som en del af HTML-flowet gøre tingene noget langsommere - så måske ville en vis billedoptimering være en god idé. idé også. Når det er sagt - jeg ville elske at tage til dette sted selv!




  1. Jeg vil have en trigger til at SLETTE fra 2 tabeller i MySQL

  2. OPDATERING hvis der findes andet INSERT i SQL

  3. MySQL ODBC-problem:Datakildenavn blev ikke fundet, og ingen standarddriver er angivet

  4. foreach %dopar% + RPostgreSQL