zeilennummer im php-skript fstellen
kleinerChemiker 02.01.2005 - 13:37 1079 11
kleinerChemiker
Here to stay
|
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
|
__LINE__
|
moidaschl
Vollzeit-Hackler
|
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:](/images/smilies/confused.gif) er schreibt dir eh hin ".. on line XX"
|
kleinerChemiker
Here to stay
|
@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
Legendundead
|
im php-log stehen auch die zeilennummern...
|
kleinerChemiker
Here to stay
|
nur hat man mw selten zugriff auf die php-logs
|
watchout
Legendundead
|
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: 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 http://cz.php.net/manual/en/functio...ror-handler.php
Bearbeitet von watchout am 02.01.2005, 20:11
|
kleinerChemiker
Here to stay
|
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
AdministratorLegends never die
|
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.phpzwar 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
|
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
AdministratorLegends never die
|
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. /**
* 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
|
thx ist ganz schön viel code
|