2012-02-24
久しぶりのデリー
インドに前回訪れたのは2009年1月のAhmadabadでした。デリーを訪れるのは何と、2005年7月以来の7年ぶり、ということになりました(これは自分のパソコンの記録を調べたのです)。
7年も経つとものすごく変わり、特にインドのような発展の激しい国はなおさらです。インディラ・ガンディー国際空港はターミナル・ビルがすっかり新しくなり、とてもインドの空港とは思えませんでした(失礼!)。また、空港からは高架のハイウェーもできていて、一般道も舗装がきっちりされていました。
何より驚いたのは、あれほど道をわが物顔に歩いたり寝そべったりしていたたくさんの牛が一匹もいないのです。信じられません。何でも条例が出来て、牛は郊外に追いやられた、とのことです。
インドと日本の時差は3.5時間という中途半端なので、時刻計算がめんどうです。現在は 8:00AMです。9:00AM - 11:30AMまで学会メイン・ホールで座長および講演演者です。それが終了してからチェンナイに飛びます。チェンナイは何と2003年7月以来の9年ぶりの訪問ということになります。
2012-02-22
すいすいとTAVI
TAVI本日は前回の一日三例と異なり、一例のみでした 順調に終了し、患者さんもお元気です。しかしながら、この新しい治療法を日本の患者さんのために根付かせる、という責務がありますので、責任は重いと思っています。
順調に、精神的にも落ち着いてできたのは、やはり術前に mysqliについて習得したからでしょう。
mysqliは、PHPのMySQLデータベース専用接続のCで書かれたコンポーネントです。MySQL専用なので、たとえば、データベースを SQL Serverや、Oracleに変更すれば、そのデータベース部分の PHPコードを書きなおす必要があります。
このデータベース毎の差異を吸収するレイヤーとして、PEAR::DBや PDOがあるのですが、PEAR::DBは PHPで書かれているので速度が遅いらいしのです(もっとも私が書き運用するシステムではそれほど速度はクリティカルではありませんので関係無いのですが・・・)。そしてPDOは PHP5.2.6以降でないと、文字コードを使用したSQL Injection攻撃が可能となるらしいのです。
それに何より、僕は無料のデータベースであるMySQLしか知らないし、今後ともそれ以外のデータベースを使用する予定もつもりもありません。という訳で、mysqliが一番良いのだ、とそのように結論したのです。
しかし、資料が少ない、ネット上にある説明はとても不十分、それで試行錯誤だったのです。
でもまあこれで何とか使えるでしょう。mysqliのprepare()文で place holder機能を使えば、それでもう SQL Injection攻撃は完璧に防げるのです。すばらしいですね。
これからTAVI1 - mysqliの使い方
やったね これからTAVIのため精神を鎮めています それで懸案のmysqliを用いたデータベース接続に苦労の末挑みました
CREATE TABLE `dr_tbl` ( `dr_id` INT( 11 ) NOT NULL AUTO_INCREMENT, `dr_name` VARCHAR( 128 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '', `email` VARCHAR( 128 ) NOT NULL DEFAULT '', CONSTRAINT `pk_dr_tbl` `PRIMARY KEY (`dr_id`) ) ENGINE = InnoDB CHARACTER SET utf8 COLLATE utf8_general_ci AUTO_INCREMENT=0;
としてデータベース作成します。
これに対してデータ入力と出力は
$mysqli = new mysqli($db_host, $db_user, $db_password, $db_name);
if (mysqli_connect_errno() {
printf("Cannot connect to database: ".mysqli_connect_error());
exit;
}
$mysqli->set_charset("UTF8"); // 文字コードをUTF-8にする
// データ入力
$stmt = mysqli->prepare("INSERT INTO `dr_tbl` (`dr_name`, `email`) VALUES (?, ?)");
$stmt->bind_param('ss', $dr_name, $email);
$dr_name = "齋藤 滋";
$email = "xxxx@yyyy.com";
$stmt->execute();
// これでデータがデータベースに書き込まれた
// 次に呼び出し
$query = "SELECT `dr_name`, `email` from `dr_tbl` WHERE `dr_id = ?";
$stmt = $mysqli->prepare($query);
$stmt->bind_param('i', $dr_id);
$dr_id = "1";
$stmt->execute();
$stmt->bind_result($dr_name, $email);
while ($stmt->fetch()) {
echo "名前は: ".$dr_name."<br />";
echo "メルアドは: ".$email."<br />";
}
// これで全て出力
$mysqli->close();
// 解放
これで良いのです もちろん他にも書き方はありますが・・・
2012-02-19
レンタル・サーバーにPEARをインストールする
この命題朝も書きましたが、その後複数のレンタル・サーバーでテストしました。
全てOKでした。
キモは
- 最新のXAMPPをローカルにスンストールする
- XAMPPフォルダの中のphpフォルダの中に最新のPEARフォルダある筈
- そのPEARフォルダをそのまま任意のサーバー・フォルダにuploadする
- その後はphp.iniを編集できるか? あるいは.htaccessファイルを編集できるか? それによって対応が異なります。
(1) php.iniを編集できる場合
これが一番簡単です
include_path = "/usr/home/****/html/***/PEAR"
のように、絶対パスでinclude_pathを指定します
(2) php.iniを編集できないが.htaccessを設置できる
php_value include_path "/usr/home/****/html/***/PEAR"
にようにやはり絶対パスで指定し、このファイルをhtmlのトップ・レベルにuploadします。そうすると、以下のフォルダ全てで反映されます
(3) これら何れもできない場合
この場合には
set_include_path(/usr/home/****/html/***/PEAR);
のように各phpファイルの先頭に記述するしかありりません。
しかしながら、これでPEARがレンタル・サーバーで使用できるようになります。同様に、Zend Frameworkなどもこの方法で使用できるようになります。
ずっと悩んでいたことが解決 - PEARのレンタル・サーバーへの設置
ずっとずっと分からないで悩んでいました それが今朝解決したのです。
それは、PHPのライブラリとして有名なPEARをどのようにしてレンタル・サーバーに導入すれば良いのか?でした。
PEARは全体で数千に及ぶプログラムの集団です。これらのプログラムには依存関係があり、その依存関係が崩れれば、用無しなのです。ですから、PEARのサイトに行っても、インストーラなどでのインストールが推奨されています。
でも、レンタル・サーバーにはそのような権限の委譲はありませんので、できないのです。
それでは、マニュアルでuploadすれば良いのですが、それでもさっきの依存関係でつまづきます。
ようやくやりました。
それは、発想を変え、ローカルにあるサーバー(XAMPP)の中のphpフォルダの中にあるPEARフォルダをそのままuploadしてしまえ、という発想でした。
それでphp programでは
set_include_path("/**/**/**");
というようにinclude_pathをセットすれば良い、というものです。
もちろん、.httaccessファィルを設定できるのであれば、その中でinclude_pathを設定すれば、それ以下のフォルダでいちいちこのコマンドを書かなくても良いので助かります。
みなさん、PEARで困っていたならばこの方法簡単で良いですよ。
2012-02-16
フーッ
PDOでラクチンDatabaseと思っていたら、何と文字化け!!!
それで以下のプログラムでテストしました
<?php try { $pdo = new PDO("mysql:host=$db_host; dbname=$db_name","$db_user", "$db_password"); $stmt = $pdo->query("SELECT * FROM dr_tbl"); while($row = $stmt->fetch(PDO::FETCH_ASSOC)){ echo implode(", ", $row) ."<br />"; } } catch (PDOException $e){ var_dump($e->getMessage()); } $pdo = null; // ここまでPDOでの処理 echo "***********************************************<br />"; // 以下はnative PHPでの処理 $link = mysql_connect($db_host, $db_user, $db_password); if ($link === NULL) { die("MySQL connection failed"); } mysql_select_db($db_name); $result = mysql_query('set character set utf8'); $sql = "SELECT * FROM `dr_tbl`;"; $result = mysql_query($sql); while($row = mysql_fetch_assoc($result)){ echo implode(", ", $row) ."<br />"; } ?>
そうすると、PDO部分では文字化け出力するのに、native部分では文字化けありません。
これはきっとUTF-8を改めてセットする必要があると考え調べると、ありましたね、やはり悩んだ方がおられましたここに
それで、PDO部分に
stmt = $pdo -> query("SET NAMES utf8;");
を追加したらばいっぺんに解決しました。
やったね
昨日は札幌でもカテーテル・インターベンションで働きました。その後は、皆で誕生日を祝って頂きました。正直この歳になるとあまり嬉しくありませんが、それでも皆が祝って下さると、何となく嬉しくもなります。単純ですね僕は、
例によって朝早く起床し、ずっと気になっていたこと、それは今までPHPでプログラムたくさん書いてきたけど、ずっとずっと、native PHPというPHP4.0の頃の古い文法に従って書いてきました。つまり、Database接続なども、そのような古い書き方をしてきたのです。何時までもこんなではいけない、とずっと思ってきたのですが、何しろ頭が固くなっているので、なかなか新しい世界に踏み込めなかったのです。
それを今朝思い切ってやりました。
PEARにするか、PDDにするか悩み、少し調べたところ、PHP5.1以降は圧倒的にPDOが優れているようですので、PDOにすることにしました。
テストプログラムをまずはlocal (XAMPP)で走らせ、それから実際にuploadしたところ、見事走りました。これで大丈夫です。危ないのでそのプログラムはサーバーからすぐに消しました。
