【问题标题】:Can I avoid using isset() to handle "undefined variable" errors?我可以避免使用 isset() 来处理“未定义变量”错误吗?
【发布时间】:2017-10-26 11:47:39
【问题描述】:

我管理一个非常古老的 PHP/MySQL 站点,该站点广泛使用以下语法来检查是否设置了变量:

if($var){ /* do something  */ }

我知道处理这个问题的正确方法是使用 isset() 函数... 但我不能。在线版本可以正常工作(在旧的 gentoo 服务器上),本地版本可以在带有 wamp 2.0(我知道)的非常旧的 Windows XP 计算机上正常工作,并且代码中的任何地方都使用这种语法。

我想在更新/更快的计算机上复制我的本地版本。我在旧的 Windows XP 计算机上安装了相同的 wamp 版本,但我收到了数不清的“注意:未定义的变量/索引 ...”错误。我怀疑可以在 wamp PHP 设置 中完成某些事情,但我不知道去哪里看或做什么。我在旧电脑上工作并在网上工作:必须有办法让它在更新的电脑上工作。

编辑:我想“告诉”PHP 将“未定义”变量作为“假”变量处理(这就是它在 XP 服务器上的工作方式)。关闭错误不会解决问题。我需要if($var){... 充当if(isset($var)){...

在两台服务器(XP和新PC)上,版本如下:

  • Wamp:2.0i
  • 阿帕奇:2.2.11
  • PHP : 5.3.0
  • MySQL : 5.1.36

任何帮助表示赞赏并提前感谢。 这是我在这个精美网站上的第一个问题:如果我做错了什么,请道歉。

编辑 2:感谢@Boratzan 找到了一个解决方案(参见 balow)。我将php.ini(1 个来自 Apache 文件夹,1 个来自 PHP 文件夹)从旧计算机复制到新计算机,并进行了一些小的路径编辑以考虑到两个 wamp 服务器未安装在同一路径中的事实。

编辑 3:经过进一步调查,@Boratzan 似乎从一开始就是正确的。解决方案是将位于 apache/ApacheX.X.XX/bin/ 目录中的 php.ini 文件中的 error_reporting 的值更改为 E_ALL & ~E_NOTICE。这是一个草率的解决方案,但它

【问题讨论】:

  • 我建议你试试看会发生什么:)
  • 可以但你不想想要。遗留代码很痛苦,但如果你想避免这些错误,你必须检查它们是否已设置。
  • 分享你的代码...?
  • 您可能正在寻找error_reporting 设置,但正如其他人提到的,最好修复您的代码。
  • 代码在新电脑上不起作用。我很想用“isset”来修复这个糟糕的语法(它让我的眼睛灼伤!)但是该站点太大而无法更正每个文件。这确实是站点范围的问题,而不是我在某个特定脚本上遇到的问题。

标签: php wamp undefined isset


【解决方案1】:

您可以使用@ 来抑制特定错误:http://php.net/manual/en/language.operators.errorcontrol.php

或者平庸地关闭所有错误。

【讨论】:

    【解决方案2】:

    我不推荐它,但如果你想让它在不显示错误的情况下运行,请使用以下代码禁用 error_reporting

    ini_set('error_reporting', 0);
    

    error_reporting(0);
    

    同样,最好修复您的代码,但如果您继续这样做,您也可以尝试将值设置为 E_ALL & ~E_NOTICE,这只会隐藏 NOTICE 警告

    要回答您的问题,为什么它可以在以前的 WAMP 安装和在线上运行,可能是因为那些将 display_errors 配置为 off(主要在生产环境中完成,不建议在开发时使用)


    由于上述方法均无助于解决您的问题,您可以比较安装中的两个 .ini 文件,或者简单地将工作的文件复制到新的文件中(假设它们都运行相同的版本)。

    WAMP 有两个 php.ini 文件,一个在 PHP 文件夹中,一个在 Apache 文件夹中,确保将它们都复制(或至少一个位于 Apache 文件夹中)。

    【讨论】:

    • 感谢建议:它隐藏了错误,但问题仍然存在。我需要的是让 PHP 将“未定义”理解为“假”......这就是旧服务器处理它的方式。这是一个谜。还是谢谢你=)
    • 那么还有其他原因导致问题,代码是否在 if 语句旁边正常运行?也许您需要启用short_open_tag
    • 所有文件都在使用<?php ?> ...所以我认为short_open_tag 不会改变任何东西。不过还是谢谢。 =)
    • 那么我只能想到一件事,要么比较安装中的两个 .ini 文件,要么只是将工作安装中的 .ini 文件复制到新安装中(假设它们都运行相同的版本)
    • @Boratzan 完美。还有一件事:在 php.net 上,提供了另一种基于错误代码/消息过滤掉某些错误/警告/通知等的好方法:Example #1 Error handling with set_error_handler()。例如,在myErrorHandler()case E_NOTICE: 中,您可以检查错误消息中是否存在子字符串Undefined index。如果是,只需return true;。那么只有Undefined index 通知将从整个列表中被排除。
    猜你喜欢
    • 2011-01-12
    • 2015-07-27
    • 2021-12-04
    • 2021-08-07
    • 1970-01-01
    • 1970-01-01
    • 2010-11-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多