gpt4 book ai didi

php - file_put_contents() 弄乱了更新的数组值

转载 作者:可可西里 更新时间:2023-10-31 23:41:00 25 4
gpt4 key购买 nike

如果标题有点困惑,请见谅。

我下面的结果指出了正在发生的事情。

这个问题已经变得非常广泛,所以我在这里强调这两件事:

看我的 更新 在底部,出于合理的原因。

整个文件: (见第 86 行)http://codepad.org/oIXaZZaB

这是发生了什么:

我有这个数组,它包含每个语言代码的计数整数。

$downloads = [
'all' => [
'nl-BE' => 0,
'nl-NL' => 0,
'fr-BE' => 0,
'fr-FR' => 0,
'de-DE' => 0,
'it-IT' => 0,
'en-UK' => 0,
'en' => 0
],
'unique' => [
'nl-BE' => 0,
'nl-NL' => 0,
'fr-BE' => 0,
'fr-FR' => 0,
'de-DE' => 0,
'it-IT' => 0,
'en-UK' => 0,
'en' => 0
]
];

$_GET['langCode'] 中检索到的 key 参数, 总是 获取 计数 $downloads['all'] 中的相应键.

我还检查访问者是否是唯一的并且已经使用了相同的 $langCode前。如果他没有用过同样的 $langCode之前,计数也加到 $downloads['unique']中对应的key .

这是通过以下一段代码完成的:
$uniqueVisitors = [
'127.0.0.1' => [ 'en-UK' ]
];


if ($uniqueVisitors == null)
{
$uniqueVisitors = [
$ipNew => []
];
}



$countUnique = 1;


/* Check Unique Visitors */

if (isset($uniqueVisitors[$ipNew]))
{
if (in_array($langCode, $uniqueVisitors[$ipNew]))
{
$countUnique = 0;
}

else $uniqueVisitors[$ipNew][] = $langCode;
}

else $uniqueVisitors[$ipNew] = [ $langCode ];



/* Update Data */

$downloads['all'][$langCode]++;

if ($countUnique)
{
$downloads['unique'][$langCode]++;
}


/* Save Data */

file_put_contents('data/unique-visitors.json', json_encode($uniqueVisitors));
file_put_contents('data/downloads.json', json_encode($downloads));

现在奇怪的部分是,当我运行脚本时,有时会计算多个键,即使 $langCode只包含一个键(例如 'nl-NL' )

使用时 'en-UK' , 'en'也经常被计算在内。 'fr-FR' 也是如此和 'fr-BE' .
'nl-NL''nl-BE' .

它主要发生在使用的 langCode 计数仍然是 0
但它似乎也以随机顺序发生。

现在您可能认为这是由于 语言代码 二手 key ,但我用过 零索引键也是 ,同样的结果!

例如:
/*  Retrieved first from JSON file  */

$downloads = [
'all' => [
'nl-BE' => 0,
'nl-NL' => 2,
'fr-BE' => 1,
'fr-FR' => 0,
'de-DE' => 0,
'it-IT' => 0,
'en-UK' => 0,
'en' => 0
],
'unique' => [
'nl-BE' => 0,
'nl-NL' => 1,
'fr-BE' => 1,
'fr-FR' => 0,
'de-DE' => 0,
'it-IT' => 0,
'en-UK' => 0,
'en' => 0
]
];

$uniqueVisitors = [
'127.0.0.1' => [ 'nl-NL', 'fr-BE' ]
];


/* Result after running script with 'en-UK' langCode */

$downloads = [
'all' => [
'nl-BE' => 0,
'nl-NL' => 2,
'fr-BE' => 1,
'fr-FR' => 0,
'de-DE' => 0,
'it-IT' => 0,
'en-UK' => 1,
'en' => 1 // Why is this one counted ?
],
'unique' => [
'nl-BE' => 0,
'nl-NL' => 1,
'fr-BE' => 1,
'fr-FR' => 0,
'de-DE' => 0,
'it-IT' => 0,
'en-UK' => 1,
'en' => 1 // Why is this one counted ?
]
];

$uniqueVisitors = [
'127.0.0.1' => [ 'nl-NL', 'fr-BE', 'en', 'en-UK' ] // 'en' stored as well ?
];

整个文件: (见第 86 行) http://codepad.org/oIXaZZaB

更新:

