ラベル php の投稿を表示しています。 すべての投稿を表示
ラベル php の投稿を表示しています。 すべての投稿を表示

2012/05/20

【PHP】指定ディレクトリのファイルを日付ソートして配列で取得

現在作成中の機能で使った奴のメモ

phpで「scandir」という関数でファイル名一覧は取得できますが、
ファイルの更新日時等は取得できません。

更新日時等でソートする必要がなければいいのですが、どうしてもソートしたいという要望?が
あったので、それに対応するために「DirectoryIteratorクラス」を
使用しました。

この関数は指定したディレクトリ内の情報を取得してくれます。
更新日付とかファイルサイズとかも取ってきてくれるので更新日付以外でもソートできます。

サンプルコード
<?php

// ファイル情報格納用配列
$file_info_list = array();

// DirectoryIterator
$file_list = new DirectoryIterator($path);
foreach ($file_list as $file_info)
{
    // ファイル以外はループに戻る
    if (!$file_info->isFile())
    {
        continue;
    }

    // 配列のキーに更新日時をセット
    $file_info_list[$file_info->getMTime()] = array(
        'file_name' => $file_info->getFilename(),
        'file_size' => $file_info->getSize(),
        'update'    => $file_info->getMTime(),
    );
}

// 更新日時(キー名)の降順にソート
krsort($file_info_list);

var_dump($file_info_list);
「getMTime」で更新日時のタイムスタンプが取得できるので、 それをキー名に使用し、キー名でソートを実行します。 ですので、キー名が更新日時のタイムスタンプになります。 終わり

2012/05/01

【PHP】Qdmailでメール送信した際に本文にヘッダーが表示される【Qdmail】

ということで今日あったQdmailの不具合?についてのメモ。

Qdmailでメール送信した際に、ヘッダーの一部またはすべてが
本文に表示されてしまうという不具合?に遭遇しました。


原因としては、ソースコード上の改行コードが違うために
起こってしまうそうです。

Qdmailではヘッダーの改行コードをRFCに準拠していますので「CrLf」なんだそうです。

ただ、qmailなどでメールを送信している場合に「CrLf」だと不具合が起きてしまうことが
あるそうです。

うちのサーバはPostfixでしたが、ダメだったみたいですね。
ですので、改行コードをソースコード上で「CrLf」から「Lf」に変更したところ、
ヘッダーが本文に表示されることは無くなりました。

Qdmailで使用する改行コードを変更するには
「lineFeed関数」を使用します。
$mail->lineFeed("\n");
終わり 参考URL:ヘッダーが見えてしまう等 - Qdmail - PHP::Mail Library , Quick and Detailed for Multibyte

2012/03/21

【PHP】PHPのセッションで第一階層に数字添字を指定した時に発生する問題

ということでさっきあった現象のメモ

PHPでセッションを使用した際に、セッション変数の第一階層の添字に
数字を指定すると次画面に遷移した際などにそのあたいが引き継がれない。

例えば
<?php

// 動かない
$_SESSION[1]['var'] = 'var1';

// 動く
$_SESSION['a']['var'] = 'var1';
このようにセッションの第一階層に数値の添字を指定すると 画面遷移など別画面に遷移しセッションをスタートしても、 数値添字を指定した方だけ取得できなくなります。 これはどうやら内部仕様っぽいです、実際はわからないですが 引き継がれていない以上はそういうものとして扱う必要があるわけです。 終わり

2012/03/17

【さくらサーバ】PEARをインストールする【PHP】

ということでさくらサーバにPEARをインストールした時のメモ

さくらサーバにはすでにPEARがインストールされていますが、
バージョンが古い、パッケージを追加できない等の問題がありますので、自前で使用するパッケージを
インストールできるようにしました。

まずは、ホームディレクトリにPEARの設定ファイルを作成します。
$ pear config-create $HOME .pearrc
次にPEARの設定ファイルに以下の値をセットします。 1.binディレクトリ
$ pear config-set bin_dir $HOME/usr/local/bin
2.ダウンロードディレクトリ
$ pear config-set download_dir $HOME/tmp
3.作業用ディレクトリ
$ pear config-set temp_dir $HOME/tmp
4.ライブラリディレクトリ
$ pear config-set php_dir $HOME/lib/pear
最後にPEARコマンドを実行できるように、「.cshrc」を編集します。
$ setenv PATH (いままで設定されていたパス) : 1に設定したパス $ source $HOME/.cshrc
コマンドを実行できるようになったら、PEARをインストールしてみます。
$ pear install PEAR
下記のコマンドでインストールされていれば完了です。
pear list
上記設定の場合のインクルードパスは、4で設定したディレクトリになります。 終わり

