sql >> データベース >  >> RDS >> Mysql

phpが変数を渡さない

    HTMLにはいくつかのエラーがあり、キャンプサイトの検索に使用されるフォームは実際にはデータを送信しません。これはおそらくHTMLのエラーの一部が原因です。 ul 要素はliを持つことができます 子としての要素のみ-ただし、それらのli 要素は他のコンテンツ(通常、この場合はIMOを実行するための最良の方法ではありません)を持ち、名前属性と通常は値を持つ必要がある任意のタイプの入力要素を形成できます。予約フォームの場合fireelectric およびsewer 値1でそのように名前を付ける必要があります(前の質問を参照してください)。日付ピッカーには名前を付ける必要があるため、IDの代わりに、または名前をstartdateにします。 およびenddate phpスクリプトはPOST配列でそれらを期待しているためです。

    フォームがデータを正常に送信し、SQLクエリが正常に実行された場合、結果はどこに表示されますか?フォームのアクションはincludes/reserve.inc.phpであることがわかります これはコードの2番目の部分(PHP)ですが、コンテンツは出力されません。

    ブラウザでHTMLを編集して、さまざまなフォーム要素に属性を追加し、フォームを送信する前にそれらの値を変更すると、ライブページに次のPOSTパラメータが生成されました...

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

    以前はsubmit1のみでした 登場していた。しかし、それでも結果は返送されませんでした。

    すでにjQueryを持っているので さまざまなタスクのページで、おそらくやるべきことは、ajaxを使用してデータをバックエンドPHPスクリプトにPOSTし、コールバックを使用してHTMLコンテンツを現在のページに追加することです。確かに、おそらく何かを考える必要があります。

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

    バックエンドスクリプトに移ります。

    campsiteという名前のテーブルはありますか およびcampsitesmysqli_real_escape_stringを使用しているにもかかわらず、sqlステートメントにはすべて変数が埋め込まれています。 、コードはSQLインジェクションに対して潜在的に脆弱なままなので、prepared statementsを使用する必要があります ユーザー提供の入力を使用しているときはいつでも。システム全体を危険にさらすために悪用される可能性のあるフィールドが1つだけ必要です。私はそこで起こっていることで論理のいくつかを完全にたどることができませんでした(おそらくまだ十分なカフェインがありません)ので、以下はマークの広いかもしれません

    <?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"SQLクエリの準備に失敗しました"; }}?>

    そこには他のSQLステートメントがありましたが、私が言ったように、ロジックに完全に従うことができなかったので、上記はおそらく不完全/間違っていますが、少なくともプリペアドステートメントで少し役立つはずです。

    その他のポイント

    campground.phpに未処理のエラーがあります 明らかにするページ

    includes/reserve.php および/reserve.php どちらも404-Not Foundを生成します エラー

    おそらく.htaccessを使用します images内のファイル ホットリンクまたはディレクトリブラウジングを防ぐためのディレクトリ。

    そこには素晴らしい画像がいくつかありますが、正直なところ、絶対に巨大な画像もあります。HTMLフローの一部として3.7Mb jpgを高速ブロードバンドでダウンロードしている人の大多数にもかかわらず、画像の最適化は多少遅くなります。アイデアも。そうは言っても、自分でこの場所に行きたいです!




    1. MariaDBの名前付きコマンド

    2. Unixエポックをタイムスタンプに変換する方法

    3. MySQLのベストプラクティスの質問:IDまたは日付で並べ替えますか?

    4. SQLORDERBY複数の列