debug

Дед Анвирыч

Новичок
debug

Кто-как свои срипты дебугит - поделитесь опытом. А то
PHP:
echo $myvar
что-то задалбливает?

И еще. Есть какой-нито способ dump с переменных сделать. В файло, например?
 

HEm

Сетевой бобер
PHP:
<?
function Dump($Var,$Name = "dump_vars")
{ if ((is_array($Var) || is_object($Var)))
  { if (is_array($Var)) { $t = $Name." => Array"; } else { $t=$Name." => Object"; }
    print("<li>".$t."[".count($Var)."]</li><ul>\n");
    while(list($k,$v)=each($Var)) { $temp = Dump($v,$k); }
    print("</ul>\n");
  }
  else {
    if ((!is_float($Var))&&(!is_int($Var))) {
      print("<li>".$Name." => '".htmlspecialchars(nl2br($Var))."'</li>\n");
    } else {
      print("<li>".$Name." => ".$Var."</li>\n");
    }
  }
}
/* 
Пример использования:
for ( $i=0; $i<20; $i++ )
{ $A[$i] = $i*$i;
}  
Dump($A,"A");*/
//Dump($GLOBALS,"Globals");
?>
 

HEm

Сетевой бобер
официальный вариант [m]var_dump [/m] но он мне не очень нравится
просто вставляешь в том месте скрипта где нужно посмотреть значение переменной или если тебе нужны ВСЕ переменные то параметром передаешь $GLOBALS
есть редакторы с пошаговой отладкой, найдешь в поиске по форумам "новички" и "профи" по слову "редактор" или прочим
 

Дед Анвирыч

Новичок
Автор оригинала: HEm
есть редакторы с пошаговой отладкой, найдешь в поиске по форумам "новички" и "профи" по слову "редактор" или прочим
Редакторы с пошаговой отладкой не совсем то, что нужно
Вообщем, спасибо за помошь, дальше сам
 

Дед Анвирыч

Новичок
Автор оригинала: Crazy
И что, действительно поможет? Для просмотра ВСЕХ переменных?
угу.
Попробуй.

Только вот я чего не понял. Делаю массив с переменными, dump которых мне не нужен. Т.е. все, кроме HTTP_POST_VARS, HTTP_GET_VARS, HTTP_COOKIE_VARS, HTTP_POST_FILES
смотрю, входит ли $Name в этот массив:
PHP:
 if((!in_array($Name, $noneed_vars))&&($name!="noneed_vars"))
или
PHP:
if(!((in_array($Name, $noneed_vars))||($name=="noneed_vars")))
а скрипт все-равно выдает мне некоторые ненужные мне переменные(argv, HTTP_SERVER_VARS, HTTP_ENV_VARS)
Globals => Array[41]
argv => Array[0]
HTTP_POST_VARS => Array[0]
HTTP_GET_VARS => Array[0]
HTTP_COOKIE_VARS => Array[0]
HTTP_SERVER_VARS => Array[33]
argv => Array[0]
HTTP_ENV_VARS => Array[30]
HTTP_POST_FILES => Array[0]
GLOBALS => Array[41]
test_var => 'test'

В чем бага?
 

Crazy

Developer
Автор оригинала: Дед Анвирыч
угу.
Попробуй.
Пробуем согласно рецепту:

PHP:
<?php

function foo() {
  $bar = "qqq";
  var_dump($GLOBALS);
}

$buzz = 2;
foo();

?>
Строка "qqq" на полученной странице нигде не встречается.
 

Crazy

Developer
Очень забавно видеть этот пост непосредственно после моего примера... :)
 

HEm

Сетевой бобер
Автор оригинала: Дед Анвирыч
Т.е. все, кроме HTTP_POST_VARS, HTTP_GET_VARS, HTTP_COOKIE_VARS, HTTP_POST_FILES
смотрю, входит ли $Name в этот массив:
PHP:
 if((!in_array($Name, $noneed_vars))&&($name!="noneed_vars"))
