<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Разработка &#187; debug</title>
	<atom:link href="http://www.job-blog.bullgare.ru/tag/debug/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.job-blog.bullgare.ru</link>
	<description>о программировании и работе</description>
	<lastBuildDate>Fri, 03 Feb 2012 09:42:30 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.4</generator>
		<item>
		<title>Дебаггинг PDO-запросов</title>
		<link>http://www.job-blog.bullgare.ru/2010/01/%d0%b4%d0%b5%d0%b1%d0%b0%d0%b3%d0%b3%d0%b8%d0%bd%d0%b3-pdo-%d0%b7%d0%b0%d0%bf%d1%80%d0%be%d1%81%d0%be%d0%b2/</link>
		<comments>http://www.job-blog.bullgare.ru/2010/01/%d0%b4%d0%b5%d0%b1%d0%b0%d0%b3%d0%b3%d0%b8%d0%bd%d0%b3-pdo-%d0%b7%d0%b0%d0%bf%d1%80%d0%be%d1%81%d0%be%d0%b2/#comments</comments>
		<pubDate>Mon, 18 Jan 2010 09:19:45 +0000</pubDate>
		<dc:creator>bullgare</dc:creator>
				<category><![CDATA[Базы данных]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[debug]]></category>
		<category><![CDATA[PDO]]></category>

		<guid isPermaLink="false">http://www.job-blog.bullgare.ru/?p=610</guid>
		<description><![CDATA[Как отдебажить SQL-запрос, сотворённый через PDO &#8211; нашёл скриптик, который представляет собой обёртку над PDO &#8211; PDOTester. Собственно код: &#60;?php class PDOTester extends PDO { public function __construct($dsn, $username = null, $password = null, $driver_options = array()) { parent::__construct($dsn, $username, $password, $driver_options); $this->setAttribute(PDO::ATTR_STATEMENT_CLASS, array('PDOStatementTester', array($this))); } } class PDOStatementTester extends PDOStatement { const NO_MAX_LENGTH = [...]]]></description>
			<content:encoded><![CDATA[<p>Как отдебажить SQL-запрос, сотворённый через PDO &#8211; нашёл <a href="http://daveyshafik.com/archives/605-debugging-pdo-prepared-statements.html">скриптик</a>, который представляет собой обёртку над PDO &#8211; PDOTester.<br />
<span id="more-610"></span><br />
Собственно код:</p>
<pre class="code">
&lt;?php
class PDOTester extends PDO {
	public function __construct($dsn, $username = null, $password = null, $driver_options = array())
	{
		parent::__construct($dsn, $username, $password, $driver_options);
		$this->setAttribute(PDO::ATTR_STATEMENT_CLASS, array('PDOStatementTester', array($this)));
	}
}

class PDOStatementTester extends PDOStatement {
	const NO_MAX_LENGTH = -1;

	protected $connection;
	protected $bound_params = array();

	protected function __construct(PDO $connection)
	{
		$this->connection = $connection;
	}

	public function bindParam($paramno, &#038;$param, $type = PDO::PARAM_STR, $maxlen = null, $driverdata = null)
	{
		$this->bound_params[$paramno] = array(
			'value' => &#038;$param,
			'type' => $type,
			'maxlen' => (is_null($maxlen)) ? self::NO_MAX_LENGTH : $maxlen,
			// ignore driver data
		);

		$result = parent::bindParam($paramno, $param, $type, $maxlen, $driverdata);
	}

	public function bindValue($parameter, $value, $data_type = PDO::PARAM_STR)
	{
		$this->bound_params[$parameter] = array(
			'value' => $value,
			'type' => $data_type,
			'maxlen' => self::NO_MAX_LENGTH
		);
		parent::bindValue($parameter, $value, $data_type);
	}

	public function getSQL($values = array())
	{
		$sql = $this->queryString;

		if (sizeof($values) > 0) {
			foreach ($values as $key => $value) {
				$sql = str_replace($key, $this->connection->quote($value), $sql);
			}
		}

		if (sizeof($this->bound_params)) {
			foreach ($this->bound_params as $key => $param) {
				$value = $param['value'];
				if (!is_null($param['type'])) {
					$value = self::cast($value, $param['type']);
				}
				if ($param['maxlen'] &#038;&#038; $param['maxlen'] != self::NO_MAX_LENGTH) {
					$value = self::truncate($value, $param['maxlen']);
				}
				if (!is_null($value)) {
					$sql = str_replace($key, $this->connection->quote($value), $sql);
				} else {
					$sql = str_replace($key, 'NULL', $sql);
				}
			}
		}
		return $sql;
	}

	static protected function cast($value, $type)
	{
		switch ($type) {
			case PDO::PARAM_BOOL:
				return (bool) $value;
				break;
			case PDO::PARAM_NULL:
				return null;
				break;
			case PDO::PARAM_INT:
				return (int) $value;
			case PDO::PARAM_STR:
			default:
				return $value;
		}
	}

	static protected function truncate($value, $length)
	{
		return substr($value, 0, $length);
	}
}

$pdo = new PDOTester('sqlite::memory:');
$pdo->query('CREATE TABLE foo (bar TEXT, baz TEXT, num NUMERIC, empty TEXT)');
$query = $pdo->prepare('SELECT * FROM foo WHERE bar = :bar AND baz = :baz');

// Test with passed in array
echo $query->getSQL(array(':bar' => 'foo', ':baz' => 'bat')) . PHP_EOL;

$query = $pdo->prepare('SELECT * FROM foo WHERE bar = :bar AND baz = :baz AND num = :num AND empty=:empty');

// Test with bound params and values
$bar = 'bar';
$baz = 'baz';
$num = '0.1';
$empty = 'empty!!';

// Bind Param
$query->bindParam(':bar', $bar);

// Bind Value
$query->bindValue(':baz', $baz);

// Bind With types
$query->bindParam(':num', $num, PDO::PARAM_INT);
$query->bindParam(':empty', $empty, PDO::PARAM_NULL);

echo $query->getSQL() . PHP_EOL;

// Change the vars
$bar = 'foo';
$baz = 'bat';
$num = '2.6';
$empty = 'blah!';

echo $query->getSQL() . PHP_EOL;

// Bind with length
$query->bindParam(':bar', $bar, PDO::PARAM_STR, 2);

echo $query->getSQL() . PHP_EOL;
?&gt;
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.job-blog.bullgare.ru/2010/01/%d0%b4%d0%b5%d0%b1%d0%b0%d0%b3%d0%b3%d0%b8%d0%bd%d0%b3-pdo-%d0%b7%d0%b0%d0%bf%d1%80%d0%be%d1%81%d0%be%d0%b2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>FirePHP. Начало;)</title>
		<link>http://www.job-blog.bullgare.ru/2009/12/firephp-%d0%bd%d0%b0%d1%87%d0%b0%d0%bb%d0%be/</link>
		<comments>http://www.job-blog.bullgare.ru/2009/12/firephp-%d0%bd%d0%b0%d1%87%d0%b0%d0%bb%d0%be/#comments</comments>
		<pubDate>Thu, 17 Dec 2009 12:23:34 +0000</pubDate>
		<dc:creator>bullgare</dc:creator>
				<category><![CDATA[Программирование]]></category>
		<category><![CDATA[debug]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[отладка]]></category>

		<guid isPermaLink="false">http://www.job-blog.bullgare.ru/?p=517</guid>
		<description><![CDATA[На офсайте нажимаем на &#171;Get FirePHP&#187;. Далее скачиваем серверную часть. Потом её каким-нибудь образом встраиваем в проект. К примеру (коллега такое сделал): public static function fb() { if (!ob_get_level()) { ob_start(); } $instance = FirePHP::getInstance( true ); $args = func_get_args(); return call_user_func_array( array( $instance, 'fb' ), $args ); } Собственно всё &#8211; после этого в [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.firephp.org/">На офсайте</a> нажимаем на &laquo;Get FirePHP&raquo;.<br />
Далее <a href="http://www.firephp.org/HQ/Install.htm">скачиваем серверную часть</a>.<br />
Потом её каким-нибудь образом встраиваем в проект. К примеру (коллега такое сделал):</p>
<pre class="code">
	public static function fb()
	{
		if (!ob_get_level()) {
			ob_start();
		}

		$instance = FirePHP::getInstance( true );

		$args = func_get_args();
		return call_user_func_array( array( $instance, 'fb' ), $args );
	}
</pre>
<p>Собственно всё &#8211; после этого в консоли будет удобный вывод всяких массивов и т.п. (например, при обращении к <>::fb( array(1,2,3) ) )</p>
]]></content:encoded>
			<wfw:commentRss>http://www.job-blog.bullgare.ru/2009/12/firephp-%d0%bd%d0%b0%d1%87%d0%b0%d0%bb%d0%be/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ещё один инструмент дебага (поиска и устранения ошибок) php-проекта</title>
		<link>http://www.job-blog.bullgare.ru/2009/11/%d0%b5%d1%89%d1%91-%d0%be%d0%b4%d0%b8%d0%bd-%d0%bc%d0%b5%d1%82%d0%be%d0%b4-%d0%b4%d0%b5%d0%b1%d0%b0%d0%b3%d0%b0-%d0%bf%d0%be%d0%b8%d1%81%d0%ba%d0%b0-%d0%b8-%d1%83%d1%81%d1%82%d1%80%d0%b0%d0%bd%d0%b5/</link>
		<comments>http://www.job-blog.bullgare.ru/2009/11/%d0%b5%d1%89%d1%91-%d0%be%d0%b4%d0%b8%d0%bd-%d0%bc%d0%b5%d1%82%d0%be%d0%b4-%d0%b4%d0%b5%d0%b1%d0%b0%d0%b3%d0%b0-%d0%bf%d0%be%d0%b8%d1%81%d0%ba%d0%b0-%d0%b8-%d1%83%d1%81%d1%82%d1%80%d0%b0%d0%bd%d0%b5/#comments</comments>
		<pubDate>Thu, 12 Nov 2009 11:13:25 +0000</pubDate>
		<dc:creator>bullgare</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[debug]]></category>
		<category><![CDATA[TestMailServerTool]]></category>

		<guid isPermaLink="false">http://www.job-blog.bullgare.ru/?p=500</guid>
		<description><![CDATA[Бывает, что в проекте при возникновении ошибки формируется и отправляется e-mail при помощи обычного php-шного mail(). При этом хочется получать это сообщение при разработке на своей локальной машине с Windows. Вот программа под названием &#171;Test Mail Server Tool&#187;: TestMailServerToolSetup. Её нужно запустить, после чего все мэйлы будут перенаправляться на программу отправки мэйлов (к примеру, Thunderbird). [...]]]></description>
			<content:encoded><![CDATA[<p>Бывает, что в проекте при возникновении ошибки формируется и отправляется e-mail при помощи обычного php-шного mail().<br />
При этом хочется получать это сообщение при разработке на своей локальной машине с Windows.<br />
Вот программа под названием &laquo;Test Mail Server Tool&raquo;:<br />
<a href='http://www.job-blog.bullgare.ru/wp-content/uploads/2009/11/TestMailServerToolSetup.exe'>TestMailServerToolSetup</a>.<br />
Её нужно запустить, после чего все мэйлы будут перенаправляться на программу отправки мэйлов (к примеру, Thunderbird).</p>
<p><a href="http://habrahabr.ru/blogs/linux/49665/">Вот статья о том, как настроить Sendmail-заглушку для Linux</a>. Всё сводится к скрипту</p>
<pre class="code">
#!/bin/sh
prefix="/var/mail/sendmail/new"
numPath="/var/mail/sendmail"

if [ ! -f $numPath/num ]; then
echo "0" > $numPath/num
fi
num=`cat $numPath/num`
num=$(($num + 1))
echo $num > $numPath/num 

name="$prefix/letter_$num.txt"
while read line
do
echo $line >> $name
done
chmod 777 $name
/bin/true
</pre>
<p>и прописыванию в <strong>php.ini</strong> <em><strong>sendmail_path = /usr/bin/fake_sendmail.sh.</strong></em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.job-blog.bullgare.ru/2009/11/%d0%b5%d1%89%d1%91-%d0%be%d0%b4%d0%b8%d0%bd-%d0%bc%d0%b5%d1%82%d0%be%d0%b4-%d0%b4%d0%b5%d0%b1%d0%b0%d0%b3%d0%b0-%d0%bf%d0%be%d0%b8%d1%81%d0%ba%d0%b0-%d0%b8-%d1%83%d1%81%d1%82%d1%80%d0%b0%d0%bd%d0%b5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Профилирование php-проекта: Xdebug</title>
		<link>http://www.job-blog.bullgare.ru/2009/09/%d0%bf%d1%80%d0%be%d1%84%d0%b8%d0%bb%d0%b8%d1%80%d0%be%d0%b2%d0%b0%d0%bd%d0%b8%d0%b5-php-%d0%bf%d1%80%d0%be%d0%b5%d0%ba%d1%82%d0%b0-xdebug/</link>
		<comments>http://www.job-blog.bullgare.ru/2009/09/%d0%bf%d1%80%d0%be%d1%84%d0%b8%d0%bb%d0%b8%d1%80%d0%be%d0%b2%d0%b0%d0%bd%d0%b8%d0%b5-php-%d0%bf%d1%80%d0%be%d0%b5%d0%ba%d1%82%d0%b0-xdebug/#comments</comments>
		<pubDate>Fri, 18 Sep 2009 11:47:45 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[серверная оптимизация]]></category>
		<category><![CDATA[bottle-neck]]></category>
		<category><![CDATA[debug]]></category>
		<category><![CDATA[xdebug]]></category>
		<category><![CDATA[бутылочное горлышко]]></category>
		<category><![CDATA[отладка]]></category>
		<category><![CDATA[профилирование]]></category>

		<guid isPermaLink="false">http://www.job-blog.bullgare.ru/?p=240</guid>
		<description><![CDATA[Установка Скачать После помещения библиотеки в папку с расширениями в php.ini надо написать zend_extension = \ext\php_xdebug.dll Далее ставим плагин для firefox &#8211; Xdebug Helper, настройка всего инструментария &#8211; в базе знаний Google Работа с Xdebug под Eclipse ещё про установку и настройку xdebug, Профилирование с Xdebug на habrahabr. Самое основное &#8211; параметр в php.ini xdebug.profiler_enable_trigger=On [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.xdebug.org/docs/install">Установка</a><br />
<a href="http://www.xdebug.org/download.php">Скачать</a><br />
После помещения библиотеки в папку с расширениями в <em>php.ini</em> надо написать</p>
<pre class="code">
zend_extension = <путь-к-php>\ext\php_xdebug.dll
</pre>
<p>Далее ставим плагин для firefox &#8211; <a href="https://addons.mozilla.org/ru/firefox/addon/3960">Xdebug Helper</a>, настройка всего инструментария &#8211; <a href="http://code.google.com/p/syslogr-utils/wiki/XdebugHelper">в базе знаний Google</a><br />
<a href="http://www.phpeclipse.com/wiki/Howto/XDebugAndPHPEclipse">Работа с Xdebug под Eclipse</a><br />
ещё про установку и <a href="http://www.ibm.com/developerworks/ru/library/os-php-xdebug/index.html">настройку xdebug</a>,<br />
<a href="http://habrahabr.ru/blogs/php/31468/">Профилирование с Xdebug на habrahabr</a>.<br />
Самое основное &#8211; параметр в php.ini</p>
<pre class="code">
xdebug.profiler_enable_trigger=On
</pre>
<p>В итоге у меня получилось (php5.3)</p>
<pre class="code">
zend_extension = путь-к-php53\ext\php_xdebug.dll
xdebug.remote_enable=1
xdebug.remote_handler=dbgp
xdebug.remote_mode=req
xdebug.remote_port=9000
xdebug.remote_host=localhost
xdebug.idekey=default

;xdebug.dump_once = On
;xdebug.dump_globals = On
;xdebug.dump_undefined = On
;xdebug.dump.REQUEST = *
;xdebug.dump.SERVER = REQUEST_METHOD,REQUEST_URI,HTTP_USER_AGENT

xdebug.profiler_enable=Off
xdebug.profiler_output_dir="c:\traces"
xdebug.profiler_enable_trigger=On
xdebug.profiler_output_name = cachegrind.out.%t.%p
</pre>
<p>Теперь достаточно передать в GET-параметре <em>?XDEBUG_PROFILE</em> (вот как раз тут полезен XdebugHelper &#8211; там это можно включить для определённого сайта).<br />
<a href="http://tigor.com.ua/blog/2008/07/21/php-profiler-debugger-xdebug/">много ссылок на полезные статьи</a>.<br />
<a href="http://code.google.com/p/webgrind/">Инструмент для анализа логов Xdebug</a> от создателя.</p>
<p><a href="http://forums.netbeans.org/post-9585.html"><strong>Дебаг проекта</strong> через NetBeans совместно с XdebugHelper</a>:<br />
запустить отладчик в NetBeans и затем нажать кнопку &laquo;run&raquo; (это NetBeans заставит слушать Xdebug), а затем открыть сайт с активированным на нём XdebugHelper&#8217;ом.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.job-blog.bullgare.ru/2009/09/%d0%bf%d1%80%d0%be%d1%84%d0%b8%d0%bb%d0%b8%d1%80%d0%be%d0%b2%d0%b0%d0%bd%d0%b8%d0%b5-php-%d0%bf%d1%80%d0%be%d0%b5%d0%ba%d1%82%d0%b0-xdebug/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