2012/03/08

【PHP】可変関数を実行する

可変関数の実行についてのメモです。

PHPでは変数名の後に「()」が付いている場合
変数の値と同名の関数をコールします。
可変関数は、メンバ関数も関数同様にコールすることができます。
また、スタティック関数もコールできますが、public以上のアクセスレベルだと実行できません。

こんな感じです。
<?php

class variableFunction
{
    public function disp($str)
    {
        echo $str;
    }

    public static function disp2($str);
    {
        echo $str;
    }
}

function disp($str)
{
    echo $str;
}


$func = 'disp';
$str  = '表示';

// 通常の関数をコール
$func($str);

// インスタンスを生成したクラス関数をコール
$vF = new variableFunction;
$vF->$func($str);

// variableFunctionクラスのスタティック関数をコール
$func2 = "disp2";
variableFunction::$func2($str);
※echo(), unset(), isset(), empty(), include(), print()のような言語構造と  組み合わせることはできません。 終わり

2012/02/27

【PHP】ループ中のswitchでcontinueしたときにはまった

今日ハマったのでメモ

まず、今日まで知らなかったのですが、PHPにおいて
switchはループ構造らしいです。

ですので、switch中のcontinueはすべてbreakと同じ扱いになります。
つまり、下記の例では

<?php

$list = array(
    '1', '2', '3', '4',
);

foreach ($list as $num)
{
    switch ($num)
    {
        case 1:
            continue;
        default:
            break;
    }

    echo $num . "\r\n";
}
このように出力されます。
1
2
3
4
switch内にて1が来た場合ループに戻るように と書いていますが、これだとただ単にbreakするのと 一緒になります。 ですので、ループに戻りたい際は下記のように記述します。
<?php

$list = array(
    '1', '2', '3', '4',
);

foreach ($list as $num)
{
    switch ($num)
    {
        case 1:
            continue 2;
        default:
            break;
    }

    echo $num . "¥r¥n";
}
これでなぜ、ループに戻ることができるのかというと、continueには 戻る階層を指定することができます。 ですので、下記記述ですと、2階層戻ることになりループに戻ることができます。
continue 2;
終わり 参考: PHP: switch - Manual

2012/02/16

【PHP】シングルクォートとダブルクォートでの改行コードについて

さっきハマったのでメモ

PHPでは文字列をシングルクォートまたはダブルクォートで囲みますが、
それぞれ意味が違います。

まず、ダブルクォートは変数の展開や改行コードの認識を行いますが
シングルクォートでは行いません。
どういうことかというと

下記のコードで確認できます。
<?php
$a = 'test';

// 改行コード
echo "ダブルクォート改行:\r\n";
echo 'シングルクォート改行:\r\n';

echo "---------------------------------\r\n";

// 変数の展開
echo "ダブルクォート変数展開:$a\r\n";
echo 'シングルクォート変数展開:$a\r\n';
上記をブラウザで実行すると下記の結果が得られました。
ダブルクォート改行:
シングルクォート改行:\r\n
---------------------------------
ダブルクォート変数展開:test
シングルクォート変数展開:$a
結果より、改行コードを改行として認識させたい場合はダブルクォートで囲む 必要があります。 終わり

2012/02/15

【PHP】QdmailでReturn-Pathをセットする【Qdmail】

PHPでメールを送信する上で大変便利なQdmailでReturn-Pathをセットする
方法です。

Qdmailの公式によると

mtaOption関数を使用します。addHeaderで設定しても無視されますので注意してください。 qd_send_mail($option .....)の場合 $option = array( 'type' => 'text', 'option'=>array( 'mtaOption'=>'-f return_address@example.com' ), );
と書いてあります。 つまり、インスタンスを生成してQdmailを使用する場合はセットできない ということみたいです。 該当記事 ですが、実はインスタンスを生成した場合でもReturn-Pathを指定することができます。 下記のソースがReturn-PathをaddHeaderメソッドで設定した場合 ※この方法では設定されません。
<?php
$mail = new Qdmail;

$mail->to('to@example.com');
$mail->from('from@example.com');
$mail->subject('sub');
$mail->body('message');
$mail->addHeader('-f return@example.com');

