【问题标题】:PHP Error handling in WordPress pluginWordPress插件中的PHP错误处理
【发布时间】:2011-02-03 23:51:34
【问题描述】:

我是 PHP 和 Wordpress 的新手(但在 C# 中还可以),并且正在努力理解我正在尝试编写的自定义插件中的错误处理。该插件的基础是查询现有的 MSSQL 数据库(注意它不是标准的 MYSQL 数据库...)并将行返回到屏幕。这运行良好,但托管服务提供商已将我的数据库脱机,这导致我出现错误处理问题(我认为这没问题)。

以下代码无法连接到数据库(如预期的那样),但在屏幕上显示错误并停止页面处理。它甚至不输出“或死”错误文本。

问题:我怎样才能只输出一个简单的“无法加载数据”消息,然后正常继续?

function generateData()

{

 global $post; 

 if ("$post->post_title" == "Home")
 { 
  try 
  {
   $myServer = "<servername>";
   $myUser = "<username>";
   $myPass = "<password>";
   $myDB = "<dbName>"; 

   //connection to the database
   $dbhandle = mssql_connect($myServer, $myUser, $myPass) 
                              or die("Couldn't open database $myDB"); 


            //... query processing here...
        }
        catch (Exception $e)
  {
         echo "Cannot load data<br />";
  }

 }

 return $content;
}

正在生成错误:(第 31 行是 $dbhandle = mssql_connect...)

警告:mssql_connect() [function.mssql-connect]:无法连接到服务器:第 31 行 中的

致命错误:在第 31 行的 中超过了 30 秒的最大执行时间

【问题讨论】:

    标签: php database wordpress plugins


    【解决方案1】:

    首先,如果mssql_connect 在出现问题时发出警告,那么您无法避免它:您唯一能做的就是使用@ operator 隐藏它:

    if (($dbhandle = @mssql_connect($myServer, $myUser, $myPass)) === false) {
        // connection failed
    }
    

    注意:当连接错误发生时,你不应该die():它会停止整个应用程序的执行,这肯定是不希望的。


    致命错误是第二个问题(这可能是第一个问题的结果)

    请注意,您无法从致命错误中恢复:它是致命。这意味着您必须以一种或另一种方式避免它。

    这里的错误是您的脚本工作时间超过了max_execution_time seconds ;由于在mssql_connect 行上报告了错误,我想脚本正在等待连接成功,并且它不会在不到 30 秒内建立。


    我没有要测试的 SQL Server 数据库,但是查看 mssql 手册的 Runtime Configuration 部分,我会说这些看起来很有趣:

           name               Default value
    mssql.connect_timeout        "5"
    mssql.timeout                "60"
    

    您可以尝试更改这些,

    • 在您的 php.ini 文件中,如果您可以修改它
    • 或在尝试连接之前使用ini_set()

    在第二种情况下,这样的事情可能会奏效:

    ini_set('mssql.connect_timeout', '3');
    ini_set('mssql.timeout', '3');
    

    【讨论】:

    • +1 用于查看配置。必须是 php 或 mysql 配置问题
    • 感谢您的出色回答,非常详细。我从这里webcheatsheet.com/PHP/connect_mssql_database.php 获得了数据库代码,我已经删除了“die”位,并添加了@,但它似乎仍然停止处理页面。它不会输出错误,但也不会处理其他任何内容。我做了一个简单的测试: echo ($dbhandle = @mssql_connect($myServer, $myUser, $myPass));我希望得到一个真或假的结果,但没有任何输出(并且页面处理再次停止)。戴上 C# 帽子后,我是否需要在该行中添加一个 PHP 等效的“.ToString()”?
    • @ 运算符正在消除警告和错误(它仍在发生,但没有显示任何消息 - 因此脚本在没有任何其他信息的情况下结束);;;如果设置超时选项不起作用,那很可悲/不好:-(
    【解决方案2】:

    您可能还想查看 WP_Error 类以优雅的方式处理您的错误。请注意,这是一种通用方法,您必须单独处理特定的错误检测逻辑。 WP_Error 将帮助您将所有错误集中在一个地方。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-30
    • 2013-08-22
    相关资源
    最近更新 更多