使用函数list()和split()接收字符串值的混淆

时间:2010-02-12 18:22:41

标签: php

buy.php

<form action="cart.php">
<input style="width:10px; margin-left:9px; " name="price[]" type="checkbox" value="'  .    $variety['price']. '_'. $variety['variety'] '_'. $product['name']. '"  />
 </form>

我将上面的输入表单发送到cart.php,我收到它就像:

list($aDoor, $variety,$productname) = split('_', $_POST['price']);
$aDoor = array();
$variety = array();
$productname= // $productname is a string how can I set it up here?

foreach ($_POST['price'] as $p)
{
  list($a, $b,$c) = explode('_', $p);
  $aDoor[] = $a;
  $variety[] = $b;
  $productname =$c; // and I have put it equal to the variable $c here
}

上面唯一的问题是收到来自buy.php表单的索引$ product ['name']

在cart.php中,我已将其设置为$ productname接收,但是你可以看到这是一个字符串而不是数组如果它是一个包含函数列表()和split的字符串,我怎么能设置它()让我困惑。

3 个答案:

答案 0 :(得分:1)

确定。您的脚本有一些问题。

1)您没有在表单标记上指定方法,因此默认情况下,数据将作为“GET”提交。您在脚本中使用$ _POST,因此这些值将为空,并且foreach循环将失败,因为$ _POST ['price']不存在。

2)您将复选框命名为“price []”。 []告诉PHP将使用相同的名称提交多个值,因此$ _GET ['price']将是一个数组。您的前几行代码将失败,因为拆分适用于字符串,而不是数组。您最终会得到以下值

 $aDoor = "Array"
 $variety = NULL;
 $productname = NULL;

PHP尝试将$ GET ['price']数组转换为字符串,但这默认只是作为字符串'Array'返回,并且那里没有“”值,所以list()变量的其余部分没有分配给它们,因此它们变为空。

3)Split已经被弃用,将在PHP 6中删除,所以请使用explode()代替(稍后你会做几行)

4)然后你通过为$ aDoor和$ variety分配空数组来立即删除这些值,所以实际上分割线是没用的

foreach循环看起来很好,但是你想要分配给$ productname数组而不是字符串,所以使用$ productname [] = $ c;

5)但是,我不会将您爆炸的数据存储在三个单独的数组中。它会更有意义 像这样存储:

$products = array();
foreach($_POST['price'] as $p) {
   list($a, $b, $c) = explode('_', $p);
   $products[] = array('aDoor' => $a, 'variety' => $b, 'productname' => $c);
}

这样,您不必在使用此数据的任何函数中传递3个数组(或使它们成为'全局'),您只能传递一个变量(即:updateInventory($ products [7]); )

5)如果这个购物车脚本被释放到野外,它可能是服务器上一个巨大的安全漏洞。什么会阻止某人通过传递“$ 0.00_fire engine red-ferrari”这样的价格字段来构建自己的价格?我一直想要免费的法拉利,通过用户的浏览器往返定价数据是获得它的好方法。永远不要相信客户不要破解关键数据,例如价格。

答案 1 :(得分:0)

如果您未指定method的{​​{1}}属性,则默认值为form。在您的脚本中,您使用的是GET,请尝试将POST方法添加到表单中:

POST

其次,即使 <form action="cart.php" method="post"> 是一个字符串,但您可以将其转换为数组(就像您为其他变量所做的那样)后缀为$productname,因此您的代码变为:

[]

现在这三个数组包含您的数据。

答案 2 :(得分:0)

$productname = '';