$mail->send();
下記のソースがReturn-Pathを別の方法で設定した場合 ※この方法では正しく設定されます。
<?php
$mail = new Qdmail;

$mail->to('to@example.com');
$mail->from('from@example.com');
$mail->subject('sub');
$mail->body('message');
$mail->mtaOption('-f return@example.com');

$mail->send();
終わり

2012/02/01

【PHP】指定した年月の前月を取得する

ということで指定した年月の前月を取得するメモです。

思ってたより簡単に出来ます。

<?

$prev_month = date('Y-m-d', mktime(0, 0, 0, $m - 1, 1, $y));
終わり

2012/01/30

【PHP】月の最終日を取得する

今日のメモです。

指定した年月の最終日を取得します。

<?
$year  = '2012';
$month = '01';

$last_day = date('t', mktime(0, 0, 0, $month, 1, $year));
終わり

2012/01/29

【PHP】strcmpで比較するときの注意

以前値の比較に「strcmp関数」を使用していたところ
「strcmp関数」で比較はしないほうがいいと言われたのでなんでなのか
を調べた際のメモです。

まず、strcmp関数では値を比較する際にstring型にキャストします。
strと付いているので当然かと思います。

なので、string型へキャストした際に何がどのような値になるのか注意する
必要があるということです。

なので今度から比較の際は「===」を使用していきたいと思います。


終わり

参考:
http://d.hatena.ne.jp/hnw/20090123

2012/01/22

【プログラミング】PHPプログラマについて思うこと【PHP】

PHPプログラマについて思うことがあったので書いてみようと思います。

まず、PHPは型宣言がなくすごく曖昧です。
厳密にチェックしようと思えばできるのですがそれでも言語として貧弱な所が
あります。

例えば下記のような関数があったとします。
function example($bool)
{
    if ($bool)
    {
        echo "A";
    }
    else
    {
        echo "B";
    }
}
引数に0とかnullとか以外をセットするとこの場合 「A」 が表示されます。 ですが、関数がこういう書き方をされていると
function example($bool)
{
    if ($bool === true)
    {
        echo "A";
    }
    else
    {
        echo "B";
    }
}
引数の値が 「true」 でなければ 「A」 は表示されません。 この関数の例えを踏まえてこんな会話を聞いたことがあります。 A「ここの関数はtrueを指定しないとダメじゃないの?」 B「1入れても動くんで大丈夫ですよ」 これを聞いていて僕は「何が?」と思ってしまいました。 もしPHPに使用変更があって型が厳密になったらどうするの?とか その関数を作成した担当が値を型までチェックするように変更したら?とか思います。 こういう意識を持っていない人がPHPプログラマには僕を含めて多いと思います。 型が曖昧でとっつきやすいところがPHPの特徴でありいろいろ楽できるところなんですが、 個人的にはあまり好きではないです。 自分でもPHPのそういうところに助けられたりしたことがあるのですが、 できるだけ厳密に型については扱うように心がけようと思いました。 以上なんとなく思ったことでした。 終わり

【PHP】Twitter APIを使ってつぶやきを投稿するサンプル【Twitter】

ということでPHPでTwitterAPIをつかってつぶやきを投稿するサンプルを作りました。

※Twitter APIを使うにはOAuth認証を使いますのでこちらより必要なモノを取得してください。

必要なもの
・Consumer key ・Consumer secret 前回の記事を参考にしてください。 今回はサイトURLを   http://example.com/index.php コールバックURLを   http://example.com/callback.php という感じに設定しました。 通常コールバックURLにてアクセストークンの保存処理などを行うのですが、今回は サンプルということでそのままつぶやきを投稿しています。 下記ソースです。 index.php
<?php
session_start();
require_once 'common.php';

$consumer_key    = '取得したコンシューマキー';
$consumer_secret = '取得したコンシューマシークレット';
$request_url     = 'https://api.twitter.com/oauth/request_token';
$auth_url        = 'https://api.twitter.com/oauth/authorize';

// シグネチャ作成用パラメータ
$signature_params = array(
    'oauth_consumer_key'     => $consumer_key,
    'oauth_nonce'            => md5(microtime() . mt_rand()),
    'oauth_signature_method' => 'HMAC-SHA1',
    'oauth_timestamp'        => time(),
    'oauth_version'          => '1.0',
);
// シグネチャの作成
$signature = getOAuthSignature($request_url, $signature_params, $consumer_secret);
$signature_params['oauth_signature'] = $signature;

