"We are back" « oc.at

zeilennummer im php-skript fstellen

kleinerChemiker 02.01.2005 - 13:37 1078 11
Posts

kleinerChemiker

Here to stay
Avatar
Registered: Feb 2002
Location: Wien
Posts: 4303
kann ich in einem php-skript die gerade aktuelle zeilennumer festellen? wäre interessant für eine funktion, die bei einem fehler aufgerufen wird, da man dann auch weiß wo der fehler war.

tia

MIK
Bearbeitet von kleinerChemiker am 02.01.2005, 14:07 (solved)

dio

Here to stay
Registered: Nov 2002
Location: Graz
Posts: 4938
__LINE__

moidaschl

Vollzeit-Hackler
Avatar
Registered: Aug 2002
Location: 1210, ABK-D/L
Posts: 4029
Zitat von kleinerChemiker
kann ich in einem php-skript die gerade aktuelle zeilennumer festellen? wäre interessant für eine funktion, die bei einem fehler aufgerufen wird, da man dann auch weiß wo der fehler war.

tia

MIK

:confused: er schreibt dir eh hin ".. on line XX"

kleinerChemiker

Here to stay
Avatar
Registered: Feb 2002
Location: Wien
Posts: 4303
@dio: thx
@moidaschl: nicht, wenn man nicht die automatischen fehlermeldungen will. die seite gibt keinen autput und wird auch nicht von "menschen" besucht. daher will ich eventuell fehlermeldungen in nem file festhalten.

MIK

watchout

Legend
undead
Avatar
Registered: Nov 2000
Location: Off the grid.
Posts: 6845
im php-log stehen auch die zeilennummern...

kleinerChemiker

Here to stay
Avatar
Registered: Feb 2002
Location: Wien
Posts: 4303
nur hat man mw selten zugriff auf die php-logs ;)

watchout

Legend
undead
Avatar
Registered: Nov 2000
Location: Off the grid.
Posts: 6845
najo, wenn du aber eine "error-handler" funktion (ich vermute du willst eine solche verwenden) verwendest, nutzt dir __LINE__ recht wenig, weil dann kriegst du erst wieder die zeile in der funktion...

edit: ich seh' grad:
Zitat
The user function needs to accept two parameters: the error code, and a string describing the error. From PHP 4.0.2, three optional parameters are supplied: the filename in which the error occurred, the line number in which the error occurred, and the context in which the error occurred (an array that points to the active symbol table at the point the error occurred). The function can be shown as: handler ( int errno, string errstr [, string errfile [, int errline [, array errcontext]]])
also rtfm :p

http://cz.php.net/manual/en/functio...ror-handler.php
Bearbeitet von watchout am 02.01.2005, 20:11

kleinerChemiker

Here to stay
Avatar
Registered: Feb 2002
Location: Wien
Posts: 4303
nein, ist keine richtige error-handler funktion

lediglich ein: mysql_query($query) OR f_mysql_error($query, __LINE__)

die funktion schreibt mir dann zeit und ort des fehlers und den fehler selbst und query-string in ein file.

mat

Administrator
Legends never die
Avatar
Registered: Aug 2003
Location: nö
Posts: 25538
kannst ja selber einen "error" triggern. allerdings ist das genauso hässlich wie deine variante.

imo schönste version: http://at2.php.net/manual/de/functi...g-backtrace.php

zwar ein wenig anstrengend, aber mit der kannst du aus deiner error funktion heraus, den die aufrufposition herausfinden.

wenn du willst poste ich morgen source code.

kleinerChemiker

Here to stay
Avatar
Registered: Feb 2002
Location: Wien
Posts: 4303
naja, ist ja nur für 2 files, aber interessieren würds mich schon. wenn man da was praktisches basteln kann, würd ichs glatt in die hp einbauen. anstatt öffentliche fehlermeldungen, die fehlermeldungen loggen oder in ne db schreiben.

mat

Administrator
Legends never die
Avatar
Registered: Aug 2003
Location: nö
Posts: 25538
dieser code geht davon aus, dass es eine klasse "Debug" in einem file "debug.cls.php" gibt. mit dieser funktion kann man also den letzten punkt ausserhalb dieser debugklasse ermitteln.

Code: PHP
  /**
   * This function returns formatted tracing information.
   *
   * @static
   *
   * @param int backtrace depth. travel back to other functions.
   *
   * @return string formatted trace string
   */
  static function getTraceString($nBackTraceDepth = 0)
  {
    $aTrace = debug_backtrace();
    if (!is_array($aTrace) || count($aTrace) == 0)
      return "trace n/a";

    // backtrace out of the debug class (and debug file)
    $found = false;
    foreach ($aTrace as $aTraceInfo)
    {
      if ((isset($aTraceInfo['class']) && $aTraceInfo['class'] == 'Debug') &&  (isset($aTraceInfo['file']) && strpos($aTraceInfo['file'],'debug.cls.php') !== false))
      {
        $nBackTraceDepth++;
        continue;
      }

      $found = true;
      break;
    }

    if ($found == false)
      return "trace n/a";

    if ($nBackTraceDepth > count($aTrace))
      return "invalid depth: $nBackTraceDepth";

    $aInfo = $aTrace[$nBackTraceDepth];

    // trace one back again to determine the function name we're in
    $szExtended = "";
    if ($nBackTraceDepth+1 < count($aTrace))
    {
      $aClassInfo = $aTrace[$nBackTraceDepth+1];

      $szArgs = "";
      if (isset($aClassInfo['args']) && is_array($aClassInfo['args']) && count($aClassInfo['args']) > 0)
      {
        foreach ($aClassInfo['args'] as $szName => $szValue)
        {
          if ($szValue === null)
            continue;

          if ($szArgs != "")
            $szArgs .= ",";

          // szName should be the varname, but for now that's not supported by php
          if (is_string($szValue))
            $szArgs .= "'$szValue'";
          else
          if (is_object($szValue))
            $szArgs .= "object: ".get_class($szValue);
          else
            $szArgs .= "'$szValue'";
        }

        if ($szArgs == "")
          $szArgs = "none";
      }
      else
        $szArgs = "n/a";

      $szExtended = " - ".(isset($aClassInfo['class']) ? "$aClassInfo[class]$aClassInfo[type]" : "").
                          "$aClassInfo[function] [args: $szArgs]";
    }

    $aInfo['file'] = !isset($aInfo['file']) || $aInfo['file'] == "" ?
                     "unknown" : substr(realpath($aInfo['file']),strlen($_SERVER['DOCUMENT_ROOT'])+1);

    $aInfo['line'] = !isset($aInfo['line']) ? 0 : $aInfo['line'];

    return "$aInfo[file], $aInfo[line]{$szExtended}";
  }

kleinerChemiker

Here to stay
Avatar
Registered: Feb 2002
Location: Wien
Posts: 4303
thx
ist ganz schön viel code :eek:
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz