Der HTML-Code weist einige Fehler auf und das zur Suche nach Campingplätzen verwendete Formular übermittelt tatsächlich keine Daten, höchstwahrscheinlich aufgrund einiger Fehler im HTML-Code. Ein ul
Element kann li
haben Elemente nur als Kinder - aber diese li
Elemente können anderen Inhalt haben (in diesem Fall normalerweise nicht der beste Weg, dies zu tun) und Eingabeelemente jeglicher Art bilden, die ein Namensattribut und im Allgemeinen einen Wert haben sollten. Im Falle des Reservierungsformulars fire
,electric
und sewer
als solche mit dem Wert 1 benannt werden ( siehe vorherige Frage ). Die Datumsauswahlen müssen Namen haben, also nennen Sie sie entweder anstelle einer ID oder zusätzlich startdate
und enddate
da das PHP-Skript sie im POST-Array erwartet.
Wenn das Formular die Daten erfolgreich gesendet hat und die SQL-Abfrage OK ausgeführt wurde, wo würden die Ergebnisse erscheinen? Ich kann sehen, dass die Aktion des Formulars includes/reserve.inc.php
ist Dies ist der zweite Teil des Codes ( PHP ), der jedoch keinen Inhalt ausgibt.
Das Bearbeiten des HTML im Browser, um den verschiedenen Formularelementen Attribute hinzuzufügen und ihre Werte zu ändern, bevor das Formular gesendet wurde, ergab die folgenden POST-Parameter auf der Live-Seite...
startdate=01%2F03%2F2018&enddate=01%2F17%2F2018&fire=1&electric=1&sewer=1&submit1=
Während vorher nur der submit1
erschien. Es wurde jedoch immer noch kein Ergebnis zurückgesendet.
Da Sie bereits jQuery
haben auf der Seite für verschiedene Aufgaben wäre vielleicht die Verwendung von Ajax, um die Daten an das Backend-PHP-Skript zu senden und den Rückruf zu verwenden, um den HTML-Inhalt zur aktuellen Seite hinzuzufügen? Sicherlich etwas zum Nachdenken vielleicht.
<?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>
Weiter zum Backend-Skript.
Haben Sie Tische mit dem Namen campsite
? und campsites
? Die SQL-Anweisungen haben alle eingebettete Variablen, die trotz der Verwendung von mysqli_real_escape_string
, macht Ihren Code potenziell anfällig für SQL Injection, daher sollten Sie prepared statements
verwenden wenn Sie vom Benutzer bereitgestellte Eingaben verwenden. Es braucht nur ein Feld, das ausgenutzt werden kann, um das gesamte System zu kompromittieren! Ich konnte einigen der Logik nicht ganz folgen, was dort vor sich ging ( wahrscheinlich noch nicht genug Koffein ), daher ist das Folgende möglicherweise weit über das Ziel hinaus
<?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 "Vorbereitung der SQL-Abfrage fehlgeschlagen"; } }?> Es gab dort andere SQL-Anweisungen, aber wie gesagt, ich konnte der Logik nicht ganz folgen, daher ist das Obige höchstwahrscheinlich unvollständig/falsch, sollte aber zumindest bei vorbereiteten Anweisungen ein wenig helfen.
Andere Punkte
Sie haben einen unbehandelten Fehler in der campground.php
Seite, die
includes/reserve.php
und /reserve.php
beide ergeben ein 404-Not Found
Fehler
Verwenden Sie vielleicht eine .htaccess
Datei innerhalb der images
Verzeichnis, um entweder Hotlinking oder das Durchsuchen von Verzeichnissen zu verhindern.
Es gibt einige atemberaubende Bilder, aber einige sind, um ehrlich zu sein, absolut riesig, und obwohl die Mehrheit der Leute schnelles Breitband hat, verlangsamt das Herunterladen eines 3,7-MB-JPGs als Teil des HTML-Flusses die Dinge etwas - also wäre vielleicht eine Bildoptimierung gut Idee auch. Das heißt - ich würde gerne selbst an diesen Ort gehen!