So-net無料ブログ作成
検索選択

PHP はダメ?理由を考えてみた [php]

私は現在、PHP をメインにプログラムを作っています。
他の言語を使うこともありますが、web の仕事はほぼ PHP です。

たまに、「PHP はダメだ」とか「PHP は使えない」という話しを聞きます。
個人的には、使えるモノは使えばいいと思っているのですが・・・。



PHP のメリットは、初心者がとっつきやすいということだと思っています。
プログラマーであれば、多少さわったことがあるという人はたくさんいます。
ちょっとしたツールであれば、簡単に作れます。
わからないことがあってもインターネットで検索すればいくらでも情報があります。
ほとんどのレンタルサーバーでは最初から PHP を使えるようになっています。
コンパイルなどの作業がいらず、書いたコードの結果をすぐに確認できます。


ただ、簡単にそれっぽいモノが作れてしまうため、いいかげんなコードもたくさん公開されています。
また、PHP は、言語仕様が厳格ではありません。1つのことに対していろいろな書き方が出来てしまいます。
この辺が、「PHP はダメ」と言われるような気がします。



もともと、PHP は、「動的にHTMLを生成する」ために作られています。
システムを作ったり、ハードウェアを制御するための言語ではありません。
ここが他のプログラミング言語と大きく違う部分です。
最終的にHTMLを生成できればいいので、言語仕様を厳格にする必要がないのです。


現在のPHP は、バージョンアップを重ねて、大規模なシステムも作れるようになっています。
ただし、初心者が簡単に作れるわけではありません。
他の言語のように、言語側がある程度コントロールしてくれるということがないため、すべて自前で書かなければいけないというイメージです。
知識や経験が無いと、穴だらけのシステムになりやすいのも、PHP の特徴です。



とはいえ、PHP は手軽なうえ、少ない工数で開発できるスクリプト言語です。
PHP での開発を指定される仕事もよくあります。
デメリットもたくさんありますが、それをわかった上でうまく使っていけばいいのではないでしょうか。



タグ:PHP

SQLSTATE[42000] [1044] でアクセスできない!? [php]

先日、「サーバーを新しくしたらプログラムが動かない」というので、見に行ったのですがハマりました。

どこかで購入(?)したシステムをインストールしたらしいのですが、データベースの接続時に、

 SQLSTATE[42000] [1044] Access denied for user 'ユーザー名'@'localhost

というエラーが出ていました。
SQLSTATE[42000] [1044] は、指定されたユーザーのアクセスを拒否する というエラーです。


状況としては、
●システムのインストールは成功している
●データベースは作ってある
●phpMyAdmin にはログインできる
●ユーザー名やパスワードは間違っていない


エラーメッセージからすると、ユーザー名やパスワードが間違っているのかと、いろいろ試したのですが状況は変わらず。

再度、サーバーの設定を確認していたら、データベースのポート番号が '3307' になっていました!
なぜそうなっていたのかはわかりませんが、localhost は '3306' なので、明示的に指定しなければつながりません。
が、そもそもポート番号を指定するところが無い!?


インストールしたシステムが php で作られていたので、ソースを覗いてみたら、データベースに接続する部分が、以下のようになっていました。
	$this->pdo = new PDO(
		sprintf('mysql:dbname=%s;host=%s;charset=utf8',
			DB_NAME,
			DB_HOST
		),
		・・・


なので、ポート番号を指定するように書き換えました。
	$this->pdo = new PDO(
		sprintf('mysql:dbname=%s;host=%s;port=%s;charset=utf8',
			DB_NAME,
			DB_HOST,
			DB_PORT
		),
		・・・


これで、
 DB_HOST に、データベースのIPアドレス(localhost ではない)
 DB_PORT に、データベースのポート番号('3307')
を指定することで、解決しました。



今回ハマった原因は、データベースのポート番号は '3306' だと思い込んでいたこと。
プログラムにポート番号を指定する箇所が無かったため、なかなか気づきませんでした。

「これはハマるだろうなぁ」
と思ったので、記事にしてみました。




PHPでMySQLのバージョンを取得する [php]

ときどき、データベースのバージョンを確認したいことがあります。
直接、データベースを見ればいいのですが、めんどくさい・・・。
phpinfo() だと、いらない情報がゴチャゴチャ出てきて見づらい・・・。
ちょっと確認したいだけなので、バージョン番号だけ表示したい・・・。
ということで、作ってみました。

以前は、mysqli_get_server_info() で MySQL サーバーの情報を取得できたのですが、mysqli_get_server_info() が PHP 5.5.0 で非推奨になり、PHP 7.0.0 で削除されました。

今後、mysqli_get_server_info() を使えない状況が増えてくるので、mysqli を使って MySQL サーバーの情報を取得しています。

function mysql_ver() {
	$mysqli = new mysqli("hostname", "username", "password");

	// 接続チェック
	if (mysqli_connect_errno()) {
		return mysqli_connect_error();	// エラーを返す
		exit();
	}
	return $mysqli->server_info;	// MySQLのバージョンを返す
	$mysqli->close();
}


echo mysql_ver();

hostname、username、password には、使用しているデータベースの設定を入れます。




include と require の違いと使い分け [php]

PHP の include と require は、どちらも、関数をまとめた別ファイルなどを読み込む場合に使用します。
同一スクリプト内で複数回読み込むことができます。
どちらも同じような機能なので、どう使い分けたらいいのか悩むことがあります。

また、外部ファイルを1回だけ読み込みたい場合は、include_once や require_once を使います。
すでに読み込まれていた場合は、再度、読み込むことはしません。
関数などは、複数回読み込むとエラーになるため、_include_once や require_onceを使うことになります。
こちらも、同じような機能になっています。


【include と requier の違い】
include は、外部ファイルの読み込みに失敗しても、そのまま処理を続行します(警告が出ます)。
require は、外部ファイルの読み込みに失敗した場合、エラーで処理が停止します。

機能的な違いは、これだけです。
機能の違いにより、表示速度も違ってきますが、通常は無視できる程度の差だと思います。
なので、使い分けとしては、次のようになります。


include
複数回読み込む必要があり、読み込みに失敗してもユーザーには支障がない場合
<例>
 広告バナー、デザイン的な画像など

include_once
複数回読み込む必要がなく、読み込みに失敗してもユーザーには支障がない場合
<例>
 説明文、コピーライト表示など

require
複数回読み込む必要があり、読み込みに失敗するとシステムを操作できなくなる場合
<例>
 パンくずリストやページングのガイドなど
 (ページの上下に表示する場合、2回読み込む必要がある)

require_once
複数回読み込む必要がなく、読み込みに失敗するとシステムを操作できなくなる場合
<例>
 メニュー(ボタン)、関数をまとめたファイルなど



PHP は、動的に HTML データを生成することを目的に作られたスクリプト言語です。
そのつもりで見ていると、これらの関数の使い道も見えてくると思います。




タグ:PHP