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

Php 为什么我的数组元素要重新声明?,php,arrays,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

我声明了静态数组$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." ;
    }
    .
    .
    .
}
static$error=array();
如果(!empty($\u POST)&&validate())
{
$sql=mysql\u query(“插入到`表名'集合类别=“.$\u POST['category']”,brand=“.$\u POST['brand']”,product=”,“$\u POST['p\u name']”,location=“.$\u POST['location']”,image=”,“$\u POST['image']”,sku=”,sku=“$\u POST['sku']”);
}
函数验证()
{
如果((strlen($_POST['p_name'])小于3)| |(strlen($_POST['p_name'])>32))
{
$error[“p_name”]=“请输入3到32个字符的供应商名称。”;
}
.
.
.
}
但问题是,当我在下面的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函数中的element-
$error['p_name']
正在定义一个新元素,而不是创建一个预定义的
$error
数组的新数组元素。

使用global关键字告诉php,您正在使用global$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." ;
    }
函数验证()
{
全局$错误;
如果((strlen($_POST['p_name'])小于3)| |(strlen($_POST['p_name'])>32))
{
$error[“p_name”]=“请输入3到32个字符的供应商名称。”;
}

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

$error
数组变量作为函数的引用传递

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

function validate(&$error)//您需要删除
static
关键字。我已经尝试过了。删除static会得到与您尝试在
validate()中使用
$error
数组相同的结果
?谢谢,你节省了时间,事实上我不想使用javascript进行验证。@user3588887,不客气。不要在任何代码上使用globals。你注意到这一点真的很好。