<?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; SQL</title>
	<atom:link href="http://www.charnad.com/blog/category/programming/sql-programming/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.charnad.com</link>
	<description>Блог-центр им. CharnaD</description>
	<lastBuildDate>Wed, 18 Jan 2012 14:52:50 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Пара советов по SQLite</title>
		<link>http://www.charnad.com/blog/para-sovetov-po-sqlite/</link>
		<comments>http://www.charnad.com/blog/para-sovetov-po-sqlite/#comments</comments>
		<pubDate>Fri, 29 Jan 2010 17:16:12 +0000</pubDate>
		<dc:creator>CharnaD</dc:creator>
				<category><![CDATA[SQL]]></category>
		<category><![CDATA[sqlite]]></category>

		<guid isPermaLink="false">http://www.charnad.com/?p=926</guid>
		<description><![CDATA[Если у вас возникают ошибки при работе с SQLite, то вот у меня пара решений. Если у вас ошибка "Unable to open database file" и при этом база читается, даже если вы дали права файлу БД 0777, то вам еще надо дать права на запись папке, в которой лежит файл. Дело в том, что при [...]]]></description>
			<content:encoded><![CDATA[<p>Если у вас возникают ошибки при работе с SQLite, то вот у меня пара решений. </p>
<p>Если у вас ошибка "Unable to open database file" и при этом база читается, даже если вы дали права файлу БД 0777, то вам еще надо дать права на запись папке, в которой лежит файл. Дело в том, что при открытии транзакции пишется файл dbfilename-journal. Так же под Windows эта проблема может означать наличие кириллических символов в пути к базе.</p>
<p>Если вы по привычке написали ON DUPLICATE KEY UPDATE ..., и не понимаете в чем ошибка - обратитесь к <a href="http://www.sqlite.org/lang_insert.html">официальному мануалу</a> и просто измените INSERT на REPLACE, а "ON DUPLICATE..." сотрите.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.charnad.com/blog/para-sovetov-po-sqlite/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ошибка PDO Invalid Argument и Unix socket</title>
		<link>http://www.charnad.com/blog/oshibka-pdo-invalid-argument-unix/</link>
		<comments>http://www.charnad.com/blog/oshibka-pdo-invalid-argument-unix/#comments</comments>
		<pubDate>Thu, 21 Jan 2010 14:56:32 +0000</pubDate>
		<dc:creator>CharnaD</dc:creator>
				<category><![CDATA[*nix]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[pdo]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.charnad.com/?p=910</guid>
		<description><![CDATA[Такая ошибка возникла у меня после перехода на PHP 5.3. Решение я нашел на http://stackoverflow.com, можете там посмотреть, чтобы узнать про эту ошибку более подробно. Выглядит она вот так: Warning: PDO::__construct&#40;&#41; &#91;pdo.--construct&#93;: &#91;2002&#93; Invalid argument &#40;trying to connect via unix://&#41; in /home/blah-blah-blah.php on line 9 &#160; Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000] [2002] [...]]]></description>
			<content:encoded><![CDATA[<p><img class="oppic" style="float:left;" src="http://www.charnad.com/blog/wp-content/uploads/pictures/php.gif" alt=""/></p>
<p>Такая ошибка возникла у меня после перехода на PHP 5.3. Решение я нашел на http://stackoverflow.com, можете там посмотреть, чтобы узнать про эту ошибку более подробно. Выглядит она вот так:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">Warning: PDO::__construct<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span>pdo.--construct<span style="color: #7a0874; font-weight: bold;">&#93;</span>: <span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">2002</span><span style="color: #7a0874; font-weight: bold;">&#93;</span> Invalid argument <span style="color: #7a0874; font-weight: bold;">&#40;</span>trying to connect 
via unix:<span style="color: #000000; font-weight: bold;">//</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #000000; font-weight: bold;">in</span> <span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/</span>blah-blah-blah.php on line <span style="color: #000000;">9</span>
&nbsp;
Fatal error: Uncaught exception <span style="color: #ff0000;">'PDOException'</span> with message <span style="color: #ff0000;">'SQLSTATE[HY000] [2002]
Invalid argument'</span> <span style="color: #000000; font-weight: bold;">in</span> <span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/</span>blah-blah-blah.php:<span style="color: #000000;">9</span> Stack trace: <span style="color: #666666; font-style: italic;">#0</span>
<span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/</span>blah-blah-blah.php<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000;">9</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>: PDO-<span style="color: #000000; font-weight: bold;">&gt;</span>__construct<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #ff0000;">'mysql:host=localhost;dbname=db'</span>, <span style="color: #ff0000;">'USER'</span>, 
<span style="color: #ff0000;">'PASSWORD'</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #666666; font-style: italic;">#1 {main} thrown in /home/blah-blah-blah.php on line 9</span></pre></div></div>

<p>Решается она так: вместо localhost, при написании DSN для PDO пишите 127.0.0.1. А так же стоит указать путь к сокету MySQL в php.ini: pdo_mysql.default_socket=/var/run/mysqld/mysql.sock</p>
]]></content:encoded>
			<wfw:commentRss>http://www.charnad.com/blog/oshibka-pdo-invalid-argument-unix/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Массовый UPDATE в MySQL</title>
		<link>http://www.charnad.com/blog/massovyj-update-v-mysql/</link>
		<comments>http://www.charnad.com/blog/massovyj-update-v-mysql/#comments</comments>
		<pubDate>Mon, 30 Nov 2009 21:22:18 +0000</pubDate>
		<dc:creator>CharnaD</dc:creator>
				<category><![CDATA[SQL]]></category>
		<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://www.charnad.com/?p=841</guid>
		<description><![CDATA[Если вы хотите делать массовый апдейт в MySQL, то я могу вам предложить вот такой рецепт. Сначала вы создаете временную таблицу, циклом собираете массовый INSERT запрос и потом вставляете данные из временной таблицы в нужную. Выглядеть это может, например, так: CREATE TEMPORARY TABLE ids &#40;VALUE INT, url VARCHAR&#40;255&#41;&#41;; INSERT INTO ids VALUES &#40;0, 'http://url1.ru'&#41;, &#40;0, [...]]]></description>
			<content:encoded><![CDATA[<p><img class="oppic" src="http://www.charnad.com/blog/wp-content/uploads/pictures/mysql_logo.png" alt=""/>
<p>Если вы хотите делать массовый апдейт в MySQL, то я могу вам предложить вот такой рецепт. Сначала вы создаете временную таблицу, циклом собираете массовый INSERT запрос и потом вставляете данные из временной таблицы в нужную. Выглядеть это может, например, так:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">TEMPORARY</span> <span style="color: #993333; font-weight: bold;">TABLE</span> ids <span style="color: #66cc66;">&#40;</span><span style="color: #993333; font-weight: bold;">VALUE</span> <span style="color: #993333; font-weight: bold;">INT</span><span style="color: #66cc66;">,</span> url <span style="color: #993333; font-weight: bold;">VARCHAR</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">255</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> ids <span style="color: #993333; font-weight: bold;">VALUES</span> 
    <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">0</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'http://url1.ru'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
    <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">0</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'http://url2.ru'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
    <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">0</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'http://url3.ru'</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">UPDATE</span> blogs<span style="color: #66cc66;">,</span> ids <span style="color: #993333; font-weight: bold;">SET</span> my_value <span style="color: #66cc66;">=</span> ids<span style="color: #66cc66;">.</span><span style="color: #993333; font-weight: bold;">VALUE</span> <span style="color: #993333; font-weight: bold;">WHERE</span> blogs<span style="color: #66cc66;">.</span>url <span style="color: #66cc66;">=</span> ids<span style="color: #66cc66;">.</span>url;</pre></div></div>

<p>Поясню. Допустим, мне понадобилось обновить некое значение в таблице в соответствии с URL. Скажем, статистику интернет-магазинов. Я создал временную таблицу из тех значений, по котороым будет вестись поиск, и значений, которые я буду вставлять в нужную мне таблицу. Дальше, идет INSERT сразу нескольких строк. Его очень просто собирать в цикле из массива. Например вот так:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$elements</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$aray</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$url</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$value</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$elements</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'('</span><span style="color: #339933;">.</span><span style="color: #000088;">$db</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">escape</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$value</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">', '</span><span style="color: #339933;">.</span><span style="color: #000088;">$db</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">escape</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$url</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">')'</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000088;">$insert_string</span> <span style="color: #339933;">=</span> <span style="color: #990000;">implode</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">','</span><span style="color: #339933;">,</span> <span style="color: #000088;">$elements</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>После чего, собственно апдейт со вставкой. Временная таблица исчезнет после окончания сессии БД. На то она и временная.</p></p>
]]></content:encoded>
			<wfw:commentRss>http://www.charnad.com/blog/massovyj-update-v-mysql/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Symfony: человеческое расположение админки</title>
		<link>http://www.charnad.com/blog/symfony-chelovecheskoe-raspolojenie-adminki/</link>
		<comments>http://www.charnad.com/blog/symfony-chelovecheskoe-raspolojenie-adminki/#comments</comments>
		<pubDate>Sun, 22 Feb 2009 23:00:45 +0000</pubDate>
		<dc:creator>CharnaD</dc:creator>
				<category><![CDATA[SQL]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[symfony]]></category>

		<guid isPermaLink="false">http://www.charnad.com/?p=381</guid>
		<description><![CDATA[Тем, кто изучает симфони известно, что админку часто делают через "generate:app backend". То есть мы создаем приложение внутри нашего проекта. Это прекрасно, но есть одно НО. Чтобы нам зайти в админку требуется писать http://project/backend.php/some-admin-pages. Можно конечно обьяснять заказчикам, что мол понимаете, это другое приложение внутри проекта, другой фронт-контроллер, так надо. Но лучше сделать иначе. Скажу [...]]]></description>
			<content:encoded><![CDATA[<p><img style="margin-right: 10px;" src="http://www.charnad.com/blog/wp-content/uploads/pictures/symfony_logo.gif" alt="" align="left" /></p>
<p>Тем, кто изучает симфони известно, что админку часто делают через "generate:app backend". То есть мы создаем приложение внутри нашего проекта. Это прекрасно, но есть одно НО. Чтобы нам зайти в админку требуется писать http://project/backend.php/some-admin-pages. Можно конечно обьяснять заказчикам, что мол понимаете, это другое приложение внутри проекта, другой фронт-контроллер, так надо. Но лучше сделать иначе. Скажу сразу, этот метод взят с официального форума симфони. Но найти его проблематично.</p>
<p>Метод таков:</p>
<ol>
<li>Создаем папку "admin" внутри папки "web". Копируем туда .htaccess из той же "web", и заменяем<br />
RewriteRule ^(.*)$ index.php [QSA,L]<br />
на<br />
RewriteRule ^(.*)$ ../backend.php [QSA,L]
</li>
<li>Идем в настройки роутинга для backend (app/backend/config/routing.yml) и добавляем папку /admin/ ко всем роутам. Например:
<p># default rules<br />
homepage:<br />
  url: /admin/<br />
  param: { module: default, action: index }
</li>
<li>Меняем no_script_name на "on" в настройках backend (app/backend/config/settings.yml):<br />
prod:<br />
.settings:<br />
no_script_name: on
</li>
<li>Чистим кеш и заходим в папку: http://project/admin/ без проблем.</li>
]]></content:encoded>
			<wfw:commentRss>http://www.charnad.com/blog/symfony-chelovecheskoe-raspolojenie-adminki/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Тормозной SQLite? Совсем нет!</title>
		<link>http://www.charnad.com/blog/tormoznoi-sqlite-sovsem-net/</link>
		<comments>http://www.charnad.com/blog/tormoznoi-sqlite-sovsem-net/#comments</comments>
		<pubDate>Wed, 12 Nov 2008 14:36:16 +0000</pubDate>
		<dc:creator>CharnaD</dc:creator>
				<category><![CDATA[SQL]]></category>
		<category><![CDATA[sqlite]]></category>
		<category><![CDATA[тесты]]></category>

		<guid isPermaLink="false">http://www.charnad.com/blog/?p=64</guid>
		<description><![CDATA[Эта статья была запощена на хабрахабр до появления этого блога. А теперь она обрела свой дом. Как-то заинтересовавшись SQLite я решил проверить, а не будет ли оно быстрее MySQL, или хотя бы равным по скорости. Я исходил из того, что SQLite скорее всего будет удобна для мелких таблиц, типа простых счетчиков посещений. Поэтому провел тесты [...]]]></description>
			<content:encoded><![CDATA[<p>Эта статья была запощена на хабрахабр до появления этого блога. А теперь она обрела свой дом.</p>
<p>Как-то заинтересовавшись SQLite я решил проверить, а не будет ли оно быстрее MySQL, или хотя бы равным по скорости.<span id="more-64"></span></p>
<p>Я исходил из того, что SQLite скорее всего будет удобна для мелких таблиц, типа простых счетчиков посещений.<br />
Поэтому провел тесты следующим способом: я пять раз мерял время по 100 циклов обновления записи в базе и пять раз по 100 чтения.</p>
<p>Код <a href="http://www.charnad.com/stuff/test.txt">тут</a>.</p>
<p>Итак, в <a href="http://phpclub.ru/detail/article/sqlight_intro">статье</a> убеждали: "В последнее время, вы, возможно, слышали о новом расширении для PHP: SQLite. Есть много причин, по которым SQLite может показаться лучшим достижением с тех пор, как научились резать хлеб. SQLite предлагает добротный SQL интерфейс к нерелятивистской базе данных и создаёт элегантную альтернативу громоздким интерфейсам других баз данных без потери функциональности или скорости, как можно было бы ожидать.".</p>
<p>Смотрим что же получилось по тестам…<br />
SQLite                    MySQL<br />
Запись<br />
0.45911908149719	0.031841039657593<br />
0.46412396430969	0.031555891036987<br />
0.49027895927429	0.029323101043701<br />
0.46884489059448	0.029382944107056<br />
0.50253915786743	0.028644800186157<br />
Среднее<br />
0.47698121070862	0.030149555206299</p>
<p>Чтение<br />
0.026177883148193	0.060520172119141<br />
0.026360988616943	0.059216022491455<br />
0.026273012161255	0.062637090682983<br />
0.026113986968994	0.062775135040283<br />
0.026944160461426	0.062674045562744<br />
Среднее<br />
0.026374006271362	0.061564493179321</p>
<p>Удивительный провал на запись и преимущество в чтении. Однако спасибо <a href="http://ptalus.habrahabr.ru/">ptalus</a> , который пролил свет на это дело. В <a href="http://www.sqlite.org/speed.html">мануале</a> написано, что для каждой записи файл открывается-закрывается, что и влечет за собой такую тормознутость, однако стоит добавить</p>
<p>sqlite_query($dbhandle, 'BEGIN;');<br />
sqlite_query($dbhandle, 'COMMIT;');</p>
<p>вокруг запроса и время записи просто магически меняется.</p>
<p>Запись:<br />
0.014724016189575<br />
0.014418125152588<br />
0.015676975250244<br />
0.014610052108765<br />
0.014219999313354<br />
Среднее:<br />
0.014729833602905</p>
]]></content:encoded>
			<wfw:commentRss>http://www.charnad.com/blog/tormoznoi-sqlite-sovsem-net/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

