我们正在升级到 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 的期望结果就是我们想要的。但现在必须采取其他措施来处理它未定义的可能性。
有几种方法可以处理这个问题:
预定义所有值为 null 的会话变量。看起来这不是关联数组的精神。现在每个脚本都必须调用一组冗长的代码。
每当需要关联数组元素的值时,请使用空合并运算符。在整个代码库中放置很多很多额外的运算符是一个丑陋的要求。
更改我们的自定义错误处理函数以忽略未定义的数组键错误。抑制警告是一个非常糟糕的主意,并且会增加开销。
这些方法都不是非常理想的。
解决这个问题的理论上的方法是使用数组初始化语句,将所有可能的关联键分配为 null。我不知道有这样的事情。
我的问题是是否还缺少其他一些方法,例如仅抑制此特定警告的参数。
我们在网站上的许多地方使用了 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 使用中的一种。一旦它开始发生,至少在一段时间内该用户就可以重复。
我的问题:
我们如何创建一个精简版本的环境,以便让 stackoverflow 社区值得一看,而不是模拟我们网站的使用?
“隐身模式”解决方法是否提供了任何见解来了解出了什么问题?
除了诊断在大多数情况下都能正常工作的代码之外,了解其他 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) 我们的网站有一个功能,可以打印成员个人资料.它的工作方式是通过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) 我正在发送批量 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)
问题在于转发的电子邮件已删除外部和内部样式表。并且内联样式无法利用级联。
有现代的、可行的解决方案吗?
我经常从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 ×2
html ×2
javascript ×2
php ×2
ajax ×1
email ×1
java ×1
jquery ×1
php-8.1 ×1
undefined ×1
unsubscribe ×1
window.open ×1
yui ×1