// トークン取得用リクエスト文字列作成
$query = getRequestQuery($signature_params);

// リクエストトークン取得
$request_token = getRequestToken($request_url, $query);

// Twitterのアプリケーション認証画面へリダイレクト
header('Location: ' . $auth_url . '?oauth_token=' . $request_token);
exit;

/**
 * リクエストトークンの取得
 * @param  string $request_url   リクエストURL
 * @param  string $query         リクエストパラメータのクエリストリング
 * @return string $request_token リクエストトークン
 */
function getRequestToken($request_url, $query)
{
    $ch = curl_init();

    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_URL, $request_url . '?' . $query);

    $res = curl_exec($ch);
    curl_close($ch);

    parse_str($res, $result);
    $request_token = $result['oauth_token'];

    return $request_token;
}
callback.php
<?php
session_start();
require_once 'common.php';

$consumer_key    = '取得したコンシューマキー';
$consumer_secret = '取得したコンシューマシークレット';
$access_url      = 'https://api.twitter.com/oauth/access_token';
$update_api      = 'https://api.twitter.com/1/statuses/update.json';

// アクセストークン取得用パラメータ
$params = array(
    'oauth_consumer_key'     => $consumer_key,
    'oauth_nonce'            => md5(microtime() . mt_rand()),
    'oauth_signature_method' => 'HMAC-SHA1',
    'oauth_timestamp'        => time(),
    'oauth_token'            => $_GET['oauth_token'],
    'oauth_verifier'         => $_GET['oauth_verifier'],
    'oauth_version'          => '1.0',
);

$signature = getOAuthSignature($access_url, $params, $consumer_secret, 'POST', $_GET['oauth_token_secret']);
$params['oauth_signature'] = $signature;

// トークン取得用リクエスト文字列作成
$query = getRequestQuery($params);

// アクセストークンとシークレットの取得
$access_token = getAccessToken($access_url, $query);

// ツイート投稿パラメータ
unset($params['oauth_signature'], $params['oauth_verifier']);
$params['status'] = 'test投稿';
$params['oauth_token'] = $access_token['oauth_token'];

uksort($params, 'strnatcmp');
$signature = getOAuthSignature($update_api, $params, $consumer_secret, 'POST', $access_token['oauth_token_secret']);
$params['oauth_signature'] = $signature;

// パラメータ名でソート
uksort($params, 'strnatcmp');
$request_param = getRequestQuery($params);

echo '<pre>';
print_r(update($update_api, $request_param));
echo '</pre>';

/**
 * つぶやきの投稿
 * @param  string $update_api    update apiのURL
 * @param  string $request_param リクエストパラメータ
 * @return string $res           TwitterAPIよりのレスポンス
 */
function update($update_api, $request_param)
{
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $update_api);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $request_param);
    curl_setopt($ch, CURLOPT_HEADER, false);

    $res = curl_exec($ch);
    curl_exec($ch);

    return $res;
}

/**
 * アクセストークンの取得
 * @param  string      $access_url アクセストークン取得用URL
 * @param  assoc_array $query      アクセストークン取得用クエリ
 * @return assoc_array $result     アクセストークン と アクセストークンシークレット
 */
function getAccessToken($access_url, $query)
{
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $access_url . '?' . $query);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

    $res = curl_exec($ch);
    parse_str($res, $result);
    $access_token = $result['oauth_token'];

    return $result;
}
common.php
<?php
/**
 * シグネチャ文字列の作成
 * @param  string      $request_url     リクエストURL
 * @param  assoc_array $params          シグネチャ作成用パラメータ
 * @param  string      $consumer_secret コンシューマシークレット
 * @param  string      $method          リクエストメソッド
 * @param  string      $oauth_token     OAuth token
 * @return string      $signature       シグネチャ
 */
function getOAuthSignature($request_url, $params, $consumer_secret, $method = 'GET', $oauth_token_secret = '')
{
    $signature = '';

    $params = array_map('urlEncodeRfc', $params);
    uksort($params, 'strnatcmp');

    $param = array();
    foreach ($params as $key => $val)
    {
        $param[] = $key . '=' . $val;
    }
    $query = implode('&', $param);

    $base_array = array(
        $method,
        $request_url,
        $query,
    );
    $base_array = array_map('urlEncodeRfc', $base_array);
    $base_string = implode('&', $base_array);

    $key = array(
        $consumer_secret,
        $oauth_token_secret,
    );
    $key = array_map('urlEncodeRfc', $key);
    $key = implode('&', $key);

    // ベース文字列をシグネチャに
    $signature = base64_encode(hash_hmac('sha1', $base_string, $key, true));

    return $signature;
}

