小编Jef*_*mon的帖子

处理 PHP 8.1 未定义数组键的警告

我们正在升级到 PHP 8.1。一个新功能是未定义的数组键会引发警告。

不幸的是,这会妨碍轻松使用关联数组(例如 $_SESSION 变量)的能力。我了解预定义变量的优点,并且不寻求对这些优点进行讨论。关联数组的想法是,您可以轻松地将内容添加到会话中,并且所有未分配的内容都会被评估为 null。但现在它也发出了警告;必须采取一些措施来解决这个问题。

这是一些代码的示例:

$_SESSION['is_condition'] = true;
Run Code Online (Sandbox Code Playgroud)

在代码的另一个地方,出现以下情况

if ($_SESSION['is_condition']) ...
Run Code Online (Sandbox Code Playgroud)

如果这种情况发生在“is_condition”会话变量尚未定义的上下文中,则将其值评估为 null 的期望结果就是我们想要的。但现在必须采取其他措施来处理它未定义的可能性。

有几种方法可以处理这个问题:

  1. 预定义所有值为 null 的会话变量。看起来这不是关联数组的精神。现在每个脚本都必须调用一组冗长的代码。

  2. 每当需要关联数组元素的值时,请使用空合并运算符。在整个代码库中放置很多很多额外的运算符是一个丑陋的要求。

  3. 更改我们的自定义错误处理函数以忽略未定义的数组键错误。抑制警告是一个非常糟糕的主意,并且会增加开销。

这些方法都不是非常理想的。

解决这个问题的理论上的方法是使用数组初始化语句,将所有可能的关联键分配为 null。我不知道有这样的事情。

我的问题是是否还缺少其他一些方法,例如仅抑制此特定警告的参数。

php associative-array undefined php-8.1

8
推荐指数
2
解决办法
5万
查看次数

ajax操作意外失败

我们在网站上的许多地方使用了 ajax。一个实例有时会表现得不规则,就像 ajax 调用失败一样。它仅在一个特定位置 - 所有其他位置都按预期工作。

发生故障时,用户会收到操作失败的错误消息。

我们无法重现失败。它总是只适合我们。大多数用户没有遇到这个问题。少数确实这样做的人有时会报告说,他们后来又尝试了一次,并且成功了。

我们可以通过重命名ajax脚本来模拟失败。然后,当尝试操作时,ajax 调用失败,我们收到相同的错误消息。然而,我们没有任何理由相信该错误是由于无法访问 ajax 脚本引起的,尽管有可能。如果是这样的话,那么我们的其他 ajax 脚本也会出现同样的问题。

我们想出了一个解决方法。如果用户在尝试操作之前进入隐身模式,则可以避免该问题。

隐身模式解决方法表明它可能与 cookie 有关。因此,我们尝试以某种方式干扰 cookie,以尝试重现该问题。什么都没有成功。

为了帮助排除故障,我们在错误消息中添加了额外的诊断信息,但到目前为止,除了类似于“错误”的信息之外,还没有任何结果。下面是一些代码,显示了我们如何尝试获取更多信息:

error: function (jqXHR, textStatus, errorThrown)
{
    // alert('read-unread error');
    ajaxError('Read-Unread', textStatus, errorThrown);  // TODO comment out to suppress the error reporting
},
Run Code Online (Sandbox Code Playgroud)

为了完整起见,我在下面包含了完整的 JavaScript 函数。

建立一个简单的测试环境来演示问题效果并不好,因为它会过于简化真实环境,从而破坏了其测试价值。我们认为唯一合理的测试是模拟用户正在做的用例。不幸的是,这很复杂,因为它涉及在我们的系统上创建个人资料,尝试使用该系统与其他成员进行通信,从其他成员那里获得一些响应通信,然后尝试回复此类通信。这会重新创建用例以及发生故障的位置。不幸的是,我们再次怀疑它仍然永远不会触发我们的失败——玩具系统也会“正常工作”。

如果每个用户每次都发生这种情况,那是一回事,但事实并非如此。某些时候只有部分用户使用,并且仅用于我们网站上众多 ajax 使用中的一种。一旦它开始发生,至少在一段时间内该用户就可以重复。

我的问题:

  1. 我们如何创建一个精简版本的环境,以便让 stackoverflow 社区值得一看,而不是模拟我们网站的使用?

  2. “隐身模式”解决方法是否提供了任何见解来了解出了什么问题?

  3. 除了诊断在大多数情况下都能正常工作的代码之外,了解其他 Ajax 故障模式也会很有帮助。作为一个虚构的例子,例如“某些系统太慢并且ajax超时”。

[JavaScript 函数。注意:由于某种原因,我无法将函数的前几行放入代码标记中。]

