我正在开发一个网站,如果用户更改了某些数据,它应该存储在后台,以查看最后一次更改的人以及等等...我有一个名为Event的对象,但屏幕上的数据分为2个选项卡(Client和Event)。提交后,我获取所有字段并将数据放入对象中。我有这个自制函数来比较新boject中的值和旧对象的值:
function createArrayReturnDiff($obj1, $obj2) {
$helpArray1 = (array) $obj1; //convert object to array
$helpArray2 = (array) $obj2; //convert object to array
$help = array_diff_assoc($helpArray2, $helpArray1); //Computes the difference of arrays with additional index check
return $help;
}
现在这个工作正常,我得到一个返回的数组,其中包含字段名称和新值。 但这里有棘手的部分。返回此数组后,我循环播放它我想检查值是哪个选项卡,以便稍后给用户提供反馈。因此,如果值在Cleint或Event选项卡上。现在我创建了2个数组,我在其中描述了每个选项卡中的所有字段。
$tabKlant = array('Evenementfirmanaam', 'Evenementaanspreking', 'Evenementcontactpersoon', 'Evenementcontactpersoonstraat', 'Evenementcontactpersoongemeente', 'Evenementcontactpersoonland', 'Evenementcontactpersoonmail', 'Evenementcontactpersoontel', 'Evenementgeldigheidsdatum', 'Evenementfacturatiegegevens', 'Evenementfactuur_mededeling', 'Evenementbestelbon', 'Evenementreferentie');
$tabEvenement = array('Evenementstartdatum', 'Evenementeinddatum', 'Evenementnaam', 'Evenementfeestlocatie', 'Evenementcontactfeestlocatie', 'Evenementaantal', 'Evenementact_speeches_opm', 'Evenementdj', 'Evenementinleiding');
现在我的代码要检查:
foreach ($help as $key => $value) {
if (in_array($key, $tabEvent)) {
$tab = "Event";
} else if (in_array($key, $tabClient)) {
$tab = "Client";
} else {
$tab = "";
}
}
现在我试图改变的是Evenementfirmanaam,所以$ help数组包含key = Evenementfirmanaam和value ='xxxx'的值。一切看起来都应该有效。但由于某种原因,它无法在我的foreach的in_array中找到它的价值。
我尝试将数据写入数据库后。我在我的帮助数组的$ key(在这种情况下为firmanaam)中使用了mysqli_real_escape_string,我发现它创建的字符串如:'\ 0Evenement \ 0firmanaam'。我不知道为什么添加\ 0,但我感觉这就是为什么in_array函数不能正确地比较我的值的原因。有谁知道问题可能是什么?
答案 0 :(得分:1)
问题是,firmanaam
类(Evenement
和$obj1
看起来像是其实例)的$obj2
属性是私有的,这导致了强制转换数组creating special keys:
如果将对象转换为数组,则结果是一个数组 元素是对象的属性。键是成员变量 名称,有一些值得注意的例外:整数属性是 不可访问;私有变量具有前缀的类名 变量名;受保护的变量前面有一个
'*'
变量名。这些前置值在任一侧都有空字节。 这可能会导致一些意外行为。
从本质上讲,您因违反课程的逻辑设计而受到惩罚:如果$firmanaam
为private
,则外部世界不应对其价值进行任何访问。 cast to array允许你获取值,但你真的不应该这样做。
由于您使用Evenement
来封装和隐藏数据成员,所以一直这样做。如果您想要访问这些成员,请提供并使用getter。如果要将两个实例与特定语义进行比较,请在该类中添加一个比较方法。