为什么我的数组元素重新声明?

时间:2014-04-30 10:52:30

标签: php arrays

我声明了静态数组$ error,其元素在函数validate

中定义
static $error = array();

if(!empty($_POST) && validate())
{
   $sql = mysql_query("INSERT INTO `table-name` SET category = " . $_POST['category'] . ", brand = " . $_POST['brand'] . ", product = '" . $_POST['p_name'] . "', location = " . $_POST['location'] . ", image = '" . $_POST['image'] . "', sku = '" . $_POST['sku'] . "'");            
}

function validate() 
{
    if ((strlen($_POST['p_name']) < 3) || (strlen($_POST['p_name']) > 32)) 
    {
         $error["p_name"] = "Please enter Vendor name of 3 to 32 characters." ;
    }
    .
    .
    .
}

但问题是当我在下面的html中使用更新的$ error元素如$ error ['p_name']时,它显示未定义的索引p_name。

<td>
    <?php if(isset($error["p_name"])){ ?><span class="error"><?php echo $error["p_name"]; ?></span><?php } ?>
</td>

当我在validate函数中打印$error['p_name']元素时,它会打印出更新的值。

实际上,validate函数中的元素 - $error['p_name']定义了一个新元素,而不是创建一个预定义$error数组的新数组元素。

2 个答案:

答案 0 :(得分:1)

使用global关键字告诉php,你正在使用全局$ error:

function validate() 
{
    global $error;
    if ((strlen($_POST['p_name']) < 3) || (strlen($_POST['p_name']) > 32)) 
    {
         $error["p_name"] = "Please enter Vendor name of 3 to 32 characters." ;
    }

答案 1 :(得分:1)

嗯,你没有回答我的评论。所以这是范围问题,请勿使用全局关键字。使用依赖注入概念..

将您的$error数组变量作为对函数的引用传递..

function validate(&$error)  //<---- Like that. (See the & ?)
{

当您调用validate函数时,请确保也传递数组。

The reason you should really avoid using globals. Read this linked article.