确定<;选择>;表单在发布本地表单时自动取消设置


Session variable determining the selected option on a <select> form unsets itself on posting a local form?

我最近遇到了一个问题,我有以下问题:

  • 与表中的值相关的下拉菜单
  • PHP输出,直接响应下拉菜单中的输入,通过include引用
  • 一种表单,当发布到主页面时,它会将输入添加到SQL表中

目的是在发布表单时,数据将立即添加到PHP输出所在的侧边栏中。我面临的问题是,当"更新"表单发布到主页面时,会话变量会立即取消设置。我也不知道它为什么这么做。

下面我将在head中包含与数据更新和会话变量处理相关的主要PHP代码。

if ($_GET['newdata'] != "null") {
    $_SESSION['P_ID'] = $_GET['newdata'];
}
if (($_POST['date'] != "") and ($_POST['org'] != "") and ($_POST['imgno'] != "") and ($_POST['res'] != "") and ($_POST['pid'] != ""))  {
 $date = $_POST['date'];
 $org = $_POST['org'];   
 $imgno = $_POST['imgno'];
 $res = $_POST['res'];
 $pid = $_POST['pid'];
 $dsquery = "INSERT INTO Datasets (ProjectDate, Organism, ImageNumber, Resolution, ProjectID) VALUES ('$date', '$org', '$imgno', '$res', '$pid')";
 mysqli_query($db, $dsquery);
}

这也是原始输出表单上的代码。

secure_session_start();
include_once("database.inc.php");
$db = ConnectDB();
echo "<div id=left-sidebar>
    <div class=datecontainer>";
$id = $_SESSION['P_ID'];
$datequery = "SELECT DISTINCT ProjectDate FROM Datasets WHERE ProjectID = '$id'";
#Validate Query here.
$result = mysqli_query($db,$datequery);
if ($result) {
    while ($row = mysqli_fetch_assoc($result)) {
        $date = $row['ProjectDate'];
        $datasetquery = "SELECT DatasetNo, Organism, Resolution, ImageNumber FROM Datasets WHERE ProjectDate='$date' AND ProjectID = '$id'";
        $datasetresult = mysqli_query($db, $datasetquery);
        if ($datasetresult) {
            while ($row = mysqli_fetch_assoc($datasetresult)) {
                $setno = $row['DatasetNo'];
                $org = $row['Organism'];
                $imgno = $row['ImageNumber'];
                $res = $row['Resolution'];
                CreateDataset($date, $id, $res, $org, $setno, $imgno);
            }
        }
    }
}
echo "</div> </div>";
function CreateDataset($date, $id, $res, $org, $setno, $imgno) {
    for ($x=0; $x<count($setno); $x++){
        echo "<br><div class='"date'">$date</div><div class='"dataset'">
        <p><u>Dataset ".$setno."</u></p>
        <form action='"'">
            <input type='"radio'" name='"rating'" value='"red'"> Red
            <input type='"radio'" name='"rating'" value='"amber'"> Amber
            <input type='"radio'" name='"rating'" value='"green'"> Green
        </form>
        <table border='"1'" align='"center'">
                <tr>
                    <td>Organism</td>
                    <td>Image quantity</td>
                    <td>Resolution</td>
                    <td>Project ID</td>
                </tr>
                <tr>
                    <td>$org</td>
                    <td>$imgno</td>
                    <td>$res</td>
                    <td>$id</td>
                </tr>
            </table>   
     </div>";
    }
}

[注意:secure_session_start()是一个函数。]

最后,下拉菜单代码:

    secure_session_start();
include_once("database.inc.php");
   ?>
  <link rel="stylesheet" href="css/toolbar.css">
 <div id="Projects">
      <form action="main.php" method="get">
      <select name="newdata" id="projectselect" onchange="selectProject()">"
     <?php
        $db = ConnectDB();
        $sessquery = "SELECT * FROM Project WHERE ProjectID = $_SESSION[P_ID]";
        $sessresult = mysqli_query($db,$sessquery);
        if ($sessresult == TRUE) {
            while ($row = mysqli_fetch_assoc($sessresult)) {
                $sessid = $row['ProjectID'];
                $sessname = $row['ProjectName'];
                echo "<option select=selected value='"$sessid'">$sessname</option>";
            }
        }
        else {
            echo "<option select=selected value=null>Projects</option>";
        }
        $query = "SELECT * FROM Project";
        $result = mysqli_query($db,$query);
        if ($result == TRUE) {
            while ($row = mysqli_fetch_assoc($result)) {
                $id = $row['ProjectID'];
                $name = $row['ProjectName'];
                echo "<option value='"$id'">$name</option>";
            }
        }
        else {
            echo "<option>Query Error.</option>";
        }
     unset($result);
     mysqli_close;
     ?>
     <option value="addproject">Add new project.</option>
 </select>
    <input type=submit value="Access Project"/>
</form>

为大量的代码道歉,但我真的不知道为什么会话变量在没有被直接告知的情况下自行取消设置。

可能是这样的:

if ($_GET['newdata'] != "null") {
                        ^----^

除非您传入example.com?newdata=null,否则您不会测试该查询值是否为实际的null(未知)值,而是针对包含字母null的字符串进行测试。

注意以下内容:

php > var_dump(null == 'null');
bool(false)

由于实际的null不等于字符串null,因此您盲目地重置会话变量。如果newdata查询参数不存在,那么您可以将会话变量设置为实际的null。

你可能想要更像的东西

if(isset($_GET['newdata'])) {
   $_SESSION['P_ID'] = $_GET['newdata'];
}

好吧,所以我实际上很奇怪地解决了自己的问题。几率有多大?:)

拿这段代码来说:

if ($_GET['newdata'] != "null") {
$_SESSION['P_ID'] = $_GET['newdata'];
}
if (($_POST['date'] != "") and ($_POST['org'] != "") and ($_POST['imgno'] != "") and ($_POST['res'] != "") and ($_POST['pid'] != ""))  {
 $date = $_POST['date'];
 $org = $_POST['org'];   
 $imgno = $_POST['imgno'];
 $res = $_POST['res'];
 $pid = $_POST['pid'];
 $dsquery = "INSERT INTO Datasets (ProjectDate, Organism, ImageNumber, Resolution, ProjectID) VALUES ('$date', '$org', '$imgno', '$res', '$pid')";
 mysqli_query($db, $dsquery);
}

考虑到当前ProjectID与if语句一起发布,我修改了代码如下:

if (isset($_POST['pid'])) {
    $_SESSION['P_ID'] = $_POST['pid'];
}
else{
    $_SESSION['P_ID'] = $_GET['newdata'];
}

现在,这将使输出保持在同一页,并且不再取消设置变量。对不起StackOverflow的人,感谢@Marc B的输入。