/**
 * URLエンコードをしたリクエスト用クエリストリングを作成
 * @param  assoc_array $params 作成する連想配列
 * @return string      $query  クエリストリング
 */
function getRequestQuery($params)
{
    $params = array_map('urlEncodeRfc', $params);
    $query_param = array();
    foreach ($params as $key => $val)
    {
        $query_param[] = $key . '=' . $val;
    }
    $query = implode('&', $query_param);

    return $query;
}

/**
 * URLエンコード
 * @param  string $str     エンコードする文字列
 * @return string $enc_str エンコード済み文字列
 */
function urlEncodeRfc($str)
{
    $enc_str = str_replace('%7E', '~', rawurlencode($str));

    return $enc_str;
}
流れは、index.phpでまず、リクエストトークンを取得します。 その後リクエストトークンをクエリパラメータとしてTwitterの アプリケーション認証画面にリダイレクトします。 ユーザが認証を押下した場合 コールバックURL「callback.php」 に リダイレクトされます。 リダイレクトされてきた際にGETパラメータにて 「oauth_token」 「oauth_token_secret」 の値が付加されていますので、その値を使いアクセストークンを取得します。 つぶやきを投稿する際はつぶやき投稿用パラメータを含めたシグネチャを作成し、 取得したアクセストークンを使ってリクエストを送信します。 おおまかな流れは以上になります。 終わり 関連記事: 【Twitter】TwitterのAPIを使う準備

2012/01/16

【PHP】https(SSL)環境に対してcURLの実行

https環境に対して cURL を実行した際のメモ

cURLを使う際 httpsで通信することがあると思います。
その際証明書エラーのようなものが出ます。

この警告はfopenなどのときにも出力されます。

cURLでは下記のオプションに 「false」 をセットすることによってSSL証明書の検証を
行わないようになります。

CURLOPT_SSL_VERIFYPEER
下記がサンプルソースです。
<?php
// リクエストURL
$url = "https://www.example.com/";
// リクエストパラメータ
$param = array(
    'test'  => 'Apple',
    'test2' => 'Lemon',
);
// 初期化
$ch = curl_init();

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);  // SSL証明書を検証しない
curl_setopt($ch, CURLOPT_POST, true);             // POSTメッソッドを使用
curl_setopt($ch, CURLOPT_POSTFIELDS, $param);     // リクエストパラメータを指定

// リクエストを実行
$res = curl_exec($ch);
curl_close($ch);

echo "<pre>";
var_dump($res);
echo "</pre>";
終わり

2012/01/11

【PHP】PHPのexec関数

ということで今回はexecコマンドについてのメモです。

まず、同期をとっての実行方法です。
exec('コマンド');
コマンドにはシステムコマンド(ls)とかファイルパスだったりを指定できます。 第二引数に変数を指定することにより、コマンドの結果を取得できます。 この際取得できる結果は1行ごとに配列になります。 例えば結果が
dr-xr-xr-x    2 root  wheel      512 Jan  1  2009 proc
drwxr-xr-x    2 root  wheel     2560 Sep 24  2010 rescue
drwxr-x---    5 root  wheel      512 Aug  2  2010 root
だとすると
array(
    0 => 'dr-xr-xr-x    2 root  wheel      512 Jan  1  2009 proc',
    1 => 'drwxr-xr-x    2 root  wheel     2560 Sep 24  2010 rescue',
    2 => 'drwxr-x---    5 root  wheel      512 Aug  2  2010 root',
);
このように結果が返却されます。 次に、非同期で実行する場合
exec('コマンド > dev/null &');
上記の様に記述することで非同期でコマンドを実行することができます。 コマンドの結果をdev/nullにリダイレクトしています。 また dev/null とは、Unixシステム上での スペシャルファイルで、常に空であるファイルです。 最後に &をつけバックグラウンドで実行するようにします。 これでバックグラウンドでPHPを実行したりシェルスクリプトを実行したりできます。 また、コマンドを使用する際は「escapeshellcmd関数」でエスケープします。 終わり 【追記】:2012-03-06 exec関数使用時にescapeshellcmd関数を使うだけでは どうも不十分なようです。 escapeshellcmd関数では、シングルクォート・ダブルクォートともに対になっていないと エスケープされないため意図しない動作が起こる可能性があります。 ですので、引数などはescapeshellarg関数を使用して引数ごとに エスケープを行った方がパラメータの意図しない追加などを防ぐのに有効です。 こちらのブログの記事で詳しく説明されています。 参考: PHPのescapeshellcmdの危険性 - 徳丸浩の日記

