【问题标题】:PHP deleting variable after new formPHP在新表单后删除变量
【发布时间】:2019-02-26 18:23:59
【问题描述】:

在我的代码中,我有两个表单供用户选择选项。第一个变量将保存,但一旦用户提交第二个表单,第一个表单中的变量将不再保存。

<div class = "school">
<h3>Please select the university you previously attended</h3>
<form action = "" method = "post" name = "school_form">
<select name="school" size ="10">

<?php
//shows options for $selected_school
$sql = "SELECT DISTINCT school FROM data;";
$result = mysqli_query($conn, $sql);
$resultCheck = mysqli_num_rows($result);
if ($resultCheck > 0){
while($row = mysqli_fetch_assoc($result)){
  // inserts all data as array
  echo "<option>". $row['school'] ."</option>";
      }
 }
?>

</select>
<br>
<input type ="submit" name = "submit_school" value = "Enter">
</form>
<?php
//saves selected option as $selected_school
if(isset($_POST['submit_school'])){
$selected_school = mysqli_real_escape_string($conn, $_POST['school']);
echo "You have selected: " .$selected_school;
}
?>

</div>
<div class ="courses">
<h3>Please select the courses you took</h3>
<form action = "" method ="post" name ="course_form">

<?php
//user shown options for courses
$sql2 = "SELECT transfer_course, transfer_title FROM data WHERE school = ? ORDER BY transfer_course ASC";
$stmt = mysqli_stmt_init($conn);
if(!mysqli_stmt_prepare($stmt, $sql2)) {
echo "SQL statement failed";
} else {
mysqli_stmt_bind_param($stmt, "s", $selected_school);
mysqli_stmt_execute($stmt);
$result2 = mysqli_stmt_get_result($stmt);

while($row2 = mysqli_fetch_assoc($result2)){
echo "<input type='checkbox' name ='boxes[]' value = '" . $row2['transfer_course'] . "' >" . $row2['transfer_course'] . "<br>";
      }
 }
?>
<br>
<input type ="submit" name = "submit_courses" value = "Enter">
</form>
<br>
<?php
//saved selected option(s) as $selected_course
if(isset($_POST['submit_courses'])){//to run PHP script on submit
   if(!empty($_POST['boxes'])){
      foreach($_POST['boxes'] as $selected_course){
         echo "You have selected: " . $selected_course . "</br>";
      }
   }
 }
 ?>
 </div>
<div class = "output">
<h3>Course Equivalency</h3>
<?php
$sql3 = "SELECT arcadia_course, arcadia_title FROM data WHERE school = " . $selected_school . " AND transfer_course = " . $selected_course . "";
$result3 = mysqli_query($conn, $sql3);
if($result3)
{
  while($row3 = mysqli_fetch_assoc($result3)){
    echo $row3['arcadia_course'] . " " . $row3['arcadia_title'] . "<br>";
 }
 } else {
    echo "failed";
    echo $sql3;
}

 ?>

所以当我进入下一条 sql 语句时

$sql3 = "SELECT arcadia_course, arcadia_title FROM data WHERE school = " . $selected_school . " AND transfer_course = " . $selected_course . "";

选择学校时会保存变量,但选择课程后$selected_school又变成空白了。

我已经在页面顶部设置了 session_start()。

【问题讨论】:

  • 您的表单代码在哪里?
  • @Swati 它的 html 代码我省略了以使其更易于阅读。我在php代码周围有“
  • 您的第二个表单也需要在它的帖子中传递selected_school 变量(可能在隐藏的表单字段中)。此处的客户端在提交第二个表单时刷新页面,并且在刷新时它必须携带该值,否则它会丢失。
  • @JNevill 我该怎么做?
  • 这完全是老派,也许现在有更好的方法可以做到这一点,但您可以使用&lt;input type="hidden"&gt; 来保存该值,这样您就可以在它命中时从$_POST[] 中获取它你的服务器。本质上,您正在创建发送给客户端的 HTML,客户端正在使用第二种形式,并且所有这些都通过回发提交到您的服务器。如果它不在那个帖子中或隐藏在会话变量中(我认为),那么它就会丢失。向表单添加一个隐藏的输入以保存该值,使其返回POST 应该在这里工作。 (除非我误解了这个问题)。

标签: php sql mysqli


【解决方案1】:

您可以使用session 变量,这将有助于使数据可以跨各个页面访问。

因此,无论何时提交表单,您都可以在会话中保存该值并随时检索它。在您的 php 文件顶部,您需要启动会话,即session_start();。然后在您的代码中

<?php
//saves selected option as $selected_school
if(isset($_POST['submit_school'])){
 $_SESSION['selected_school ']=$selected_school;// here you are storing value to session 
$selected_school = mysqli_real_escape_string($conn, $_POST['school']);
echo "You have selected: " .$selected_school;
}
?> 

您也可以对$selected_course 执行相同操作。然后您可以将值传递给您的查询,如下所示:

$sql3 = "SELECT arcadia_course, arcadia_title FROM data WHERE school = " .$_SESSION['selected_school ']. " AND transfer_course = " .$_SESSION['selected_course']. "";

更多信息请参考here

【讨论】:

  • 还是不行。它仍然会保存变量,但一旦我提交课程,它就会忘记学校的价值。
  • 原来,$_SESSION['selected_school'] = $selected_school 需要在它下面的行下。现在可以用了,谢谢!!
【解决方案2】:

您的选项似乎没有传递的值。在你的第一个形式 while 循环中试试这个:

echo '<option value="' . $row['school'] . '">' . $row['school'] . '</option>';

您可能还遇到了更多问题。如果这不能解决您的问题,我会更深入地挖掘。

编辑:然后,是的,正如其他人所建议的那样,您可能还想添加一个隐藏的输入字段以在第二个表单提交上传递该变量值。

我们所说的隐藏输入字段是这样的:

<input type="hidden" name="selected_school" value="<?php if(isset($selected_school) echo $selected_school; ?>">

【讨论】:

  • 将值设为 $row['school'] 只会输出第一个单词。就像选项是“学校”一样,它只输出“该”
  • 另外,为输入隐藏的类型不允许用户实际提交。复选框将按下,但在按下提交之前它不会做任何事情,但由于它是隐藏的,所以没有提交。
  • 输入值的 php 首先检查是否设置了 $selected_school 变量,因此它不会在第一页加载时抛出错误。
  • 我不能使用 hidden 类型,因为它什么也做不了。我可以按下复选框,但它什么也没做。它没有给出任何输出。
猜你喜欢
  • 1970-01-01
  • 2011-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-19
  • 1970-01-01
  • 1970-01-01
  • 2017-09-23
相关资源
最近更新 更多