function toggleReadUnread(usertypeid, opp_user_label_short, principalid, repid, contactuid, value) {
    var new_response = (value) ? 'read' : 'unread';
    var prefix = '#' + …
Run Code Online (Sandbox Code Playgroud)

html javascript php ajax jquery

7
推荐指数
2
解决办法
697
查看次数

Chrome中的打印功能不再有效

我们的网站有一个功能,可以打印成员个人资料.它的工作方式是通过onsubmit将javascript函数附加到按钮.javascript函数使用window.open以特殊模式重新打开页面,该模式重新显示页面的打印机友好版本.

此功能自2008年左右开始实施,适用于所有浏览器.除了大约一周前,它已停止在Chrome中工作.使用Chrome,会发生打开的窗口打开,但随后会打开另一个空白窗口,然后全部关闭.

在搜索这个问题的讨论时,我无法找到确切的问题,但确实找到了一些内容,表示应该在onsubmit中添加"return false".我尝试添加,但它没有帮助.

这是onsubmit的样子:

<button onclick="PrintEmailSubmit('print');">Print Profile</button>
Run Code Online (Sandbox Code Playgroud)

以下是打开窗口的代码:

window.open('print-email-profile.php?mode=' + mode,'','width=' + width + ',height=' + height + ',scrollbars=yes,location=0,menubar=1,status=0,toolbar=0')
Run Code Online (Sandbox Code Playgroud)

虽然没有必要看,这里是整个函数PrintEmailSubmit():

/*
 *  called by view-profile.php
 */
function PrintEmailSubmit(mode)
{
    var width;
    var height;
    switch(mode)
    {
        case 'print':
            width = 850;
            height = 1000;
            break;

        case 'email':
            width = 400;
            height = 120;
            break;

        default:
            alert('Error: invalid calling sequence -- should not happen!');
            exit;
    }
    window.open('print-email-profile.php?mode=' + mode,'','width=' + width + ',height=' + height + ',scrollbars=yes,location=0,menubar=1,status=0,toolbar=0');
}
Run Code Online (Sandbox Code Playgroud)

最后,使这项工作的原因是页面的特殊版本在body标签中添加了以下内容:

<body onload="window.print();window.close();"> …
Run Code Online (Sandbox Code Playgroud)

javascript google-chrome window.open

5
推荐指数
1
解决办法
2万
查看次数

防止取消订阅转发的电子邮件

我正在发送批量 html 电子邮件,并且底部有正确的“取消订阅”选项。如果有人转发这样的电子邮件,我想忽略该取消订阅通知。这是可以接受的,原因有两个:(1)转发的电子邮件不再是批量电子邮件,而是一个人发给另一个人的电子邮件;(2) 第二个收件人尝试取消订阅是没有意义的,因为他们没有订阅。

https://litmus.com/blog/preventing-unsubscribes-in-forwarded-emails有一篇文章描述了这种情况,它也提供了一个出色的解决方案。虽然该解决方案在 2013 年提出时可能有效,但现在已不再有效。

解决方案是利用 CSS 级联以及转发的 html 电子邮件通常会<blockquote>在正文后面添加一个标签。因此,您可以设置如下选择器:

blockquote .original-only {display: none !important}
Run Code Online (Sandbox Code Playgroud)

问题在于转发的电子邮件已删除外部和内部样式表。并且内联样式无法利用级联。

有现代的、可行的解决方案吗?

html css email unsubscribe

5
推荐指数
1
解决办法
481
查看次数

YUICompressor崩溃 - stackoverflow错误

我经常从YUICompressor得到似乎是stackoverflow错误的东西;-).以下是数千条错误行的第一部分,这些错误行来自于尝试压缩24074字节的css样式表(而不是"由java.lang.StackOverflowError引起的约8行):

iMac1:src jas$ min ../style2.min.css style2.css 
Exception in thread "main" java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at com.yahoo.platform.yui.compressor.Bootstrap.main(Bootstrap.java:21)
Caused by: java.lang.StackOverflowError
    at java.lang.Character.codePointAt(Character.java:2335)
    at java.util.regex.Pattern$CharProperty.match(Pattern.java:3344)
    at java.util.regex.Pattern$Branch.match(Pattern.java:4114)
Run Code Online (Sandbox Code Playgroud)

...(加上1021条错误行)

通常在向压缩文件添加几行之后发生错误.CSS很好,并且在未压缩格式下完美运行.我没有看到添加到文件中导致错误的选择器类型的特定模式.在这种情况下,将以下选择器添加到先前可压缩的文件中会导致错误:

#thisisatest
{
    margin-left:87px;
}
Run Code Online (Sandbox Code Playgroud)

我想知道是否有一个标志可以帮助扩大堆栈.或者,如果那不是问题,那是什么?

编辑:

当我发布这个问题时,我突然意识到我应该检查java命令,看看是否有一个参数来放大堆栈.原来它是-Xssn,其中"n"是表示堆栈大小的参数.其默认值为512k.所以我尝试了1024k,但仍然导致了stackoverflow.然而,尝试2048k工作,我认为这可能是解决方案.

编辑2:

虽然我不再使用此方法进行缩小,但更具体的是完整命令(我已将其设置为shell别名),显示如何使用-Xss2048k参数:

java -Xss2048k -jar~/Documents/RepHunter/Website\Materials/Code/Third\Party\Libraries/YUI\Compressor/yuicompressor-2.4.8.jar --type css -o

css java yui

4
推荐指数
1
解决办法
2952
查看次数