2011/12/30

【PHP】FacebookのGraphAPIを使ってウォールを投稿するサンプル【Facebook】

ということでPHPでFacebookのGraphAPIを使ってウォールを投稿するサンプルを作りました。

※FacebookのGraphAPIを使うにはOAuth認証を使うのでこちらより必要なモノを取得して
ください

必要なもの
・App ID ・App Secret 前回の記事を参考にしてください。 サービスのURLを   http://example.com/index.php という感じに設定しました。 またmixiGraphAPIだとリダイレクト先のURLも指定するのですが、FacebookのOAuth認証では リダイレクトURLをパラメータに含める方式なのでプログラム側で指定します。 リダイレクトURLはプログラム側で   http://example.com/callback.php のような感じに設定しました。 通常リダイレクトURLにてアクセストークンの保存処理などを行うのですが、今回は サンプルということでそのままウォールに投稿もしています。 下記ソースです。 index.php
<?php
// リクエストパラメータ
$param = array(
    'client_id'     => 'App ID',
    'redirect_uri'  => 'リダイレクトURL',
    'scope'         => 'status_update,offline_access',
    'response_type' => 'code',
    'display'       => 'page',
);

// 認証画面へリダイレクト
header('Location: https://www.facebook.com/dialog/oauth?' . http_build_query($param));
callback.php
<?php
if ($_GET['code'] != '')
{
    // アクセストークンの取得
    $access_token = getAccessToken($_GET['code']);
}

if ($access_token != '')
{
    // ウォールへ投稿
    $text = 'test message';
    $res = postUpdate($access_token, $text);
}

/**
 * アクセストークンの取得
 * @param  string $code         Facebookからのレスポンス
 * @return string $access_token アクセストークン
 */
function getAccessToken($code)
{
    // アクセストークン取得用URL
    $auth_url = 'https://graph.facebook.com/oauth/access_token';
    // リクエストパラメータ
    $param = array(
        'client_id'     => 'App ID',
        'client_secret' => 'App Secret',
        'code'          => $code,
        'redirect_uri'  => 'リダイレクトURL',
    );
    $auth_url .= '?' . http_build_query($param);

    // cURLでアクセストークンを取得
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_URL, $auth_url);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $param);

    $res = curl_exec($ch);
    curl_close($ch);
    parse_str($res, $res_array);

    return $res_array['access_token'];
}

/**
 * Facebookのウォールへ投稿します。
 * @param  string      $access_token アクセストークン
 * @param  string      $text         投稿内容
 * @return assoc_array $res          Facebookからのレスポンス
 */
function postUpdate($access_token, $text)
{
    // ウォール投稿API URL
    $post_url = 'https://graph.facebook.com/me/feed';

    $ch = curl_init();
    $param = array(
        'access_token' => $access_token,
        'message'      => $text,
    );

    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_URL, $post_url);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $param);

    $res = curl_exec($ch);
    curl_close($ch);

    return $res;
}
流れは大体mixiGraphAPIと一緒でした。 ですのでそちらの方も参考にしていただければと思います。 終わり 関連記事: 【Facebook】FacebookのGraphAPIを使う準備

2011/12/26

【PHP】mixiGraphAPIのOAuth認証用ライブラリを作成しました。【mixi】

ということで前回の記事で最後の方に言っていたmixiGraphAPIのOAuth認証用
ライブラリを作りました。

使い方等はreadme.txtなどに書いてありますが、至らない所が結構あると思うので
何かあればコメント欄にコメントをお願いします。

ダウンロードはこちらから

終わり


関連記事:
【mixi】mixiGraph APIを使うための準備
【PHP】phpでmixiGraphAPIを使ってmixiにつぶやきを投稿するサンプル【mixi】

2011/12/23

【PHP】phpでmixiGraphAPIを使ってmixiにつぶやきを投稿するサンプル【mixi】

