ZendFramework::Zend_Debug

var_dumpそのままだと思って使ったら15分ぐらい迷った。

Zend_Debug::dump($var, $label=null, $echo=true);

$varにデバッグしたい変数、$labelが$varの前に表示させたいやつを、で、$echoがfalseならechoされないでreturnで返すだけ。

普通に変数渡せばいいだろうと思って

$a = array(
	'hoge1',
	'hoge2',
	10
);

Zend_Debug::dump($a);

って書いたら

 <pre>
<b>array</b>
  0 <font color='#888a85'>=&gt;</font> <small>string</small> <font color='#cc0000'>'hoge1'</font> <i>(length=5)</i>
  1 <font color='#888a85'>=&gt;</font> <small>string</small> <font color='#cc0000'>'hoge2'</font> <i>(length=5)</i>
  2 <font color='#888a85'>=&gt;</font> <small>int</small> <font color='#4e9a06'>10</font>
</pre>

htmlがそのまま表示されちまフ。

ソース見るとhtmlspecialcharsでエスケープされてる。

$a = array(
	'hoge1',
	'hoge2',
	10
	);

$b = htmlspe Zend_Debug::dump($a, '', false);

echo htmlspecialchars_decode($b);

デコードすればいいけど、普通にvar_dumpでいいような。
dumpの前に

Zend_Debug::setSapi('cli');

ってやればエスケープされないけど、Sapiってなんだ。なんだSapiって。

ZendDebuggerとXdebugの続き

動いた。

これの続き。
>> Eclipse(PDT)のデバッグにはZendDebuggerで、ブラウザでのデバッグにはXdebugを使いたいのに。

ただ単にphp.ini分ければ良かった。あほか

Zend Studio for Eclipseの中
(/Applications/Zend/Zend Studio for Eclipse - 6.0.0/plugins/org.zend.php.debug.debugger.macosx_5.2.12.v20071210/resources/php5)
にも、php-cgiとかphp.iniがあって最初にこっちを弄ったけど無理だった。

sudo cp /opt/local/etc/php.ini /opt/local/etc/php.ini.debug

とかやって、xdebugの記述だけ削ったやつを指定すればおk

zend studio for eclipse

よかった。

つか、php.iniでPDOの設定しないといけないのはwindowsだけなのかな。
ここでつまずいてたわけじゃないけど。
windowsしばらく使ってないのでよくわからんけど。

Eclipse(PDT)のデバッグにはZendDebuggerで、ブラウザでのデバッグにはXdebugを使いたいのに。

結論から言うと、やり方ワカンネ。

ZendDebuggerにはXdebugの ↓ こういうふうにブラウザに表示される機能はないんですか。

Xdebug

Xdebugなしのデフォルトだと
default

こんな状態で、Xdebugのほうがずっとわかりやすい。

で、PDTだとデバッグするときにphpの実行ファイル(? /opt/local/lib/php みたいなやつ)とphp.iniを指定しないといけないけどphp.iniに
ZendDebuggerとXdebugの両方を指定すると

[Xdebug]
; Xdebug
zend_extension=/opt/local/lib/debugger/xdebug.so
xdebug.remote_enable=1
xdebug.remote_handler="dbgp"
xdebug.remote_mode=req
xdebug.remote_host="localhost"
xdebug.remote_port=9000
xdebug.remote_log="/Users/wozozo/xdebug.log"
xdebug.manual_url = http://jp2.php.net
xdebug.collect_params = On
xdebug.dump.GET = *
xdebug.dump.POST = *

[Zend]
; Zend Debugger
zend_extension=/opt/local/lib/debugger/ZendDebugger.so
zend_debugger.allow_hosts= 127.0.0.1/32, 192.168.1.0/255
zend_debugger.expose_remotely=always
zend_debugger.expose_remotely=allowed_hosts

デバッグ時にエラーが出てZendDebuggerは使えない。
両方記述してもブラウザでのXdebugはちゃんと動く。

Zend Studio for Eclipseだとデフォルトのphpの設定はZendStudio内のphpが指定されていて、php.iniはいらない。
これだとphp.iniは関係ないのでZendDebuggerでのデバッグ自体はできる。

でもこの状態だと本来php.iniで設定しないと使えないPDOとかが使えない。
よって、ZendFrameworkのZend_Dbのデバッグができない。

結局php.iniを指定することになるけど、両方記述するとやっぱり動かないのでXdebugが使えない。

ZendDebuggerには ↓ こういうのないの・・
Xdebug

Zend Studio for EclipseはXdebug使えないし。

デフォルトのエラー文でも内容わかるけど、Xdebugを知るとやっぱり使いたくなる。

※追記
動いた
http://blog.wozozo.org/archives/87

ZendFramework::Zend_Db(2)

プレースホルダを利用する

try {

	$dbConfig = new Zend_Config_Int('Config/config.ini', 'database');
	$db = Zend_Db::factory($dbConfig);

	$stt = $db->prepare('INSERT INTO Book(isbn, title, price, publish, pulished) VALUES(:isbn, :title, :price, :pulish, :published)');

	$stt->bindParam(':isbn', $_POST['isbn']);
	$stt->bindParam(':title', $_POST['title']);
	$stt->bindParam(':price', $_POST['price']);
	$stt->bindParam(':publish', $_POST['publish']);
	$stt->bindParam(':published', $_POST['published']);
	※今はセキュリティとかなしで

	$stt->execute();

} catch (Zend_Exception $e) {
	die($e->getMessage());
}

bindParamの代わりに

$stt->execute(array(':isbn' => $_POST['isbn'], ...));

でもいい。

$arr = array(
	':isbn' => '0123456789',
	':title' => 'php book',
	':price' => '980'
	...
	...
);

$stt->execute($arr);

これも一緒。

bindValue()とbindParam()があるけど、ソースを見ると

public function bindValue($parameter, $value, $type = null)
{
    return $this->bindParam($parameter, $value);
}

とかなってて必要なのかよくわからない

ZendFramework::Zend_Db(1)

接続


require_once 'Zend/Db.php';

$db = new Zend_Db_Adapter_Pdo_Mysql(array(
	'host' => 'localhost',
	'username' => 'root',
	'password' => '',
	'dbname' => 'drill'
));

$select = $db->select('Address')
	->from(
		'Customers',
		array(
			'Address'
			)
		);

$db->query('set names utf8' );

$res =  $db->fetchAll($select);

set namesしないと文字化けった。

Zend_Config使うと、


require_once 'Zend/Config.php';
require_once 'Zend/Db.php';

$config = new Zend_Config(
    array(
        'database' => array(
            'adapter' => 'pdo_mysql',
            'params' => array(
		'host' => 'localhost',
                'dbname' => 'drill',
                'username' => 'root',
                'password' => ''
            )
        )
    )
);

$db = Zend_Db::factory($config->database);

とかやる。


require_once 'Zend/Db.php';

$params = array(
	'host' => 'localhost',
	'username' => 'root',
	'password' => '',
	'dbname' => 'drill'
	);

$db = Zend_Db::factory('pdo_mysql', $params);

こんなんでもいい。

ZendFramework的にはどれを使うべきなんだろう。

個人的にはZend_Configで別ファイルの設定を読み込むのがいい。上に書いてないけど。


echo $select->__toString();  // SELECT `Customers`.`Address` FROM `Customers`

とやると発行するクエリが表示される。