【问题标题】:PHP: Blank page, error reporting not functioningPHP:空白页,错误报告不起作用
【发布时间】:2011-12-06 23:22:54
【问题描述】:

我遇到了一个空白页面,尽管我已经告诉 PHP 报告所有错误,但我仍然没有得到任何信息,这让我相信这一定是语法错误。我找不到它是什么。

这是我正在编写的脚本:

test.php

<?php
ini_set('display_errors', '1');
require('database.php');

print("hello");

$config = new Config("lessons.db","data/");
$db = new Database($config, array('first', 'second', 'third', 'fourth'), true);

print_r($db->dumpToArray());
?>

database.php

<?php
    class Config {
        private
            $_db
            $_file,
            $_directory,
            $_delimiter,
            $_columns;

        public function __construct(string $file, string $directory = null, string $delimiter = "|")  {
            $_db = $directory.$file;
            $_directory = $directory;
            $_delimiter = $delimiter;
        } 
        public function db() {
            return $_db;
        }
        public function delimiter() {
            return $_delimiter;
        }

    }       
    class Database {
        private
            $_config,
            $_columns,
            $_rows,
            $_pointer;

        public function __construct(Config $config, array $constants = null, boolean $caseInsensitive = false)  {
            $_config = $config;
            is_readable ($_config->db())
                or exit ("The database cannot be read");
            if(!is_null($constants))
                $this->defineColumns($constants, $caseInsensitive);
            return;
        } 

        private function connect(string $method) {
            if (!($_pointer = @fopen($_config->db(), $method)) or printf("Unable to connect to database");
        }

        private function disconnect() {
            fclose($_pointer);
        }

        private function defineColumns($constants, $caseInsensitive) {
            for (var $i=0;$i<count($constants);$i++)
                define($constants[i], $i, $caseInsensitive);                
        }

        public function dumpToArray() {
            $arrayDump = explode($_config->delimiter(), file($_config->db(), FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES));
            return $arrayDump;
        }

        public function getRowByValue($column, $value) {
            $this->connect('r');
            $rowNumber = 0;
            while (!feof($_Pointer)) {
                $row = explode($_config->delimiter(), fgets($dbPointer, 1024));
                if ($row[$column] == $value) {
                    $this->disconnect();
                    return $row;
                }
                $rowNumber++;
            }
            $this->disconnect();
            return false;
        }       
    }
?>

谁能看出是什么原因造成的?

【问题讨论】:

  • 我会先尝试php -l &lt;filename&gt;,以确保它不是语法问题。
  • @Flukey 无法访问它们,我在一个奇怪的公司设置中。
  • @hafichuk 我需要修改该代码吗?从来没有遇到过。
  • 当我无法访问错误日志(或者当问题是意外行为而不是实际错误时)并且我无法访问调试器时,我分而治之。只需注释掉您认为导致问题的主要代码部分。一旦您将问题大致定位,然后开始取消注释代码块,直到问题再次出现。
  • 投票结束这个问题,因为这个问题过于本地化。要求人们为您查找语法错误超出了限制。

标签: php error-handling


【解决方案1】:

我认为require(database.php); 应该是require('database.php');

尝试改变它,看看是否有帮助

另外,你缺少一个分号

return $arrayDump

编辑

好的,我不太确定,但是尝试从函数的参数中删除强制转换。

所以...

public function __construct(Config $config, array $constants = null, boolean $caseInsensitive = false) 

public function __construct($config, $constants = null, $caseInsensitive = false)  {

我在 PHP 方面没有做太多 OOC,只是再试一次。

【讨论】:

  • 我刚刚发现了一个丢失的分号
  • 哇,谢谢鹰眼先生,不过还是白屏。更新了源代码。
  • 我不确定,但您可能需要检查 Database 类中 __construct 函数的最后一行。我可能错了,但它没有返回任何东西
  • 我认为您不必这样做,但我可能错了。尽管即使我将其设置为 return true; 它仍然是白屏 =/
  • 我找到了一种在不同服务器上获取错误报告的方法,这是其中一个问题以及缺少冒号和括号。我会接受你找到最多错误的答案:)
【解决方案2】:

乍一看...这不会飞

$db = new Database($config, ["first","second","third","fourth"], true);

您的数据库类需要一个数组

$db = new Database($config, array('first', 'second', 'third', 'fourth'), true);

【讨论】:

  • 我想他是想做一个数组
  • @jprofitt 你是对的。读了他的数据库课后我意识到了。
  • 谢谢,做了很多动作脚本,语法混乱+1,但它仍然无法正常工作。
  • @George 请不要用笼统的术语来描述问题。 “不起作用。” 仍然是白屏吗?有新的错误吗?
  • @MikeB 抱歉,它仍然是白屏 - 我更新了帖子以匹配当前的来源
【解决方案3】:

谁能看出是什么原因造成的?

这是查找错误的最错误和低效的方法。
您可以长时间盯着您的代码,甚至要求其他人这样做,但没有任何成功。

为什么不直接阅读确切的错误信息?
你在正确的轨道上,但放弃了。

正如 Flukey 在 cmets 中所说,您必须检查错误日志,默认情况下与 Web 服务器错误日志相同。

查看实际错误是纠正代码的唯一正确方法。

【讨论】:

  • 我通常会,但在我目前的环境下我做不到,这可能不对,但这是我现在必须做的。
  • 不要告诉我你没有可用的服务器来运行此代码并报告错误。
  • 已上传到另一台服务器(doh,duh!),现在正在解决错误。
【解决方案4】:

提示

如果您遇到语法错误,并且您只能在脚本本身中更改 error_reporting/display_errors 设置,您仍然可以使其正常工作。

诀窍是制作另一个没有语法错误的脚本,并在该脚本中设置您的配置选项,然后然后包含可疑的错误脚本。

<?php
error_reporting(-1); // show all
ini_set('display_errors', 1);
require 'file_with_parse_error.php';

不过,您通常应该能够在 php.ini 或 webserver 配置文件中更改这些设置。在任何情况下都应该有一个错误日志可供查看。

然后只需在您的网络浏览器中请求该新脚本的 url。

【讨论】:

    【解决方案5】:

    在 php.ini 中还有其他错误报告级别 - 您可能需要查看它们。

    【讨论】:

      【解决方案6】:

      由于您无法查看错误日志,请尝试在您的代码中添加一堆打印语句,看看是哪一行导致您的脚本失效。如果它在您的 database.php 脚本中被杀死,请在其中打印一些内容。

      <?php
      ini_set('display_errors', '1');
      require('database.php');
      print "Test1";
      print("hello");
      print "Test2";
      $config = new Config("lessons.db","data/");
      print "Test3";
      $db = new Database($config, array('first', 'second', 'third', 'fourth'), true);
      print "Test4";
      
      print_r($db->dumpToArray());
      ?>
      

      【讨论】:

      • 为什么投反对票?如果您看不到任何错误,这是一种合法的调试方式。
      猜你喜欢
      • 1970-01-01
      • 2012-04-23
      • 2012-05-08
      • 1970-01-01
      • 2018-02-25
      • 2013-12-20
      • 1970-01-01
      • 2011-06-17
      • 2023-03-15
      相关资源
      最近更新 更多