phpでmixiGraphAPIを使ってつぶやきを投稿するサンプルを作ってみました。

※mixiGraphAPIを使うにはOAuth認証を使うのでこちらより必要なモノを取得してください

必要なもの
・Consumer Key ・Consumer Secret 前回の記事を参考にしてください。 前回の記事でサービスURLとリダレクトURLをそれぞれ下記のように設定しました。 ・サービスURL http://example.com/index.php ・リダイレクトURL http://example.com/callback.php こちらの話からしていきたいと思います。 まず、サービスURLとは自分で作成したサービスへの動線になります。 今回はサービスURLにアクセスした際に自動でmixiに認証しに行くように実装します。 次にリダイレクトURLですが、こちらはmixiの認証からのレスポンスを受け取るURLになります。 リダイレクトURLの方にアクセスユーザのOAuth認証用のパラメータを保存したりする処理を 実装しておけば大丈夫だと思います。 今回はサンプルということでリダイレクトURLの方でつぶやく機能もそのまま実装しました。 index.php
<?php
// 認証用パラメータ
$param = array(
    'client_id'     => '取得したConsumer Key',
    'response_type' => 'code',
    'scope'         => 'w_voice',
    'display'       => 'pc',
    'state'         => null,
);
// 認証先URL
$auth_url = 'https://mixi.jp/connect_authorize.pl';
// 認証用パラメータをクエリストリングに
$request_param = http_build_query($param, null, '&');

// リクエストURLを作成
$request_url = $auth_url . '?' . $request_param;

// 認証
header('Location: ' . $request_url);
exit;
callback.php
<?php
session_start();

$access_token = null;

// Authレスポンスの取得
$code = $_GET['code'];

if ($code != '')
{
    // アクセストークンの取得
    $access_token = getAccessToken($code);
}

// つぶやきを投稿する
if (!is_null($access_token))
{
    // 投稿内容
    $text = 'つぶやきテスト';
    $res = postVoice($text, $access_token);

    // 結果をdump
    echo "<pre>";
    var_dump($res);
    echo "</pre>";
}



/**
 * アクセストークンの取得
 * @param  string $code         Authレスポンス
 * @return string $access_token アクセストークン
 */
function getAccessToken($code)
{
    // アクセストークン取得用パラメータ
    $param = array(
        'grant_type'    => 'authorization_code',
        'client_id'     => '取得したConsumer Key',
        'client_secret' => '取得したConsumer Secret',
        'code'          => $code,
        'redirect_uri'  => 'http://example.com/callback.php',
    );

    // cURLでアクセストークンを取得する
    $ch = curl_init();

    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_URL, 'https://secure.mixi-platform.com/2/token');
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($param));

    $res = curl_exec($ch);
    curl_close($ch);

    // 返却値がjson形式なのでデコードする
    $res = json_decode($res, true);

    $access_token = $res['access_token'];

    return $access_token;
}

/**
 * つぶやきを投稿する
 * @param  string      $text         つぶやく内容
 * @param  string      $access_token アクセストークン
 * @return assoc_array $res          APIからのレスポンス
 */
function postVoice($text, $access_token)
{
    // つぶやき投稿用URL
    $voice_url = 'http://api.mixi-platform.com/2/voice/statuses';

    // つぶやき投稿用パラメータ
    $param  = array(
        'status' => $text,
    );

    // cURLでつぶやきを投稿
    $ch = curl_init();

    // リクエストヘッダを作成
    $header = array(
        'Authorization: OAuth ' . $access_token
    );

    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_URL, $voice_url);
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($param, null, '&'));
    curl_setopt($ch, CURLOPT_HTTPHEADER, $header);

    $res = curl_exec($ch);
    curl_close($ch);

    // 返却値がjson形式なのでデコードする
    $res = json_decode($res, true);

    return $res;
}
index.php(サービスURL側) 解説
まず、認証用パラメータですが、上記の5つをGETパラメータとして渡す必要があります。 ※stateパラメータは必須ではない。 注意が必要なのはscopeパラメータで、そのサービスを利用する上でそのユーザのデータに アクセスする必要がある項目になります。 今回はつぶやきの投稿を行うので「w_voice」を指定しています。 ※複数指定する場合はスペース区切りで指定する。
callback.php(リダイレクトURL側) 解説
index.phpが認証された場合にリダイレクトされてくるURLです。 こちらで認証用文字列を受け取ります。 mixiからリダイレクトURLに下記のようにGETパラメータを付加された状態でリダイレクトされてきます。
http://example.com/callback.php?code=認証用文字列
※GETパラメータ「code」はアクセストークンを取得する際に必要になります。 このGETパラメータを使いアクセストークンを取得します。 その次に取得したアクセストークンを使いつぶやき用のURLにcURLを使いPOSTメソッドでつぶやき本文を パラメータとして送信します。 ※ mixiGraphAPIからの返却値はすべてjson文字列になります。 ※ ですので、php側でこねくりまわしたりする際にはパースして配列に戻してやる 必要があります。 解説は以上になります。 不明な点がありましたらコメントにてどうぞ 今mixiGraphAPIのライブラリを作成しているのでそのうち公開できたらなーとか思ってます。 終わり 関連記事: 【mixi】mixiGraph APIを使うための準備 【PHP】mixiGraphAPIのOAuth認証用ライブラリを作成しました。【mixi】