В чем бага?
читаем http://www.xpoint.ru/archive/topic8/43/8759.html
$_GET - содержит переменные, пришедшие по методу GET
$_POST - содержит переменные, пришедшие по методу POST
$_COOKIE - содержит переменные HTTP cookie
$_SERVER - содержит переменные сервера (напр., REMOTE_ADDR)
$_ENV - содержит переменные окружения
$_REQUEST - содержит сваленные в кучу переменные GET, POST, и Cookie.
Другими словами - весь тот мусор, который пришел от юзера, и которому, в смысле безопасности, нельзя доверять ни в коем случае!
$_SESSION - содержит HTTP переменные, зарегистрированные в сессии.
ты забыл переменную $_ENV
2 Crazy:
интересно. даже не знаю что сказать. но практически ответ на первый вопрос этого топика я дал
теоретически было бы интересно послушать что по поводу данного феномена кто-нить что-нить скажет. мои скромные мозги истины не видят ;(
 

Crazy

Developer
Автор оригинала: Дед Анвирыч
Варианты решения есть?
Лично я использую протоколирование. И явно указываю, какие переменные мне интересны.

Если хочется именно var_dump, то можно прибегнут к небольшому извращению: пишем скрипт, который читает исходник на предмет выражений вида "^\s*$(\w+)" и сам наполняет их именами список аргументов для var_dump, размещенного в той же функции.
 

Дед Анвирыч

Новичок
Автор оригинала: HEm
ты забыл переменную $_ENV
нифига...

PHP:
$noneed_vars=array(
		'argc',
		'argv',
		'COMSPEC',
		'COMSPEC',
		'DOCUMENT_ROOT', 
		'GATEWAY_INTERFACE',
		'GLOBALS',
		'_ENV',
		'HTTP_ACCEPT',
		'HTTP_ACCEPT_ENCODING', 
		'HTTP_ACCEPT_LANGUAGE', 
		'HTTP_CONNECTION',
		'HTTP_ENV_VARS',
		'HTTP_HOST',
		'HTTP_SERVER_VARS',
		'HTTP_USER_AGENT',
		'PATH',
		'PATH_INFO',
		'PATH_TRANSLATED',
		'PHP_SELF',
		'QUERY_STRING',
		'REDIRECT_STATUS',
		'REDIRECT_URL',
		'REMOTE_ADDR',
		'REMOTE_PORT',
		'REQUEST_METHOD',
		'REQUEST_URI',
		'SCRIPT_FILENAME',
		'SCRIPT_NAME',
		'SERVER_ADDR',
		'SERVER_ADMIN',
		'SERVER_NAME',
		'SERVER_PORT',
		'SERVER_PROTOCOL',
		'SERVER_SIGNATURE',
		'SERVER_SOFTWARE',
		'SystemRoot',
		'WINDIR'
		);
output:

Globals => Array[40]
argv => Array[0]
HTTP_POST_VARS => Array[0]
HTTP_GET_VARS => Array[0]
HTTP_COOKIE_VARS => Array[0]
HTTP_SERVER_VARS => Array[33]
argv => Array[0]
HTTP_ENV_VARS => Array[30]
HTTP_POST_FILES => Array[0]
GLOBALS => Array[40]
 

Дед Анвирыч

Новичок
Автор оригинала: Crazy
Лично я использую протоколирование. И явно указываю, какие переменные мне интересны.

Если хочется именно var_dump, то можно прибегнут к небольшому извращению: пишем скрипт, который читает исходник на предмет выражений вида "^\s*$(\w+)" и сам наполняет их именами список аргументов для var_dump, размещенного в той же функции.
Насчет первого поподробнее...

второе же не поможет все-равно...
 

Crazy

Developer
Автор оригинала: Дед Анвирыч
Насчет первого поподробнее...
Общая идея:

PHP:
<?php

$LOG = array();

function log_text($message) {
  global $LOG;
  $LOG[] = array ("text" => $message);
}

function log_var($message,$var) {
  global $LOG;
  ob_start();
  var_dump($var);
  $varInfo = ob_get_contents();
  ob_end_clean();
  $LOG[] = array ("text" => $message, "var" => $varInfo);
}

function log_drop() {
  global $LOG;
  $LOG = array();
}

function log_dump() {
  global $LOG;
  echo "<table border=1>";
  foreach($LOG as $entry) {
    echo "<tr><td>".htmlspecialchars($entry["text"])."</td>";
    if (isset($entry["var"]))
      echo "<td>".htmlspecialchars($entry["var"])."</td>";
    else
      echo "<td>&nbsp;</td>";
    echo "</tr>\n";
  }
  echo "</table>";
}

function foo($arg) {
  $bar = $arg;
  log_var("Before expr",$bar);
  $bar = $bar*13+11;
  log_var("After expr",$bar);
}

$buzz = 2;
foo(1);
log_drop();
foo(2);
log_dump();

?>
Проблемы такого подхода очевидны. Пути разрешения, в принципе, тоже. :)
 
Сверху