确定<select>表单上所选选项的会话变量在发布本地表单时自行取消设置?

时间:2016-07-26 15:52:43

标签: php html

我最近遇到了一个问题,我有以下几点: 与表格中的值相关的下拉菜单。 一个PHP输出,直接响应下拉菜单中的输入,通过include引用。 一种表单,当发布到主页面时,将输入添加到SQL表。 目的是在发布表单时,数据将立即添加到PHP输出所在的侧栏中。我面临的问题是,在&#34;更新&#34;表单被发布到主页面,会话变量立即自行取消。我不知道它为什么这样做。 下面我将包括头部中与数据更新和会话变量处理相关的主要PHP代码。 if($ _GET [&#39; newdata&#39;]!=&#34; null&#34;){     $ _SESSION [&#39; P_ID&#39;] = $ _GET [&#39; newdata&#39;]; } if(($ _POST [&#39; date&#39;]!=&#34;&#34;)和($ _POST [&#39; org&#39;]!=&#34;&#34; )和($ _POST [&#39; imgno&#39;]!=&#34;&#34;)和($ _POST [&#39; res&#39;]!=&#34;&#34; )和($ _POST [&#39; pid&#39;]!=&#34;&#34;)){  $ date = $ _POST [&#39; date&#39;];  $ org = $ _POST [&#39; org&#39;];  $ imgno = $ _POST [&#39; imgno&#39;];  $ res = $ _POST [&#39; res&#39;];  $ pid = $ _POST [&#39; pid&#39;];  $ dsquery =&#34; INSERT INTO数据集(ProjectDate,Organism,ImageNumber,Resolution,ProjectID)VALUES(&#39; $ date&#39;,&#39; $ org&#39;,&#39; $ imgno&# 39;,&#39; $ res&#39;,&#39; $ pid&#39;)&#34 ;;  mysqli_query($ db,$ dsquery); } 这是原始输出表单上的代码。 secure_session_start(); include_once(&#34; database.inc.php&#34); $ db = ConnectDB(); echo&#34;&lt; div id = left-sidebar&gt;     &lt; div class = datecontainer&gt;&#34 ;; $ id = $ _SESSION [&#39; P_ID&#39;]; $ datequery =&#34; SELECT DISTINCT ProjectDate FROM Datasets WHERE ProjectID =&#39; $ id&#39;&#34 ;; #Validate在这里查询。 $ result = mysqli_query($ db,$ datequery); if($ result){     while($ row = mysqli_fetch_assoc($ result)){         $ date = $ row [&#39; ProjectDate&#39;];         $ datasetquery =&#34; SELECT DatasetNo,Organism,Resolution,ImageNumber FROM Datasets WHERE ProjectDate =&#39; $ date&#39; AND ProjectID =&#39; $ id&#39;&#34 ;;         $ datasetresult = mysqli_query($ db,$ datasetquery);         if($ datasetresult){             while($ row = mysqli_fetch_assoc($ datasetresult)){                 $ setno = $ row [&#39; DatasetNo&#39;];                 $ org = $ row [&#39; Organism&#39;];                 $ imgno = $ row [&#39; ImageNumber&#39;];                 $ res = $ row [&#39; Resolution&#39;];                 CreateDataset($ date,$ id,$ res,$ org,$ setno,$ imgno);             }         }     } } echo&#34;&lt; / div&gt; &LT; / DIV&GT;&#34 ;; 函数CreateDataset($ date,$ id,$ res,$ org,$ setno,$ imgno){     for($ x = 0; $ x&lt; count($ setno); $ x ++){         echo&#34;&lt; br&gt;&lt; div class = \&#34; date \&#34;&gt; $ date&lt; / div&gt;&lt; div class = \&#34; dataset \&#34;&gt; ;         &lt; p&gt;&lt; u&gt;数据集&#34;。$ setno。&#34;&lt; / u&gt;&lt; / p&gt;         &lt; form action = \&#34; \&#34;&gt;             &lt; input type = \&#34; radio \&#34;命名= \&#34;评级\&#34;值= \&#34;红色\&#34;&GT;红色             &lt; input type = \&#34; radio \&#34;命名= \&#34;评级\&#34;值= \&#34;琥珀\&#34;&GT;琥珀色             &lt; input type = \&#34; radio \&#34;命名= \&#34;评级\&#34;值= \&#34;绿色\&#34;&GT;绿色         &LT; /形式&GT;         &lt; table border = \&#34; 1 \&#34; ALIGN = \&#34;中心\&#34;&GT;                 &LT; TR&GT;                     &LT; TD&GT;生物体LT; / TD&GT;                     &lt; td&gt;图像数量&lt; / td&gt;                     &LT; TD&GT;解像度与LT; / TD&GT;                     &lt; td&gt;项目ID&lt; / td&gt;                 &LT; / TR&GT;                 &LT; TR&GT;                     &LT; TD&GT; $有机&LT; / TD&GT;                     &LT; TD&GT; $ imgno&LT; / TD&GT;                     &LT; TD&GT; $ RES&LT; / TD&GT;                     &LT; TD&GT; $ ID&LT; / TD&GT;                 &LT; / TR&GT;             &LT; /表&gt;      &LT; / DIV&GT;&#34 ;;     } } [注意:secure_session_start()是一个函数。] 最后,下拉菜单代码:     secure_session_start(); include_once(&#34; database.inc.php&#34);    ?&GT;   &lt; link rel =&#34; stylesheet&#34; HREF =&#34; CSS / toolbar.css&#34;&GT;  &lt; div id =&#34; Projects&#34;&gt;       &lt; form action =&#34; main.php&#34;方法=&#34;获得&#34;&GT;       &lt; select name =&#34; newdata&#34; ID =&#34; projectselect&#34;平变化=&#34; selectProject()&#34;&GT;&#34;      &LT; PHP         $ db = ConnectDB();         $ sessquery =&#34; SELECT * FROM Project WHERE ProjectID = $ _SESSION [P_ID]&#34 ;;         $ sessresult = mysqli_query($ db,$ sessquery);         if($ sessresult == TRUE){             while($ row = mysqli_fetch_assoc($ sessresult)){                 $ sessid = $ row [&#39; ProjectID&#39;];                 $ sessname = $ row [&#39; ProjectName&#39;];                 echo&#34;&lt; option select = selected value = \&#34; $ sessid \&#34;&gt; $ sessname&lt; / option&gt;&#34 ;;             }         }         其他{             echo&#34;&lt; option select = selected value = null&gt; Projects&lt; / option&gt;&#34 ;;         }         $ query =&#34; SELECT * FROM Project&#34 ;;         $ result = mysqli_query($ db,$ query);         if($ result == TRUE){             while($ row = mysqli_fetch_assoc($ result)){                 $ id = $ row [&#39; ProjectID&#39;];                 $ name = $ row [&#39; ProjectName&#39;];                 echo&#34;&lt; option value = \&#34; $ id \&#34;&gt; $ name&lt; / option&gt;&#34 ;;             }         }         其他{             echo&#34;&lt; option&gt;查询错误。&lt; / option&gt;&#34 ;;         }      未设置($结果);      mysqli_close;      ?&GT;      &lt; option value =&#34; addproject&#34;&gt;添加新项目。&lt; / option&gt;  &LT; /选择&GT;     &lt; input type = submit value =&#34; Access Project&#34; /&gt; &LT; /形式&GT; 为大量的代码道歉,但我真的不知道为什么会话变量在不被直接告知的情况下自行设置。

2 个答案:

答案 0 :(得分:0)

可能这个:

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

除非您传入example.com?newdata=null,否则您没有测试该查询值是否为实际的空(未知)值,而是在测试包含字母n的字符串,ull

请注意以下事项:

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

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

你可能想要更像的东西:

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

答案 1 :(得分:0)

好的,所以我实际上设法奇怪地解决了我自己的问题。赔率是多少? :)

拿这段代码:

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的投入。