2011/12/16

【PHP】PHPで閉じタグを書かないお話

学校では必ずphpの閉じタグ 「?>」 を書いていましたが、
いざ就職して現場に出ると綴じタグを書いていないコードに遭遇しました。

それでなんで・・・?と思ったのでその時に調べたメモです。

phpでは閉じタグを書かないことで閉じタグ以降に記述されているスペースや改行などを
出力しないように出来ます。

どういうことかというと

下記の様なコードが合ったとします。
下記のコードは実行されると文字列で「test」と出力されます。
<?php
?>


test

このような感じでSmartyなどのテンプレートエンジンを使うと 「test」と出力された後にテンプレートが表示されます。 つまりゴミが出てしまうわけですね。 上記コードのように「test」という文字列でなくても改行だけやスペースのみの場合でも ゴミとしてテンプレートと一緒に出力されてしまいます。 ゴミを出力させないために閉じタグ 「?>」 を書かないようにするという事でした。 これから習慣付けていこうと思います。 終わり

2011/12/02

【PHP】PHP+MySQLでトランザクション【MySQL】

PHP+MySQLでトランザクションをするお話です。

基本的にPHPでシステム開発を行うときは何かしらのフレームワークを使うことが多いですが、
今回はPHPのベタ書きでMySQLのトランザクション処理の仕組みについて書いてみたいと
思います。

まずトランザクション処理とは
複数テーブルの更新や挿入など別々のテーブルがお互いを参照するようなデータを
操作するときに使います。

例えば、テーブルAとテーブルBがあるとします。
テーブルBではテーブルAのPKをFKとして参照しているといった場合にどちらか一方が
こけてしまった場合データの整合性がとれなくなるためシステムを破壊しかねないです。

ですのでこのような更新をDBで行う場合はトランザクション処理は必須となります。

今回はざっくり書いてみます。
<?php

// 接続文字列
$server = 'サーバ名';
$db     = 'DB名';
$user   = 'ユーザ名';
$pass   = 'パスワード';

// MySQL接続
$con = @mysql_connect($server, $user, $pass);
if (!$con)
{
    exit('DBに接続できませんでした。');
}

// DB選択
mysql_select_db($db, $con);

try
{
    // 自動コミットをオフ
    $query = 'set autocommit = 0';
    mysql_query($query, $con);

    // トランザクションスタート
    $query = 'begin';
    mysql_query($query, $con);

    // DBにデータをINSERT
    $query  = "insert info `emp` (`id`, `name`)values('0001', 'user')";
    $result = mysql_query($query, $con);

    // クエリが成功したかどうかのチェック
    if ($result === true)
    {
        // 正常終了なのでコミット
        $query = 'commit';
        mysql_query($query, $con);
        echo 'コミットしました。';
    }
    else
    {
        // 更新失敗なのでロールバック
        $query = 'rollback';
        mysql_query($query, $con);
        echo 'ロールバックしました。';
    }

}
catch (Exception $e)
{
    // 例外が発生したのでロールバック
    $query = 'rollback';
    mysql_query($query, $con);
    echo 'ロールバックしました。';
}

// 接続をクローズ
mysql_close($con);
このような流れになるかと思います。 また、MySQLには罠がありまして、デフォルトで自動でコミットされるようになっております。 それをtryの直後に「set autocommit = 0」でオフにしています。 autocommitが1の場合はトランザクション処理中であろうともクエリが成功した場合 その場でコミットされてしまいます。 終わり