Dr. Radialistからの便り

湘南鎌倉総合病院 心臓センター循環器科

2012-02-22

すいすいとTAVI

17:22

TAVI本日は前回の一日三例と異なり、一例のみでした 順調に終了し、患者さんもお元気です。しかしながら、この新しい治療法を日本の患者さんのために根付かせる、という責務がありますので、責任は重いと思っています。

順調に、精神的にも落ち着いてできたのは、やはり術前に mysqliについて習得したからでしょう。

mysqliは、PHPMySQLデータベース専用接続のCで書かれたコンポーネントです。MySQL専用なので、たとえば、データベースSQL Serverや、Oracleに変更すれば、そのデータベース部分の PHPコードを書きなおす必要があります。

このデータベース毎の差異を吸収するレイヤーとして、PEAR::DBや PDOがあるのですが、PEAR::DBPHPで書かれているので速度が遅いらいしのです(もっとも私が書き運用するシステムではそれほど速度はクリティカルではありませんので関係無いのですが・・・)。そしてPDOは PHP5.2.6以降でないと、文字コードを使用したSQL Injection攻撃が可能となるらしいのです。

それに何より、僕は無料のデータベースであるMySQLしか知らないし、今後ともそれ以外のデータベースを使用する予定もつもりもありません。という訳で、mysqliが一番良いのだ、とそのように結論したのです。

しかし、資料が少ない、ネット上にある説明はとても不十分、それで試行錯誤だったのです。

でもまあこれで何とか使えるでしょう。mysqliのprepare()文で place holder機能を使えば、それでもう SQL Injection攻撃は完璧に防げるのです。すばらしいですね。

これからTAVI1 - mysqliの使い方

12:28

やったね これから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();
  // 解放

これで良いのです もちろん他にも書き方はありますが・・・

トラックバック - http://d.hatena.ne.jp/Dr_Radialist/20120222