HTML có một vài lỗi và biểu mẫu được sử dụng để tìm kiếm địa điểm cắm trại không thực sự gửi bất kỳ dữ liệu nào, rất có thể do một số lỗi trong HTML. A ul
phần tử có thể có li
phần tử chỉ là phần tử con - nhưng những phần tử li
đó các phần tử có thể có nội dung khác (thường không phải là cách tốt nhất để làm điều đó IMO trong trường hợp này) và các phần tử đầu vào của biểu mẫu thuộc bất kỳ loại nào cũng phải có thuộc tính tên và nói chung là một giá trị. Trong trường hợp của biểu mẫu đặt chỗ fire
, electric
và sewer
nên được đặt tên như vậy với giá trị là 1 (tham khảo câu hỏi trước). Bộ chọn ngày cần phải có tên, vì vậy thay vì ID hoặc cũng như đặt tên cho chúng là startdate
và enddate
vì tập lệnh php đang mong đợi chúng trong mảng ĐĂNG.
Nếu biểu mẫu đã gửi dữ liệu thành công và truy vấn sql chạy OK, kết quả sẽ xuất hiện ở đâu? Tôi có thể thấy rằng hành động của biểu mẫu là includes/reserve.inc.php
là phần thứ hai của mã (PHP) nhưng không xuất ra bất kỳ nội dung nào.
Việc chỉnh sửa HTML trong trình duyệt để thêm các thuộc tính vào các phần tử biểu mẫu khác nhau và thay đổi giá trị của chúng trước khi gửi biểu mẫu mang lại các thông số POST sau trên trang trực tiếp ...
startdate=01%2F03%2F2018&enddate=01%2F17%2F2018&fire=1&electric=1&sewer=1&submit1=
Trong khi trước đó chỉ có submit1
đã xuất hiện. Tuy nhiên vẫn không có kết quả nào được gửi lại.
Như bạn đã có jQuery
trên trang cho các tác vụ khác nhau, có lẽ điều cần làm là sử dụng ajax để ĐĂNG dữ liệu lên tập lệnh PHP phụ trợ và sử dụng lệnh gọi lại để thêm nội dung HTML vào trang hiện tại? Chắc chắn có điều gì đó cần suy nghĩ.
<?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>
Chuyển sang tập lệnh phụ trợ.
Bạn có bảng tên campsite
không và campsite
? Tất cả các câu lệnh sql đều có các biến nhúng, mặc dù sử dụng mysqli_real_escape_string
, làm cho mã của bạn có khả năng dễ bị tấn công bởi SQL Injection, vì vậy bạn nên sử dụng prepared statements
bất cứ khi nào bạn đang sử dụng đầu vào do người dùng cung cấp. Chỉ cần một trường có thể bị khai thác để xâm phạm toàn bộ hệ thống! Tôi không thể hoàn toàn tuân theo một số logic với những gì đang diễn ra ở đó (có thể là chưa đủ caffeine) vì vậy phần sau có thể không phù hợp
<?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 ('Vị trí:/index.php?error=no_available_camps')); }} else {echo "Không chuẩn bị được truy vấn sql"; }}?> Có những câu lệnh sql khác trong đó nhưng như tôi đã nói, tôi không thể tuân theo logic vì vậy phần trên rất có thể là không đầy đủ / sai nhưng ít nhất nên chỉnh sửa một chút với các câu lệnh đã chuẩn bị.
Các điểm khác
Bạn gặp lỗi chưa được khắc phục trên campground.php
trang tiết lộ
includes/reserve.php
và /reserve.php
cả hai đều mang lại 404-Not Found
lỗi
Có thể sử dụng .htaccess
tệp trong images
thư mục để ngăn chặn liên kết nóng hoặc duyệt thư mục.
Có một số hình ảnh tuyệt đẹp trong đó nhưng một số hình ảnh, thành thật mà nói, hoàn toàn rất lớn và mặc dù phần lớn mọi người tải xuống băng thông rộng nhanh jpg 3,7Mb vì một phần của luồng HTML làm chậm mọi thứ - vì vậy có lẽ một số tối ưu hóa hình ảnh sẽ là tốt ý tưởng quá. Điều đó nói lên rằng - tôi muốn tự mình đến nơi này!