HTML memiliki beberapa kesalahan dan formulir yang digunakan untuk mencari tempat perkemahan sebenarnya tidak mengirimkan data apa pun, kemungkinan besar karena beberapa kesalahan dalam HTML. Sebuah ul
elemen dapat memiliki li
elemen sebagai anak-anak saja - tetapi li
elemen dapat memiliki konten lain (biasanya bukan cara terbaik untuk melakukannya IMO dalam kasus ini) dan membentuk elemen input jenis apa pun harus memiliki atribut nama dan umumnya nilai. Dalam hal formulir pemesanan fire
,electric
dan sewer
harus dinamai demikian dengan nilai 1 (lihat pertanyaan sebelumnya). Pemilih tanggal harus memiliki nama, jadi sebagai ganti ID atau juga, beri nama startdate
dan enddate
karena skrip php mengharapkannya dalam larik POST.
Jika formulir berhasil mengirimkan data dan kueri sql berjalan dengan baik, di mana hasilnya akan muncul? Saya dapat melihat bahwa tindakan formulir adalah includes/reserve.inc.php
yang merupakan bagian kedua dari kode ( PHP ) tetapi tidak menampilkan konten apa pun.
Mengedit HTML di browser untuk menambahkan atribut ke berbagai elemen formulir dan mengubah nilainya sebelum mengirimkan formulir menghasilkan parameter POST berikut di laman langsung...
startdate=01%2F03%2F2018&enddate=01%2F17%2F2018&fire=1&electric=1&sewer=1&submit1=
Padahal sebelumnya hanya submit1
muncul. Namun masih belum ada hasil yang dikirim kembali.
Karena Anda sudah memiliki jQuery
pada halaman untuk berbagai tugas mungkin hal yang harus dilakukan adalah menggunakan ajax untuk POST data ke skrip PHP backend dan menggunakan panggilan balik untuk menambahkan konten HTML ke halaman saat ini? Pasti sesuatu untuk dipikirkan mungkin.
<?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('▲')
else $(this).find('span').html('▼')
})
});
$(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>
Pindah ke skrip backend.
Apakah Anda memiliki tabel bernama campsite
dan campsites
? Pernyataan sql semuanya memiliki variabel yang disematkan, meskipun menggunakan mysqli_real_escape_string
, apakah kode Anda berpotensi rentan terhadap Injeksi SQL sehingga Anda harus menggunakan prepared statements
setiap kali Anda menggunakan input yang disediakan pengguna. Hanya dibutuhkan satu bidang yang dapat dieksploitasi untuk mengkompromikan seluruh sistem! Saya tidak bisa mengikuti beberapa logika dengan apa yang terjadi di sana (mungkin belum cukup kafein) jadi yang berikut ini mungkin tidak tepat
<?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 "Gagal menyiapkan query sql"; } }?> Ada pernyataan sql lain di sana tetapi seperti yang saya katakan saya tidak bisa mengikuti logika sehingga kemungkinan besar di atas tidak lengkap/salah tetapi setidaknya harus membantu dengan pernyataan yang disiapkan.
Poin lainnya
Anda memiliki kesalahan yang tidak tertangani di campground.php
halaman yang mengungkapkan
includes/reserve.php
dan /reserve.php
keduanya menghasilkan 404-Not Found
kesalahan
Mungkin menggunakan .htaccess
file di dalam images
direktori untuk mencegah hotlinking atau penjelajahan direktori.
Ada beberapa gambar yang menakjubkan di sana tetapi beberapa, sejujurnya, sangat besar dan meskipun sebagian besar orang memiliki broadband cepat mengunduh jpg 3,7Mb sebagai bagian dari aliran HTML agak memperlambat segalanya - jadi mungkin beberapa pengoptimalan gambar akan bagus ide juga. Yang mengatakan - saya ingin pergi ke tempat ini sendiri!