カテゴリー
SugiBlog Webデザイナー・プログラマーのためのお役立ちTips

クラウド型スケジューラーパッケージ

現在はパッケージ版の販売を終了しています。
サブスク版にてご提供していますので、そちらをご覧ください。
https://seion.biz/app/kuranosuke/


シンプルで使いやすいWEBで使えるスケジューラーをパッケージ化し、ココナラで販売中です。
シンプルながら有給休暇の管理(申請から管理者の承認まで)もできます!

従業員が今、社内にいるのか、外出中なのか、現在の状況が一目でわかります。
週間の予定表示もあり、全体の予定把握も簡単です。月間表示も可能!

詳細は下記からご覧ください。

クラウド型スケジューラーパッケージを提供します 従業員の予定を一元管理!有給休暇の管理もできる

717 views

ファイルを添付してメール送信3

PHPのmb_send_mail関数でファイルを添付してメールを送信するスクリプト

$to   = "mailto@example.jp";
$from = "mailfrom@example.jp";

$subject  = "件名";

$mailbody = "メール本文\n";

$boundary = md5(uniqid(rand())); //バウンダリー文字(パートの境界)


$header = "From: $to\n"
        . "Reply-To: $from\n"
        . "X-Mailer: PHP/".phpversion()."\n"
        . "MIME-version: 1.0\n"
        . "Content-Type: multipart/mixed;\n"
        . "\tboundary=\"$boundary\"\n";

$msg = "This is a multi-part message in MIME format.\n\n"
     . "--$boundary\n"
     . "Content-Type: text/plain; charset=iso-2022-jp\n"
     . "Content-Transfer-Encoding: 7bit\n\n"

     . $mailbody."\n"

     . "\n";


// 画像(upfileという名前でアップロードされたとする)
if($_FILES["upfile"]["error"] == UPLOAD_ERR_OK) {

    $tmp   = $_FILES["upfile"]["tmp_name"];
    $name  = $_FILES["upfile"]["name"];
    $size  = $_FILES["upfile"]["size"];

    $array = explode(".", $name);
    $nr    = @count($array);
    $ext   = $array[$nr - 1];

    $name  = date("U").".".$ext;

    $fp = fopen($tmp, "r");
    $contents = fread($fp, filesize($tmp));
    fclose($fp);
    $f_encoded = chunk_split(base64_encode($contents)); //エンコード

    $msg .= "--$boundary\n"
         . "Content-Type: application/octet-stream;\n"
         . "\tname=\"$name\"\n"
         . "Content-Transfer-Encoding: base64\n"
         . "Content-Disposition: attachment;\n"
         . "\tfilename=\"$name\"\n\n"
         . "$f_encoded\n"
         . "\n";

} //[end if]


// language establish
mb_language("ja");

// original encoding
$orgEncoding = mb_internal_encoding();

// specify internal encoding
mb_internal_encoding("utf-8") ;


//メール送信
if(!mb_send_mail($mailto, $subject, $msg, $header)) {
    echo "メールの送信に失敗しました。";
}

// internal encoding take back
mb_internal_encoding($orgEncoding);
930 views

Geocoder APIを利用した座標変換

Geocoder APIを使えば住所から座標を取得することができます。
今回はJavaScriptではなくHTTPリクエストで座標を取得する方法をご紹介します。

取得するデータはJSON形式で受け取るようにしています。
使用する言語はPHPです。

まずはリクエストするURLとAPIキーを宣言

$googleapis = "https://maps.googleapis.com/maps/api/geocode/json";
$api_key    = "YOUR API KEY";

続いてパラメーターを追加していきます。
検索する住所を追加

$googleapis .= "?address=" . $address;

国を指定(同じ名前の地名が中国等にあるとそちらの座標になってしまうことがあります)

$googleapis .= "&components=country:JP";

APIキーを設定します

$googleapis .= "&key=" . $api_key;

file_get_contents関数を使ってデータを取得します。

$data = file_get_contents($googleapis);

返ってきたJSONデータを解析して座標を取り出します。

$json = json_decode($data);

$lat = $json->results[0]->geometry->location->lat;
$lng = $json->results[0]->geometry->location->lng;

if( $json->status == "OK" ) {
    echo $lat . "," . $lng;
}

詳細な仕様は公式ドキュメントを参照ください。
https://developers.google.com/maps/documentation/geocoding/intro#GeocodingRequests

1,142 views

外部サーバーのファイル有無を調べる

PHPにはファイルの有無を調べるfile_existsという便利な関数がありますが、
外部サーバーのファイルを確認することはできません。

そこで、HTTPヘッダーを取得し、ステータスコードからファイルの有無を確認してみましょう。

まずはHTTPヘッダーを取得。

$response = get_headers([任意のURL]);

取得したヘッダーからステータスコードを抜き出す。
ステータスコードは配列で返ってきたヘッダーの先頭にあるので、$response[0]の中から数字3桁をpreg_matchを使って抜き出します。

preg_match("/.*(\d{3}).*/", $response[0], $matches);

HTTPステータスコードを数値に変換。

$response_code = intval($matches[1]);

ステータスコードが200であればファイルが存在する、ということになります。


関数を作ると次のような感じになります。

function myFileExists($str_path)
{
    // HTTPヘッダーを取得
    $response = get_headers($str_path);

    // HTTPステータスコードを抜き出す
    if(preg_match("/.*(\d{3}).*/", $response[0], $matches)) {

        // HTTPステータスコードを取得
        $response_code = intval($matches[1]);

        if($response_code == 200) {

            return true;

        } else {

            return false;

        }

    } else {

        return false;

    }
}
1,474 views

日本的日付の加算・減算

以前、PHPでの日付の加算・減算についてご紹介しました。
その時の記事はこちら↓
日付の加算・減算 DateTimeクラス

その際、月の加減については31日が加減されると記載しました。

例えば12月31日に2ヶ月を加算した場合は、翌年の3月3日になります。

今回はそのような事態にならない回避方法をご紹介します。

// 基準とする日付のオブジェクトを生成する
$myDate = new DateTime("2018-12-31");

// 新規日付オブジェクトを生成
$newDate = new DateTime();

// 2ヶ月後の末日を取得
$newDate->setDate($myDate->format("Y"), $myDate->format("n") + 2 + 1, 0);

※日付に「0」を指定することで前月の末日を取得することができます。
3ヶ月前の末日を取得する

// 2ヶ月を加算する
$myDate->add(new DateInterval("P2M"));

echo $myDate->format("Y-m-d")."\n";

echo $newDate->format("Y-m-d")."\n";

ここでの出力結果

2019-03-03
2019-02-28
// 基準日オブジェクトと2ヶ月後末日との差を求める
$result = $myDate->diff($newDate);

//$resultには日付の間隔を表すDateIntervalオブジェクトが返されます。

if($result->invert == 1) { //間隔が負の数になっている場合は 1、そうでない場合は 0

    echo "newDate\n";
    echo $newDate->format("Y-m-d");

} else {

    echo "myDate\n";
    echo $myDate->format("Y-m-d");

}

出力結果は以下のようになります。

newDate
2019-02-28
1,127 views