如何使用PHP将会话数组插入MySQL数据库

时间:2011-01-23 04:14:06

标签: php mysql arrays session insert

我有一个多页面表单,我试图捕获一个数组作为插入到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没有任何内容。

3 个答案:

答案 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)

在不知道“添加额外地址代码”的情况下,似乎addressLineOneaddressLineTwo变量以数组形式出现。要准确检查您要存储的内容,可以使用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的语法高亮编辑器中。