当我不使用两个 file_put_contents() 将更新的数据保存回他们的文件时功能,只需进行一些测试和转储,整个计数确实按预期工作!

所以看起来那两个 file_put_contents()用于保存(正确)更新数据的函数会以某种方式干扰,并在执行时更改某些计数。

但是怎么样?!

有人对这种意外行为有更好的理解吗?

更新 2:

当我离开时 json_encode()在我的 file_put_contents()函数,我收到“数组到字符串的转换”错误, 两次 用于保存我的计数数据( $downloads ):
Notice: Array to string conversion in /Applications/MAMP/htdocs/project/downloads/downloads.php on line 89

Notice: Array to string conversion in /Applications/MAMP/htdocs/project/downloads/downloads.php on line 90

Notice: Array to string conversion in /Applications/MAMP/htdocs/project/downloads/downloads.php on line 90
file_put_contents('data/unique-visitors.json', json_encode($uniqueVisitors));
file_put_contents('data/downloads.json', json_encode($downloads)); // This one is called twice!

那么为什么那个被执行了两次?那里甚至没有一个循环。

更新 3:

我的 JSON 编码 $downloads数据正确显示更新后的值。

但是一旦我使用 file_put_contents()存储更新的 $downloads数据,它会混淆更新的值。即使我在使用 file_put_contents 之前/之后转储更新的数据,显示乱七八糟。

初始 $downloads大批:
$downloads = [
'all' => [
'nl-BE' => 0,
'nl-NL' => 0,
'fr-BE' => 0,
'fr-FR' => 0,
'de-DE' => 0,
'it-IT' => 0,
'en-UK' => 0,
'en' => 0
],
'unique' => [
'nl-BE' => 0,
'nl-NL' => 0,
'fr-BE' => 0,
'fr-FR' => 0,
'de-DE' => 0,
'it-IT' => 0,
'en-UK' => 0,
'en' => 0
]
];

使用 $_GET['langCode'] = 'nl-BE' 更新值:
$downloads = [
'all' => [
'nl-BE' => 1,
'nl-NL' => 0,
'fr-BE' => 0,
'fr-FR' => 0,
'de-DE' => 0,
'it-IT' => 0,
'en-UK' => 0,
'en' => 0
],
'unique' => [
'nl-BE' => 1,
'nl-NL' => 0,
'fr-BE' => 0,
'fr-FR' => 0,
'de-DE' => 0,
'it-IT' => 0,
'en-UK' => 0,
'en' => 0
]
];

当我尝试使用 file_put_contents() 存储更新的数组时:
$downloads = [
'all' => [
'nl-BE' => 2, // Why this increment?
'nl-NL' => 0,
'fr-BE' => 0,
'fr-FR' => 0,
'de-DE' => 0,
'it-IT' => 0,
'en-UK' => 0,
'en' => 0
],
'unique' => [
'nl-BE' => 1,
'nl-NL' => 0,
'fr-BE' => 0,
'fr-FR' => 0,
'de-DE' => 0,
'it-IT' => 0,
'en-UK' => 0,
'en' => 0
]
];

奇怪的是,当我使用 file_put_contents 时, 更新 $downloads在同一脚本运行(之前和之后 file_put_contents )上转储时,显示更新不正确。我什至不必使用 file_get_contents检索错误保存的数据。

更新 4:(原因)

看来是 Safari 7 导致了这个错误。

Firefox 和 Chrome 都完美地运行了这个脚本。

我在哪里可以报告这个?

htaccess:

如果没有 htaccess 文件,同样的错误仍然会发生。
<IfModule mod_rewrite.c>

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l

RewriteRule ^(.+)/?$ index.php?lang=$1 [QSA,NC,L]


</IfModule>

最佳答案

我也无法重现您的错误。在我看来,您的脚本被调用了两次(请参阅“全部”中的项目是递增的,但不是“唯一”中的。
file_put_contents()没有问题.您可以通过在脚本中添加以下内容来验证这一点:

<?php

mail('you@domain.tld', 'script executed at '.time(), '');

// your code ...

我建议复制您的脚本,删除所有 html 代码和 在带有虚拟数据的终端中执行它 :
php yourscript.php

这是我的代码: http://codepad.org/XhS6uEz1

你会看到它的行为是正确的。

此外,您可以禁用一些 php module that could be responsible for such bugs但我认为这不是问题。

关于php - file_put_contents() 弄乱了更新的数组值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20372587/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com