PG WORKS

PHPやLinux(サーバー)などのノウハウや、便利なツールを紹介していきます。

【PHP&MySQL】手っ取り早くMySQLを使いたい方へ 接続&SELECT編

f:id:zen6a:20170410234701p:plain
PHP5.1以降から導入されたPHP Data Objects(PDO)を使い、手取り早くデータベースへ接続したい方に今回は記事を書いていきたいと思います。

まずは、MySQLへの接続のクラスを紹介。

MySQLサーバへ接続

<?php
	define("HOST"     ,"mysql:dbname=データベース名;host=127.0.0.1");
	define("ACCOUNT"  ,"mysqlのアカウント名");
	define("PASSWORD" ,"パスワード");
	$pdo = new PDO( HOST, ACCOUNT, PASSWORD );
?>

ここで接続できなかった場合、まずは下記の項目をチェックしてみましょう。

  1. PDOの記述間違いがないか確認。
  2. データベースが存在しているか、データベース名に間違っていないか確認。
  3. ホスト名が間違っていないか確認。(サーバが違う場合そのサーバのIPなど指定する。
  4. アカウント名・パスワードが間違っていないか確認。
  5. MySQLサーバがPHPが動いているサーバと別の場合、PHPが動いているサーバからアクセス権があるか確認。

上記の5項目確認しても繋がらない場合、エラー内容で調べてみると知恵袋などに回答が記載されてますので、該当箇所を再度確認してみましょう。

接続ができないと、PHPのエラーが表示されるため、try&catchを使い処理を作成しましょう。

<?php
	define("HOST"     ,"mysql:dbname=データベース名;host=127.0.0.1");
	define("ACCOUNT"  ,"mysqlのアカウント名");
	define("PASSWORD" ,"パスワード");
	try {
	    $pdo = new PDO( HOST, ACCOUNT, PASSWORD );
	} catch(PDOException $e) {
		echo 'データベース接続エラー';
	    die();
	}
?>

データベース内にあるテーブルにアクセスしデータを参照する方法

<?php
	$sql = 'SELECT id, name FROM sample';
	$sth = $pdo->prepare($sql);
	$sth->execute();
	$arySamples = $sth->fetchAll(PDO::FETCH_ASSOC);
?>

sampleテーブルにあるデータを変数「$arySamples」に格納します。
上のクエリーだと、sampleテーブルのすべてのデータを変数に格納しますが、idで指定して1つデータのみ参照する場合は、「$sth->fetchAll(PDO::FETCH_ASSOC);」を「$sth->fetch(PDO::FETCH_ASSOC);」に変えると、$arySamples["id"]な形式でデータを取得することが可能です。

特定のデータのみ参照する

<?php
	$sql = 'SELECT id, name FROM sample WHERE id= :id';
	$sth = $pdo->prepare($sql);
	$sth->bindValue(':id', "1", PDO::PARAM_INT);
	$sth->execute();
	$arySamples = $sth->fetch(PDO::FETCH_ASSOC);
?>

少し記述が変わってますが、「$sth->bindValue(':id', "1", PDO::PARAM_INT);」を使うことで、エスケープ処理も自動でやってくれるため、変数の格納が楽になります。
「$sth->bindValue」を使わなくても、「$sql」変数に直接記述もできますが、エスケープ処理されないため、「$sth->quote($string)」を使い処理しましょう。
PHP: PDO::quote - Manual

bindValueの第3引数について

PDO::PARAM_INT以外にも、いろんな定数があります。
PHP: 定義済み定数 - Manual

よく使うものだと。

  1. PDO::PARAM_INT
  2. PDO::PARAM_STR
  3. PDO::PARAM_NULL

この3つになるでしょうか。
「PDO::PARAM_NULL」の定数ですが、値をNULLにしたいときに利用します。
なので値がある場合、「PDO::PARAM_INT」OR「PDO::PARAM_STR」にしないとエラーになります。

クエリーエラーを確認する方法

<?php
	$sql = 'SELECT id, name FROM sample WHERE id= :id';
	$sth = $pdo->prepare($sql);
	$sth->bindValue(':id', "1", PDO::PARAM_INT);
	if( !$sth->execute() ){
		print_r($sth->errorInfo());
	}
	$arySamples = $sth->fetch(PDO::FETCH_ASSOC);
?>

PDOでは、クエリーエラーが表示されないため、「$sth->errorInfo()」で確認する必要があります。
※特にINSERTやUPDATE時。

エラー内容を保存して通知するような仕組みがあると、メンテナンスやトラブルの調査が楽になると思います。

よく使うのに忘れてしまうHTMLタグが紹介されました!

HTMLタグを紹介した記事が、レバテック様のサイトにて紹介されました!

HTMLタグの「分からない」を解決してくれる記事まとめ

他のブロガー様も紹介されてますが、HTMLが何なのかよくわからない方やタグはなんとなく理解している人でも、HTMLはなんぞやと細かく説明されているものもあるので、参考になるかもしれません。

個人的に「へぇ~」と思った記事は、

[HTML] BRタグは使うな! 私が「改行」を一切使わなくなった1つの理由 | ヨッセンス

でした。

スマホ構築のとき、brタグが原因で、デザインが崩れることをあまり意識してなかったので、勉強になりました(汗


レバテック様のサイトでは、エンジニア関係の求人を取り扱ってるんですね。(はじめて知りました。

エンジニア・デザイナーのためのスキルアップ記事 | レバテックキャリア

↑の記事一覧で、さまざまなプログラムに関する話題がアップされるみたいなので、一読したいと思います^-^

当ブログも引き続き、PHPを中心に更新していきますので、よろしくお願いします!

【CentOS7】Apache2.4のconfファイルの設定について

f:id:zen6a:20161127224322p:plain
http://blog.wnotes.net/blog/article/apache-event-mpm

ソースコンパイルからインストールだと、eventになるってことなのかな??

CentOS7でyumでインストールしたものは、preforkだったんだけど。。。

インストールするOSによって設定が違うのかも。。。

Apache2.4からhttpd.confにpreforkの記述がないのと、CentOS7でのyumインストールでは、preforkの設定ファイルがありません。

なので、

「/etc/httpd/conf.d/」の中に「mpm.conf」っていうファイルを新規作成して設定しました。
※ファイル名は「.conf」がついていればなんでもいいと思います。

<IfModule mpm_prefork_module>
  StartServers               5
  MinSpareServers            5
  MaxSpareServers           10
  ServerLimit              256
  MaxRequestWorkers        256
  MaxConnectionsPerChild   1000
</IfModule>

※プロセスが多くなればメモリの使用量も増えるためシステムの負荷を見て調整してください。

設定が反映されているかどうかは、プロセスの起動数を見て確認しました。
下記のサイト様に記載されているコマンドでapache(httpd)のプロセスの数がわかります。

現在のプロセス数を調べる – katz+

ps aux | grep httpd | grep -v "\(root\|grep\)" | wc -l

apacheの設定ファイルを編集した後、反映させるには「reload」ではダメだったので、

service httpd stop

service httpd start

にて設定が反映されていることを確認できました。

下記のサイト様の「ServerLimit」の備考で気付きました。(汗

heartbeats.jp

「reload」で「ServerLimit」を256以上にしても反映されなかったので、助かりました。

ServerLimit 256の限界

Apacheのプロセス数が256以上溜まっている状態が続くと、サイト閲覧するタイミングによっては、画面が真っ白まま何も表示されなくなるので、メモリに余裕があればServerLimitを増やすか、ロードバランサーを使い、サーバを分散したほうがいいと思います。

※サーバのスペックによりますが、メモリが少ないサーバは、WEBとDBを切り分けたほうが良さそうです。もちろん、サーバ内に入っているサイトやシステムによります。サーバの増設の前にプログラムで解決できないか増設前にチェックしましょう~。


Apache2.4でのアクセス制限の記事を書きました。
zen6a.hateblo.jp

MySQLが重いときに使うコマンド

SHOW FULL PROCESSLIST

クエリーが改善されないときや重いと思ったときに、上記のコマンドを使うことで
実行中のスレッドを見ることができます。

「Info」にクエリーが表示されるため、その隣に表示される「Time」を見ながら
重いクエリーを判定できると思います。
※FULLをつけないとInfoの方には100文字までしか表示されません。

SHOW GLOBAL VARIABLES

MySQLサーバの設定値を確認できます。

MySQLではないですが、MySQLを使っているページに、アクセスが集中するとプロセスが溜まり重くなります。
プロセス数の確認は下記のコマンドになります。

ps aux | grep httpd | grep -v "\(root\|grep\)" | wc -l

プロセス数がたまっているときに、INSERTすると、エラーになりやすいため、INSERTできなかったときの処理(時間を置いて後でINSERTするなど)が必要になると思います。

【PHP】Carbonで日付の加算減算方法

前回、strtotimeの日付加算減算方法を紹介しましたが、、、

zen6a.hateblo.jp

Carbonのほうが、バグを気にせず使えるため、こちらも紹介したいと思います。

そのまえに、Composerが必要になります。前回の記事にて紹介しましたので、よければ参考にしてください。

zen6a.hateblo.jp

では、サンプルを公開〜。

<?php
  // carbonをダウンロードしたパス(前回の記事を参考)
  require '/home/○○○/bin/vendor/autoload.php';

  use Carbon\Carbon;

  // 今日
  echo Carbon::now();
	
  // 昨日
  echo Carbon::yesterday();
	
  // 明日
  echo Carbon::tomorrow();

  // 現時刻のタイムスタンプ
  echo Carbon::now()->timestamp;
		
  // 一週間前
  echo Carbon::now()->subWeek(1);
	
  // 一週間後
  echo Carbon::now()->addWeek(1);
	
  // 一ヶ月前
  echo Carbon::now()->subMonth(1);
	
  // 一ヶ月後
  echo Carbon::now()->addMonth(1);
	
  // 一年前
  echo Carbon::now()->subYear(1);
	
  // 一年後
  echo Carbon::now()->addYear(1);

  //月初
  echo Carbon::now()->startOfMonth();

  // 月末
  echo Carbon::now()->endOfMonth();
	
  // 一ヶ月前の月末
  echo Carbon::parse('-1 month')->endOfMonth();
	
  // 一ヶ月後の月末
  echo Carbon::parse('+1 month')->endOfMonth();
?>

日付のみ表示したい場合

<?php 
  $carbon = Carbon::now();
  echo $carbon->toDateString();
?>

日付の書式を変更したい場合

<?php 
  $carbon = Carbon::now();
  echo $carbon->format('Y年m月d日');
?>

生年月日から年齢判定

<?php 
$birthday = Carbon::parse('1990-05-15');
echo $birthday->age;
?>

日付の差分

<?php 
$date1 = Carbon::createMidnightDate(2018, 1, 1);
$date2 = Carbon::createMidnightDate(2018, 12, 31);

//秒
echo $date1->diffInSeconds($date2);
//分
echo $date1->diffInMinutes($date2);
//時間
echo $date1->diffInHours($date2);
//日
echo $date1->diffInDays($date2);
//週
echo $date1->diffInWeeks($date2);
//月
echo $date1->diffInMonths($date2);
//年
echo $date1->diffInYears($date2);
?>