作者edlin ()
看板PHP
标题[请益] 利用Session变数制作跨页表单的问题
时间Wed May 21 13:07:52 2008
最近被老板交代做一个跨页表单,
亦即有多个页面、每个页面有一个表单,
同一个使用者填完每个表单後,再一次将数据结果记录在MySQL资料库里,
以下是我简化後的例子:
版本:PHP 5.2.6
页面:Test.php --> 有一个表单选项按钮 (value = 1 or 2, 命名为Choice)
Test2.php --> 有一个表单选项按钮 (value = 1 or 2, 命名为Choice2)
资料表:Result (有两个栏位,分别记录 Choice 与 Choice2 的结果)
目前我打算利用 Session 变数,
将第一页的表单结果存在一个 Session 变数里,
之後到第二页後,再与第二页的结果一起记录到资料库的资料表中,
我的程式码如下:
//Test.php
<form action="Test2.php" method="POST" name="form1" id="form1">
<label>
<input name="Choice" type="radio" value="1" />
A</label>
<label>
<input name="Choice" type="radio" value="2" />
B</label>
<input type="submit" name="Submit" value="送出"/>
</form>
//Test2.php
<?php require_once('Connections/Connect1.php'); ?>
<?php
function GetSQLValueString($theValue, $theType, $theDefinedValue = "",
$theNotDefinedValue = "")
{
$theValue = (!get_magic_quotes_gpc()) ? addslashes($theValue) : $theValue;
switch ($theType) {
case "text":
$theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
break;
case "long":
case "int":
$theValue = ($theValue != "") ? intval($theValue) : "NULL";
break;
case "double":
$theValue = ($theValue != "") ? "'" . doubleval($theValue) . "'" :
"NULL";
break;
case "date":
$theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
break;
case "defined":
$theValue = ($theValue != "") ? $theDefinedValue : $theNotDefinedValue;
break;
}
return $theValue;
}
session_start();
$_SESSION['Choice'] = $_POST['Choice'];
echo $_SESSION['Choice'];
$editFormAction = $_SERVER['PHP_SELF'];
if (isset($_SERVER['QUERY_STRING'])) {
$editFormAction .= "?" . htmlentities($_SERVER['QUERY_STRING']);
}
if ((isset($_POST["MM_insert"])) && ($_POST["MM_insert"] == "form1")) {
$insertSQL = sprintf("INSERT INTO Result (Choice, Choice2) VALUES (%s, %s)",
GetSQLValueString(
$_SESSION['Choice'], "int"),
GetSQLValueString($_POST['Choice2'], "int"));
mysql_select_db($database_Connect1, $Connect1);
$Result1 = mysql_query($insertSQL, $Connect1) or die(mysql_error());
$insertGoTo = "index.html";
if (isset($_SERVER['QUERY_STRING'])) {
$insertGoTo .= (strpos($insertGoTo, '?')) ? "&" : "?";
$insertGoTo .= $_SERVER['QUERY_STRING'];
}
header(sprintf("Location: %s", $insertGoTo));
}
?>
<form action="<?php echo $editFormAction; ?>" method="POST" name="form1">
<label></label>
<p>
<label>
<input name="Choice2" type="radio" value="1">
C</label>
<label>
<input name="Choice2" type="radio" value="2">
D</label>
</p>
<p>
<label>
<input type="submit" name="Submit" value="送出">
</label>
</p>
<input type="hidden" name="MM_insert" value="form1">
</form>
为了测试 Session 变数是否生效,我特别下了 echo 指令来测试 (
红色字体的部分),
结果发现该 Session 的确会显示 Test.php 输入的结果,
但又出现以下错误:
Notice: Undefined index: Choice in C:\Program Files\Apache Software
Foundation\Apache2.2\htdocs\Test2.php on line 29
Column 'Choice' cannot be null
(line 29为
黄色字体那一行)
这里我百思不得其解,
既然 echo 已经说明 Choice 输入结果确实存在於 Session 变数里,
但为何又说我没有对 Choice 下定义?
为了再测试自己是不是 Session 指令有写错,
我将黄色字体的部分改为:
$_SESSION['Choice'] = 1; //强迫输入为1
再重新跑一次就完全正常了,
所以可见应该是出在 $_POST['Choice'] 写法的问题,
但我一直想不到该如何解决 ...
我才刚入门 PHP 而已,
很多地方还不是那麽熟悉,也不知道这样做对不对 @@~
不知道是否有先进能伸出援手?万分感激~
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 123.193.188.19
1F:推 chadjye:要不要把session_start();移到程式的第一行试试看 05/21 13:15
2F:→ edlin:刚刚试过了还是一样不成功 >< 05/21 13:19
3F:推 arrack:session_register('Choice'); 05/21 13:32
4F:→ arrack:那只是NOTICE不是错误 05/21 13:32
5F:→ edlin:感谢说明~ 不过新版的PHP语法不是已经不用写register吗? 05/21 13:52
6F:→ edlin:我刚刚试了一次结果还是相同 ... 05/21 13:52
7F:推 JoeHorn:好像是数值没传过去? 把 $_POST 倒出来看看~ 05/21 15:33
8F:→ edlin:我用echo $_POST['Choice']来看,里面也有我先前输入的数值 05/22 10:25
9F:→ edlin:好像牵涉记录在资料库就会失效...是php.ini要额外设定吗 @@~ 05/22 10:26
10F:→ starjou:php 版本? 05/22 11:13
11F:→ starjou:上一行请无视,那个 notice 是不是你直接开 test2.php 时 05/22 11:14
12F:→ starjou:才有? 05/22 11:15
13F:→ edlin:Notice是出现在Test2.php选完并按送出後 05/22 11:33
14F:→ starjou:你的 test2.php form里的变数叫Choice2 $_POST里没 Choice 05/22 23:21
15F:→ edlin:我是将Choice写入Session变数後,在Test2里送出这个Session 05/23 20:18
16F:→ edlin:如程式码中亮白色的部分 ... 还是这种写法本来就不行? 05/23 20:19
17F:→ edlin:但文中我也提到Session里是直接指定的常数的话,是可行的 05/23 20:20
18F:→ starjou:session 里的变数就叫 $_SESSION 了,不会再叫 $_POST 05/23 20:47
19F:→ starjou:除非你在 test2.php 用 hidden input 再重指定一次 05/23 20:48
20F:→ edlin:真是一语惊醒梦中人!感谢楼上先进的建议~ 05/23 22:25