我有一个多页面表单,我试图捕获一个数组作为插入到mysql中的会话。表格的第二页是“地址”部分。我在这里要求提供地址信息。用户可以点击“输入另一个地址”按钮,扩展另一个框。
用户点击下一步转到下一页(phone.php),我要求提供电话信息。在这个页面上,我认为我正在正确地注册会话数据:
if(!isset($_SESSION))
{
@session_start();
}
header("Cache-control: private");
ob_start();
include('header.php');
//now, let's register our session variables from address.php
session_register('addressLineOne');
session_register('addressLineTwo');
//finally, let's store our posted values in the session variables
$_SESSION['addressLineOne'] = $_POST['addressLineOne'];
$_SESSION['addressLineTwo'] = $_POST['addressLineTwo'];
最终我们点击了submit.php。如果我禁用代码添加一个额外的地址,这是我使用的插件工作正常。
$insertAddress="INSERT INTO address (idperson, addressLineOne, addressLineTwo)
VALUES ( '$id','$_SESSION[addressLineOne]','$_SESSION[addressLineTwo]')";
if (!mysql_query($insertAddress,$con))
{die('Error: ' . mysql_error());}
echo "";
当我启用“添加附加地址”代码时,上面的插入内容会在每个数据库字段中插入“ARRAY”。我一直在尝试以下方法:
foreach($_SESSION['idperson'] as $row=>$id)
{
$idperson=$id;
$addressLineOne=$_SESSION['addressLineOne'][$row];
$addressLineTwo=$_SESSION['addressLineTwo'][$row];
}
//enter rows into database
foreach($_SESSION['idperson'] as $row=>$id)
{
$idperson=mysql_real_escape_string($id);
$addressLineOne=mysql_real_escape_string($_SESSION['addressLineOne'][$row]);
$addressLineTwo=mysql_real_escape_string($_SESSION['addressLineTwo'][$row]);
}
$insertAddress="INSERT INTO address (idperson, addressLineOne, addressLineTwo)
VALUES ('.$id.','.$addressLineOne.','.$addressLineTwo.')";
if (!mysql_query($insertAddress,$con))
{
die('Error: ' . mysql_error());
}
echo "$row record added";
然而,不是工作,而是在数据库中插入一些像“......”这样的点。我不知道还能做什么。我没有正确抓取会话数据吗?我的foreach代码是否已关闭?谢谢你的帮助。
这是我用来在address.php上添加另一个表的代码:
<?php for($i=1; $i<6; $i++):?>
<div id='hidden<?php echo $i; ?>' style='display: none'>
<tr class="odd">
<td width="33%">Street/Number</td>
<td><input type="text" name="addressLineOne[]" id="addressLineOne<?php echo $i; ?>"/></td>
</tr>
<tr>
<td>Address 2</td>
<td><input type="text" name="addressLineTwo[]" id="addressLineTwo<?php echo $i; ?>"/></td>
</tr>
<?php endfor; ?>
除了连接数据库和上面的插入内容外,Submit.php没有任何内容。
答案 0 :(得分:1)
所以只需要进行一些清理工作:
你的第一个街区:
无需条件调用session_start
,只需在脚本顶部调用它即可。此外,不要在那里抑制警告,如果你收到警告,找到根本原因并消除它们。
session_start();
header("Cache-control: private");
ob_start();
include('header.php');
无需使用session_register
注册会话变量,现在不推荐使用,手册中也说不要使用它 - 特别是不要在使用$_SESSION
集合时使用它。
$_SESSION['addressLineOne'] = $_POST['addressLineOne'];
$_SESSION['addressLineTwo'] = $_POST['addressLineTwo'];
所以$_SESSION
现在包含至少两个与刚刚设置的对应的键。
你的问题的其余部分源于可能错误地遍历你的数组结构(向我们展示你的更多代码)。
你的第二个区块进行了一些清理:
没有必要两次遍历您的列表 - 假设您正确迭代,您只需要经历一次并且每次都运行插入(而不是在结束时)。这确实假设您希望每个地址的一行由id。
索引此外,您可能会重新考虑使用die
作为错误控制机制,它只会终止整个脚本执行 - 这真的是您想要的吗?
// enter rows into database
foreach($_SESSION['addressLineOne'] as $row => $id){
$idperson = mysql_real_escape_string($_SESSION['idperson']);
$addressLineOne = mysql_real_escape_string($_SESSION['addressLineOne'][$row]);
$addressLineTwo = mysql_real_escape_string($_SESSION['addressLineTwo'][$row]);
$insertAddress="INSERT INTO address (idperson, addressLineOne, addressLineTwo)
VALUES ('.$id.','.$addressLineOne.','.$addressLineTwo.')";
if(!mysql_query($insertAddress,$con)){
// maybe not the best use of `die` here?
die('Error: ' . mysql_error());
}
echo "$row record added";
}
答案 1 :(得分:0)
在不知道“添加额外地址代码”的情况下,似乎addressLineOne
和addressLineTwo
变量以数组形式出现。要准确检查您要存储的内容,可以使用PHP的var_dump
函数。我建议在代码中的某处添加var_dump($_SESSION);
,以确切了解会话中存储的内容,以便确保它符合您的想法。
答案 2 :(得分:0)
同样:
$insertAddress="INSERT INTO address (idperson, addressLineOne, addressLineTwo) VALUES ('.$id.','.$addressLineOne.','.$addressLineTwo.')";
您使用的是双引号字符串,因此查询中的'
单引号不会“突破”字符串模式,因此如果$id,
$ addressLineOne and
$无论出于何种原因,addressLineTwo`都是空白的,您的查询最终看起来像:
INSERT INTO ... VALUES ('..', '..', '..')
这解释了为什么你在田里得到点。
将查询重写为
$insertAddress = "INSERT .... VALUES ('$id', '$addressLineOne', '$addressLineTwo')
或
$insertAddress = 'INSERT ... VALUES (\'' . $id . '\', \'' ....)
就个人而言,直接将变量写入双引号字符串会导致代码更易读,尤其是在支持PHP的语法高亮编辑器中。