joppot

コピペで絶対動く。説明を妥協しない

プログラミング

PEARのDBライブラリのインストールと使い方

投稿日:2014年3月20日 更新日:

Pocket

DB

概要

みなさんこんにちはcandleです。PEARには複数の便利なライブラリがあります。
その中の1つに実はもう古くなってあまり推奨されていませんが、データベースにつないだり、データベースの値を取得するなどのライブラリのDBがあります。

このDBライブラリ確かに便利ではあるのですが、面白い事に、どこかの記事ではDBライブラリでデータベースにつなぐのと、phpの一般的な構文でつなぐのだと、phpの一般的な方が早いとか。

それでも、入門として、DBを使うのは便利ですのでやってみましょう。

前提

MAMPかXAMPPなどのPHPとMysqlを実行できる環境またはそれ以外の自由に実行できる環境。

PEARが実行できる環境。

SPONSORED LINK


PEARでDBライブラリをインストールする

私はMAMPを使用します。別にどの環境でもpearが動けばそれでかまいません。

MAMP2.2の場合は下のパスにpearの実行コマンドがあります。

/Applications/MAMP/bin/php/phpのバージョン/bin/pear

私の場合はphpのバージョンが5.3.27なので下のパスになります。

/Applications/MAMP/bin/php/php5.3.27/bin/pear

実行確認のため、下のコマンドで現在インストールされているライブラリを閲覧します。

./pear list

bin_—_bash

確認できました。

DBをインストールしましょう。下のコマンドでインストールできます。

./pear install DB

bin_—_php

インストールができたでしょうか?
下のコマンドを実行して、DBがインストールされたか確認しましょう。

./pear list

bin_—_bash 2

インストールができました。


Mysqlのテストデータベースを用意する

例によって、私はいつも下のテーブルを使っています。
これをbtestデータベース作成します。

CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(100) NOT NULL,
  `password` varchar(255) NOT NULL,
  `age` int(10) NOT NULL,
  `created` datetime NOT NULL,
  `modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ;


INSERT INTO `users` (`id`, `name`, `password`, `age`, `created`, `modified`) VALUES
(1, 'alice', '', 10, '2014-02-14 05:29:13', '2014-03-18 01:23:35'),
(2, 'bob', '', 12, '2014-02-17 21:11:44', '2014-02-17 15:40:43'),
(3, 'tom', '', 15, '2014-02-18 04:37:07', '2014-02-17 15:41:18');

MAMP

PHPからDBライブラリを使ってデータベースにつなぐ

では新しくphpファイルを作成し、DBライブラリを使ってMysqlにつないでみましょう。

MAMPの場合はhtdocsにフォルダを作ってそこにファイルを作ります。

私はhtdocsにalltestフォルダを作って、そこにpeardb.phpファイルを作りました。

alltest_と_alltest

peardb.phpに下のコードを書き込みましょう。

<?php
$db_host='localhost';
$db_database='btest';
$db_username='root';
$db_password='root';

require_once 'DB.php';

$connection = DB::connect("mysql://$db_username:$db_password@$db_host/$db_database");

if (DB::isError($connection)){
    die("接続できませんでした<br />".DB::errorMessage($connection));
}

echo "ok</br>";

?>

コードを説明します。
あらかじめ4つの変数にホスト、データベース名、mysqlのユーザー名、パスワードをおさめておきます。

これはようはインスタンスみたいなものです。

$connection = DB::connect
("mysql://$db_username:$db_password@$db_host/$db_database");

その後のif文で接続できたか判断します。

ブラウザで確認する

コードの最後に echo “ok”とある様に、もしもokと表示されれば、接続成功です。

localhost_8888_alltest_peardb_php_と_Web_-_alltest_peardb_php_-_Aptana_Studio_3_-__Applications_MAMP_htdocs

どうやらつながったようです。


Mysqlにmysqlクエリーを投げる

Mysqlに繋げたのでDBライブラリを使ってmysqlクエリーを投げてみましょう。
テストデータベースにはusersテーブルがあります。それを取得しましょう。

先ほどのコードの最後に下のプログラムを追加しましょう。

$search_sql = "SELECT * FROM users";
$search = $connection->query($search_sql);

if (DB::isError($search)){
    die("Could not query the database:<br />$query ".DB::errorMessage($search));
}
echo "ok";

Web_-_alltest_peardb_php_-_Aptana_Studio_3_-__Applications_MAMP_htdocs

これをみても分かる様に、先ほどつくった$connection変数を使ってquery関数を実行しています。

ブラウザで確認する

中身をまずは確認しないで、クエリーが送れているか確認だけします。

同じくokの文字が出たらMysqlクエリーの送信成功です。

localhost_8888_alltest_peardb_php_と_Web_-_alltest_peardb_php_-_Aptana_Studio_3_-__Applications_MAMP_htdocs

mysqlクエリーの送信に成功しました。

取得したデータをwhileを使って表示する

では、データを表示しましょう。データの取得の仕方は様々あります。

配列でデータを取得する

取得したデータを配列で取得しましょう。
下のコードを先ほどのソースコードの最後に追加しましょう。

while ($search_result = $search->fetchRow()) {
	print_r($search_result);
	echo"</br>";
}

Web_-_alltest_peardb_php_-_Aptana_Studio_3_-__Applications_MAMP_htdocs 2

fetchRowという関数を使う事で配列で取得できます。それを$search_resultにおさめて表示しています。

ブラウザで確認する

ブラウザで見ると下のように表示されます。

localhost_8888_alltest_peardb_php_と_Web_-_alltest_peardb_php_-_Aptana_Studio_3_-__Applications_MAMP_htdocs 2


連想配列で取得する

私はどちらかというと、いつもこっちでデータを取得しています。というのも、配列で取得すると、そこからされにデータを取得する時に、いちいち、0とか4とか指定しなくてはならなくなるからです。

それよりも、nameとかidとかで指定できた方が直感的です。

fetchRowに引数を与えて、連想配列で取得します。

while ($search_result = $search->fetchRow(DB_FETCHMODE_ASSOC)) {
	print_r($search_result);
	echo"</br>";
}

ブラウザで確認する

localhost_8888_alltest_peardb_php_と_Web_-_alltest_peardb_php_-_Aptana_Studio_3_-__Applications_MAMP_htdocs_と_MAMP

同じ要領でINSETとしたり、UPDATEしたりできます。


プレイスホルダーを使う

同じmysql文を何回も実行するときはプレイスホルダーを使うと便利です。

ただ、これちょっとセキュリティがきになりますね。

テストデータベースの3人のユーザのパスワードを適当に入れてみたいと思います。本当は暗号化して保存するのですが、今回は直で保存します。

まずは共通するmysql文を書きます。

$sql = "UPDATE users SET password=? WHERE id=?";

このような感じになると思います。
次に、これをprepareという関数で処理します。その結果を$sql_queryにおさめます。

$sql_query = $connection->prepare($sql);

?の部分にあたる配列を書きます。この場合は?が2つなので2つの値を指定します。
はじめの値がパスワードの値で、二番目がidの値です。

$data = array('uupt',1);

最後にprepareで処理した$sql_queryとデータが収まった、$dataをもとにDBライブラリのexecuteで処理すれば、mysqlクエリーが実行されます。

$connection->execute($sql_query, $data);

まとめると

下のコードになります。

$sql = "UPDATE users SET password=? WHERE id=?";
$sql_query = $connection->prepare($sql);
$data = array('uupt',1);
$connection->execute($sql_query, $data);

それでは実行してみましょう。
上のソースコードをpeardb.phpの最後に書き込んで実行しましょう。

現在id=1のaliceはパスワードが空です。
MAMP 2

ブラウザでpeardb.phpを読み込んで、データベースを見ると

MAMP 3

passwordにuuptが保存されている事がわかります。

プレイスホルダーの詳細はpearの公式ページや他のサイトを参照してみてください。

データベースを閉じる

DBライブラリを使って、データベースにつないだら、最後にかならず、データベースを閉じてください。こうする事で、メモリが解放されます。メモリが解放されることで、動作が早くなるっぽいです。

$connection->disconnect();


全体のソースコード

今回使ったソースコードをここにまとめておきます。

<?php
$db_host = 'localhost';
$db_database = 'btest';
$db_username = 'root';
$db_password = 'root';

require_once 'DB.php';

$connection = DB::connect("mysql://$db_username:$db_password@$db_host/$db_database");

if (DB::isError($connection)) {
	die("Could not connect to the database: <br />" . DB::errorMessage($connection));
}

$search_sql = "SELECT * FROM users";
$search = $connection -> query($search_sql);

if (DB::isError($search)) {
	die("Could not query the database:<br />$query " . DB::errorMessage($search));
}

while ($search_result = $search -> fetchRow(DB_FETCHMODE_ASSOC)) {
	print_r($search_result);
	echo "</br>";
}

$sql = "UPDATE users SET password=? WHERE id=?";
$sql_query = $connection -> prepare($sql);
$data = array('uupt', 1);
$connection -> execute($sql_query, $data);

$connection -> disconnect();
?>


まとめ

何度も言いますが、DBライブラリは少々オワコンらしいです。これの進化したMDB2というのがありますので、それの方がおすすめらしいです。とは言うのもの、構文はほとんど同じらしいので、ひとまず、DBライブラリが自由に使えれば困る事はないでしょう。

スポンサードリンク

「為になったなぁ」と思ったら、シェアお願いします。

-プログラミング
-, ,

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

Twitterbootstrap3の開発環境構築とファイル配置、テンプレートを試す

概要 みなさんこんにちはcandleです。今回はtwitterbootstrap3のダウンロードを行い、ファイルを配置して、開発できる様に準備します。 twitterbootstrap3は最近リリース …

ruby on railsのckeditorの画像のアップロード先をcarrierwaveとfogを使ってS3にする

概要 railsのckeditorはデフォルトでrailsのuploadsフォルダにアップロードしますが、 それだとサーバの容量を取ってしまうので、画像のアップロード先をS3に上げてみたいと思います。 …

railsのsimple-captcha gemを使用してform_forを使ったフォームを画像認証する

概要 みなさんこんにちはcandleです。公に開かれたフォームはスパムや総当り攻撃を受けやすいです。 そこで、画像認証を導入して、悪意のあるフォームを拒否してみましょう。 simple-captcha …

ruby on rails4でtwitter bootstrap 3のgemを使用してscaffoldを作成する

概要 みなさんこんにちはcandleです。今回はrails4上でtwitterbootstrap3のgemを使ってscaffoldしてみたいと思います。 scaffoldとはご存知のようにいわゆるwe …

railsのgonで別ページでリロード後turbolinksで移動したら変数がundefindする場合の対処

概要 (追記 2016/05/18 この方法を行うと、turbolinksで問題が起きました。 turbolinksで移動した回数だけ、javascriptが実行されてしまいました。 例えば、 < % ...

  • English
  • 日本語

プロフィール


ベンチャー企業のCTOをやってます。大学時代にプログラミングを始め、javaから入門し、C++へて、PHPへと進み、会社ではRailsを使用。自動化が大好きなプログラマー

スポンサードリンク

アーカイブ