注意:这不是答案,你不应该接受这个作为答案,我在这里发布而不是在评论部分发布,因为它太长了。
Note - You can solve your problem by your self, but for other it is impossible, as your code is just not making any sense at the moment, but I am pretty sure it will if you are able to read and understood what I am trying to say here in the solution.
第一件事,
访问被拒绝问题 –
注意 - 你不必解决这个问题,它会自己解决,但你应该知道为什么会出现这个问题,所以将来如果你遇到问题,你会知道该怎么做正确。
拒绝访问的原因是,您不允许为form action 提供特殊字符,因此在form 中添加echo 后,您将遇到此问题,因为一旦您在我们的form action 中添加echo,您会在不知不觉中为操作赋予特殊字符,因为您从未设置变量$action 的值,因此变量$action 的值等于error message。因此,在添加 echo 后,您将显示该错误消息。
在做任何事情之前,在浏览器中运行您的文件并检查源代码,
并查看form action 中的值,会是这样的
<br /><b>Notice</b>: Undefined variable: action in <b>C:\in here you are going to have file path\form.php</b> on line <b>1</b><br />
注意你在这里有多少个尖括号冒号,你甚至不允许一个尖括号,所以浏览器认为你正在尝试做一些恶意的事情,这就是它阻止你访问的原因。
如果您不知道如何查看源代码,只需输入如何查看源代码并提供您的浏览器名称(不要问我,只需单击一下即可)
所以您的代码基本上是在添加 echo 后生成错误消息并显示该操作,这就是浏览器阻止访问的原因
那么为什么在添加回声之前它没有做同样的事情,因为在php,如果你不使用echo你没有显示任何东西,所以在添加回声之前,你的action was empty,只需从表单操作中删除echo 并再次检查源代码,您就会明白我想说什么。
再一次,你不必修复它,它会自己修复,记住这一点。
现在解决方案从这里开始
首先我的假设是正确的,即你正在尝试做的事情,
So these are my assumption, what you want to do,
- 人们应该可以购买不同类型的票,他们可以选择从1到30的票数,
- 比你想根据TicketType运行不同的文件,在一种情况下你想运行seat.php,在一种情况下你想运行index.php,
- 为了实现您的目标,您创建了一个表单,使用 if 语句在表单中设置您的操作值,我可以看到您在表单中使用变量
$action 进行操作,您通过你的 if 语句。
如果到目前为止我对任何事情都有误,请不要继续阅读,这将是浪费时间。
基本上是为了实现你的目标,你正在使用form, array and some logic,
在您的情况下,您似乎了解数组和逻辑,但您缺乏有关表单的基本知识,这就是您的代码无法正常工作的原因。
说实话。在我看来,您对表格一无所知。这就是为什么不可能给你解决方案(至少对我来说)。但是我很确定,如果您完全阅读本文,您将能够自己解决问题,
所以快速阅读要点,你会惊讶于为你解决问题是多么容易,你也会意识到为什么其他人不可能为你解决问题,目前。
从这里开始
我将问题分为四个部分
- 关于
form 的一些重要说明。
-
$Ticket_Type 不等于 $TicketType - 你甚至不能在这里使用 $TiccketType
-
Select option 只传递来自value 标签的value -- 两部分解决方案
- 你的逻辑在错误的地方,
1.关于表单的一些要点。
当你使用form时,你必须告诉php,你正在提交表单,如果你只想使用php,你必须使用提交按钮(前几天我已经在评论中提到了这一点),
第二个你需要知道的是,当你点击form 中的submit button 时会发生什么,表单将运行action file 并且还会从中传递数据。打开表单标签 <form> 到关闭表单标签 </form> 到该文件
但是在这些打开和关闭form 标签之外的任何数据,form 将不会传递该数据,所以重点是它只传递在开头form 和关闭@ 内的数据987654358@ 标签。
看下面的代码更好理解,也请运行这段代码,让你更好理解,
关于代码的几点说明
- 在下面的代码中,我们有两个
input fieldlocation和name,location输入字段在form标签之外,name输入字段在form标签内。
- 我们的
form action 是seat.php,对于form 文件的name 是form.php 在这个例子中。
- 因为我们的
action 是seat.php,所以如果您点击submit button,它会将数据传递给seat.php,并运行该文件。
- 在
seat php中,我们只是使用echo来显示两个值,
请参阅下面的form.php 和seat.php 代码,
form.php
Location<input type="text" name="location"/><br><br>//out side of the form tag
<form action="seat.php" method="post">
Name <input type="text" name="name"/><br><br>
Location <input type="text" name="location"/><br><br>
<input type="submit" value="Hot Air">
</form>
seat.php
<?php
$name = $_POST['name'];
echo $name.'<br>';
$location = $_POST['location'];
echo $location;
现在运行form.php 并在位置和名称框中输入一些内容,然后单击提交按钮,如果这样做,它只会显示value for name,但对于location value 它会显示未定义的索引位置错误。
原因是,因为您的表单从未将 location 的值传递给 seat.php1, becauselocationis out ofform` 开始和结束标记,
现在把这个位置字段放在表单标签内
现在将location 放在开始和结束表单标签内,
完成之后我们的代码应该是这样的
<form action="seat.php" method="post">
Name <input type="text" name="name"/><br><br>
Location <input type="text" name="location"/><br><br>//Now location is inside of the form
<input type="submit" value="Hot Air">
</form>
现在再次运行您的form.php 为name 和location 输入一些内容,然后单击提交按钮,这一次它将显示两个值,因为这一次两个值都在form tag 内所以两个值都通过了。
注意——如果你能理解第一个结果和第二个结果之间的区别,你就能明白,为什么你需要在开始和结束form标签内有你的select标签,你不能让他们在外面,
-
$Ticket_Type 不等于 $TicketType - 你甚至不能在这里使用 $TicketType 因为它等于你想要从选择选项中获得值的数组
对于第二个错误,请注意这部分代码
echo ' <select name="Ticket_Type">';
foreach ($TicketType as $key => $value) {
echo "<option value=\"$key\">$value</option>";
}
echo '</select>';
if($TicketType == 'VIP'){
$action = "index.php";
}else if ($TicketType == 'VVIP') {
$action = "seats.php";
}
如果你在这里读到echo ' <select name="Ticket_Type">'这一行,你给select命名Ticket_Type而不是if statement你使用变量$TicketType,我假设你正在检查$TicketType的值,这个问题可以通过在if语句中将变量名$TicketType改成$Ticket_Type来解决。
你也必须在同一个地方纠正这个问题
所以即使在应用上述修复后,您的代码也无法工作,因为您在此代码中有第二个问题
现在来到第二个问题,您在 if statement 中提出的问题,在您的 if statement 中检查 $TicketType 值,但您没有变量 $TicketType 的值,因为当您使用form php 不要设置它设置index 的变量,所以首先你必须设置$TicketType 的值,而不仅仅是你可以使用if statement,
应用这两个修复后,您的代码应如下所示
注意 –(我将 select 的名称更改为 TicketType )
echo ' <select name="Ticket_Type">';
foreach ($TicketType as $key => $value) {
echo "<option value=\"$key\">$value</option>";
}
echo '</select>';
$Ticket_Type = $_POST['Ticket_Type']; // Now you set the value for variable
// as your value is set, now you can type your if statement below.
if($Ticket_Type == 'VIP'){
$action = "index.php";
}else if ($Ticket_Type == 'VVIP') {
$action = "seats.php";
}
3。选择选项,仅从值标签传递值
你犯的第三个错误和这个你不会注意到这段代码的错误,但是如果你不学习,你将来很可能会犯这个错误,所以也要纠正这个错误,
注意这段代码
$TicketType = array('VIP' =>'VIP', 'VVIP' =>'VVIP', 'Upper Box A'=>'Upper Box A', 'Upper Box B'=>'Upper Box B', 'Lower Box A'=>'Lower Box A', 'Lower Box B'=>'Lower Box B', 'General Admission'=>'General Admission') ;
echo ' <select name="Ticket_Type">';
foreach ($TicketType as $key => $value) {
echo "<option value=\"$key\">$value</option>";
}
echo '</select>';
在这里你有数组,而不是你从你的数组创建selectoption,这很好,但是你在这里犯了一个基本错误,表单只会传递value标签的值
所以来到你的代码中的这一行
echo "<option value=\"$key\">$value</option>";
现在也将变量$key 更改为变量$value,因为当您单击提交按钮时,表单再次只传递来自值的值。
echo "<option value=\"$key\">$value</option>"; 到 echo "<option value=\"$value\">$value</option>";
它不会改变结果,因为这段代码,因为你的数组键和值是相同的,但你应该知道你为未来传递了什么值。
要理解我在这里想说什么,从下面运行这两个代码,你就会明白我想说什么。
form.php
<form action="seat.php" method="post">
<select name="Ticket_Type">
<option value="key1">First</option>
<option value="key2">Second</option>
</select>
<input type="submit" value="Hot Air">
</form>
seat.php
<?php
$value = $_POST['Ticket_Type'];
echo $value;
在浏览器中运行此文件,然后选择选项,然后单击submit button,它将根据您选择的选项显示key1 or key2,而不是first or second,因为表单仅提交来自的值价值标签
现在将值标签值更改为一和二,然后再次运行您的代码,
<form action="seat.php" method="post">
<select name="Ticket_Type">;
<option value="One">First</option>
<option value="Two">Second</option>
</select>
<input type="submit" value="Hot Air">
</form>
现在再次在浏览器中运行该文件,并选择选项并单击提交,然后查看结果,并尝试了解发生了什么。
4 你的逻辑在错误的地方
查看此代码
if($Ticket_Type == 'VIP'){
$action = "index.php";
}else if ($Ticket_Type == 'VVIP') {
$action = "seats.php";
}
您在这里尝试做什么,在您的脑海中,您将运行不同的不同文件是有道理的,
根据票证类型,但实际上它没有任何意义,因为当您单击submit button 时,只有form 会将值传递给action file,
这个很难解释
好的,听你在这段代码中有这个变量$TicketType,它只有在你点击提交按钮后才会被设置,而action file它永远不会在这个文件中设置,所以你不能有这些行这个文件。 (这就是为什么在添加回声后显示禁止访问)
好吧,假设您将这一行移动到不同的文件中,但您尝试对这些行做的仍然是愚蠢的,只是不要使用这些愚蠢的行,也不要尝试运行不同的不同文件,运行单个文件,意味着给单个action,让我们说表单中的动作是book.php
所以我们的文件名为book.php,
所以你的book.php 的启动shell 应该是这样的
if(!empty($_POST['Ticket_Type'])){
// what you are basically saying that if TicketType is not empty run this code,
// if it is empty run the else statement so the user will know that he did not select any ticket,
//now we are going to add some more code In here
}else 'Hey you did not select any ticket';
在中间添加代码后,我们的代码将如下所示
if(!empty($_POST['Ticket_Type'])){
$Ticket_Type = $_POST['Ticket_Type']; // set the value
if($Ticket_Type == 'VIP'){ //
// Copy and paste the index.php file code here
}else if ($Ticket_Type == 'VVIP') {
//copy and paste the seat.php file code here
echo $action;
}// if you have another Ticket_Type just add another else if here,
//Note: you can add as many else if you like,
}else 'Hey you did not select any ticket';
所以只需运行单个文件操作
我还活着,在输入所有这些之后,如果您有任何困惑,请告诉我。