Category Archives: PHP

PHPでPOSTから取得したセッションIDでセッションを開始する

FlashのFileReferenceを使ったアップローダを作っていたところ
IE以外のブラウザではCookieが送信されない問題にぶち当たった。

そこで、CookieのデータをPOSTで送信してしまい、PHP側で無理矢理そのデータをsession_idとして認識できないかな?
と勘でやってみたところ、何故かうまくいってしまった。
ありがとうPHP。

$cookies = $_POST["cookie"];
$session_id = null;

foreach (mb_split(";", $cookies) as $cookie) {
	
	$cookie = trim($cookie);
	
	$arr = mb_split("=", $cookie);
	if (count($arr) != 2) continue;
	
	if (session_name() == $arr[0]) {
		$session_id = trim($arr[1]);
	}
	
}

$_COOKIE[session_name()] = $session_id;
	
ini_set("session.gc_probability", なんか数値);
ini_set("session.gc_divisor", なんか数値);
ini_set("session.gc_maxlifetime", なんか数値);
session_start();

これで正常にセッションが開始できた。

Flash側からはExternalInterfaceでJavascriptから
document.cookie
の値を取得して、それをPOSTしてやる。

document.cookie
の内容は、全てのCookieの値が連結された文字列なので、それをPHP側でsplit処理して解析してやり、
$_COOKIE[session_name()] = セッションID
としてやる事でPHPではクッキー内にセッションIDが入っていると認識してくれるらしい。

この
$_COOKIE[session_name()] = セッションID
が正直驚きだった。
事前にsetcookie()関数を呼び出すようなクッションページをかまさないと認識してくれないかと心配していたが、すんなりうまくいってしまった。

ちなみにFlash側のソースは以下

var _cookie = ExternalInterface.call("getCookie");	// javascriptで return document.cookie; をする関数を作成しておく

var req:URLRequest = new URLRequest(url); 
// req.requestHeaders.push(new URLRequestHeader("Cookie", _cookie));
// ↑これが使えれば一番良かったけど、FlashPlayerのセキュリティエラーになるので使えない

var variables:URLVariables = new URLVariables();
variables.cookie = _cookie;
req.data = variables;
req.method = "POST";

// アップロード
fileReference.upload(req);

Flashは素晴らしいUIが作れるものの、色々と制限やら実装抜けやら多いので苦労が絶えない。

レンタルサーバからメール送信した際にgmailで受信しない

レンタルサーバ稼動で、PHPからmb_send_mailするプログラムというのは定番かと思うけど
まれにgmailに対し送信した際に受信してくれない場合がある。

実際に体験したケースとしては、さくらレンタルサーバのスタンダードプランやVPSを利用していて、サイト上のPHPからメール送信
⇒Yahooメールには届くけれども、gmailには届いてくれない。

といったケース。

迷惑メールに分類される分にはまだいいんだけれども、gmail側が一切受信をしてくれないケースもある。

おそらく、サーバに同居している別ユーザがスパム送信などを行って(もしくは乗っ取られてスパムプログラムが動作して)gmailに大量にメールを送信しており
gmail側から「このサーバはスパムなのでメール受信しない」と判定されてしまっているのだと思う。

Yahooメールなど、他のwebメールに比べgmailはこの辺はかなり厳しい印象。

こうなってしまったら基本的には、こちら側はどうする事もできない。

とはいえ、ユーザ会員登録などでメール内に登録キー付きURLを仕込むような仕組みのサイトの場合、かなり致命的な問題となってしまう。

安プランなどで運営している場合は、サーバを移設してIPを変えてやるのが最も手っ取り早い対処となる。
もしくは経験上、数日から数十日ほど放置していると、突然なおったりもする。

段階としては、迷惑送信が停止してから数日から数十日のスパンで
・メール受信自体を拒否が解除
・迷惑メールに分類される事が解除
・通常メールに分類される
といったプロセスで状況が改善されていくらしい。

この辺はgmailのアルゴリズムによる所。

安プランのサーバは手軽な分、変な業者が同居している可能性も高まるので
なかなか判断も難しい所。

予算がある&確実なメール送信を求められているのならメール送信サービスなどを利用するのが間違いなさそう。
でもけっこう高いんだよなぁ・・

PHP・MySQL環境でIncorrect string value

ブログの内容をAPIから取得し、UTF-8環境のPHP・MySQL環境でinsertしようとした所、以下のようなエラーがでてしまった。

Incorrect string value: 'xxxxx...' for column 'カラム名' at row 1

どうやらMySQLがinsertする文字列の文字コードがおかしいからフザケンナとか何とか言いたがっているようだ。

Read more »

PHPでtwitterのつぶやき検索api

ふと思い立ったので調べてみたらとても簡単だった。

簡単なのはPHPだからってのもあるかな。

でもAPIコールするとレスポンスは結構重めなんで、乱発はイクナイっぽい。

Read more »

PHPで短縮URLを作成【bit.ly】

twitterでよく使用されているhttp://bit.ly/からはじまる短縮URL。
長いURLでも20文字に収めてくれるサービスだ。

こいつが提供しているAPIをPHPから叩く方法をメモ。
Read more »

さくらインターネットでcronでPHP起動

なんやよくやり方が分からなかったのでwgetとか使ってたけど、
こんなやり方でOKらしい

cd /home/ユーザ名; /usr/local/bin/php 起動したい.phpのフルパス

ちゃんと動いた。

最初のcdが抜けてるとダメなのね。

PHPで全角半角変換

こうゆうのがデフォで用意されている所がPHPの気持ちいい所だね
mb_convert_kana

第二引数にオプションを細かく指定もできるみたい。
うーんたまらん

【php】さくらサーバーでファイルアップロード可能容量を増やす

PHPでファイルアップロード可能サイズを調整するには
.htaccessに

php_value upload_max_filesize 30M
php_value post_max_size 30M

なんて書いてやれば良いんだけど、さくらのレンタルサーバーだとNGらしい。

で、さくらコントロールからphp.iniの編集を行ってやる必要がある。

コンパネログイン⇒PHP設定の編集
で開くtextに

upload_max_filesize=30M
post_max_size=30M

とか書いてやればOK。

ディレクトリ単位での設定はできないのかしらね?
まぁいいや。

Parse error: syntax error, unexpected $end in

PHPでこんなエラーが出てしまった場合の原因は {}の対応が崩れてしまっているため。

たとえば

<?php if(うんたら) { ?>
  <div>かんたら</div>

こんな感じで、if文やfor文で閉じ括弧を忘れてしまった場合など。。。

かくいう私もよくやります。

Can’t be used as a function parameter

PHPでfunctionの可変長引数をとりたい場合には
func_num_args()

func_get_arg()
を使う。

したらこんなエラーがでてしまった
Can’t be used as a function parameter
なんぞい。
Read more »