プロが教えるわが家の防犯対策術!

携帯サイトの会員マイページで
個人の画像をアップできる仕様を制作したいのですが
(ブログやsnsサイトによくある、アバターの代わりに
 画像をアップできる仕様です)
どうしてもDBの更新・画像のアップロード、双方ができず
困り果てております。
※メールエラーログをみてみたところ、
 メールをトリガーとしてプログラム自体は動作していた
 ものの、処理が途中でストップされておりました。

具体的には、下記のような仕様を考えています。


(1)アップしたい画像を添付して携帯メールを送信

(2)メールをトリガーとして画像アップロード&DB更新
 プログラム起動

~以下プログラムの中身の動作~
(3)届いたメールアドレス(拡張メールアドレス)から会員ID情報を
 取得

(4)会員情報テーブル(sns_user)にマッチする会員IDの列の
 image_pathの項目にアップロードした画像のパスが
 更新される。

 PHP+MySQLで制作中です。
 「update テーブル名 set where 条件~」で調べてみたものの、
 どうしても分からず質問させていただきました。
 どなたかお分かりになられる方がいらっしゃいましたら
 ご教授いただけませんでしょうか。

以下ソース内容
// ユーザー&認証コードチェック
if ($user&&$auth_code==getAuthCode($user['id'], $user['auth_string'])) {
// 認証OK
// マルチパートの場合のみメールを解析して画像を取得
if (strtolower($structure->ctype_primary) == "multipart") {
$images = getImage($structure->parts);
}

$image_save_path = null;

// 画像リストの中から1つだけ画像を取得する
foreach ($images as $image) {
// コンテンツタイプのチェック
if ($image['type'] == 'image/jpeg'
|| $image['type'] == 'image/gif'
|| $image['type'] == 'image/png') {
// ファイルとして保存
// 一時ファイルパス
$temp_path = tempnam('/tmp', 'img_');
if ($temp_path == false) {
// error
break;
}
$fp = fopen($temp_path, 'w');
if ($fp == false) {
// error
break;
}
fwrite($fp, $image['body']);
fclose($fp);

// 画像の形式と縦横サイズを取得
list($width, $height, $type) = getimagesize($temp_path);

// 認識できる形式であれば、所定のメソッドで開く

$ext = ".jpg";
$imageSource = null;
if ($type == IMAGETYPE_GIF) {
$imageSource = imagecreatefromgif($temp_path);
$ext = ".gif";
} else if ($type == IMAGETYPE_JPEG) {
$imageSource = imagecreatefromjpeg($temp_path);
} else if ($type == IMAGETYPE_PNG) {
$imageSource = imagecreatefrompng($temp_path);
$ext = ".png";
}

// 一時ファイルを消す
unlink($temp_path);

if ($imageSource) {
// ファイル名決定
$path = tempnam($image_dir, '');
$image_save_path = $path . $ext;

// 画像をケータイディレクトリへファイル保存
imagejpeg($imageSource, $image_save_path);
imagedestroy($imageSource);
break;
}
}
}

if ($image_save_path) {

// 差出人取得
$from = getFrom($structure->headers['from']);


$params = array();
$params[] = $user['id'];
$params[] = $image_save_path;

// データベースへ接続する
//
if ($db = connectDB($db_user, $db_pass, $db_name, $db_host, true)) {
$sql = "update sns_users set
image_path = '$image_save_path'
where id = '" . mysql_real_escape_string( $_SESSION['id'] ) . "'";
execQuery($db, $query, $params);

}
}


$query = "select * from sns_users where id = ''";
$result = mysql_query( $query );
$user = mysql_fetch_array( $result );



// データベースを閉じる
closeDB($db);
}
?>

A 回答 (3件)

こんにちは。



乗りかかった船ですので、余計なお世話とは思いつつ、
自分なら こうするという方法を書きます。

まず、問題箇所の切り分け。
・メールをトリガとし、PostfixからPHPスクリプトが起動されているか
・そのPHPスクリプトのほうでエラーが出てとまっていないか

(実際のところはPHPのエラーログが出てるので、
PHPスクリプトには渡っていて、
そのPHPスクリプトがエラー出して止まっているんだろうとは思います)

PHPスクリプトのほうを 極めてシンプルなものにして、
ちゃんと Postfixから そのPHPスクリプトが起動されている事を確認する。
↑は例のテキストファイル書き出しだけでいいんです。

mcryptでWarning出てるので、そこらへんだとは思うのですが、
この質問のソースに書かれていない部分でmcryptを使っている部分はないでしょうか?
とりあえず、その部分を除外して実行してみる。

とりあえず、思いつくのは こんなトコですかねぇ。。。
    • good
    • 0

こんにちは。



>そのような方にご回答いただけて本当に幸いです!
すみません。そこまで 大層なもんではないです。
自分が作ったときは、Postfixを軽くいじった程度で 何の問題もなく動いてしまったので、
トラブルが起きたときの対処というものは分かりません。

>所定のファイルにエラーログをはきださせる方法がわからなかったので
これも そんな大層なもんでもなく、 $fp = fopen("ErrorLog.txt" , "w"); です。
お高いツールを使うと処理の流れをトレースしたり、ピンポイントで止めたり、変数とかを表示できたりするらしいですが、
そんなものがないのと他の方法が思いつかない(知らない)ので、こんなやり方をしています。

基本的に自分のやり方は 思いつきの自己流ですので、あまり参考にはならないんじゃないかとも思いますが。。

Postfixで受けたメールを全てPHPに丸投げし、
PHP側で $source = file_get_contents("php://stdin"); で受け取って、
PEAR/Mail/mimeDecode で解析し、
その後の処理をしているだけです。
ちなみに、↑は全てを受け取ってしまっているので、迷惑メールが来放題です。

「Unable to initialize module」に関しては、以下のが参考になるんじゃないかと思いました。
http://bluenotes.justblog.jp/technote/2007/11/ph …

正直、自分が遭遇した事のないトラブルに関しては、
自分もググってみるぐらいしかできません。

メールログに関しては、見たところ特に問題は起きていないような感じがしました。

ほとんど、参考にならない事しか言えなくて申し訳ないです。
    • good
    • 0
この回答へのお礼

> ほとんど、参考にならない事しか言えなくて申し訳ないです。

とんでもございません!お教えいただきまして本当に感謝しております。

> メールログに関しては、見たところ特に問題は起きていないような感じがしました。
「途中でストップしている」のではなく、正常に動いているのですかね。。


「Unable to initialize module」
URL、ありがとうございました。参考にさせていただきます。

しかし問題はメール転送処理にある可能性が高いかもしれませんね。
再度見直してみます。
ありがとうございました。

お礼日時:2010/01/19 14:04

はじめまして。



その手のものは似たようなものを作った事がありますが、
とりあえず、「処理が途中でストップされておりました。」は、
何が原因で止まってたのかは分かりませんか?

メールがトリガなので、画面に表示させることはできないでしょうが、
原因の分析に必要なデータは、
そのスクリプトの中でテキストファイルを作り、
随時テキストファイルに追記していけば、
どこで止まったのか、おおよその位置が把握できます。

あまりにも初歩的なことで見落としてないかと一瞬思ったのですが、
GDは入ってますよね?
    • good
    • 0
この回答へのお礼

早速ご回答いただきまして誠にありがとうございます

> その手のものは似たようなものを作った事がありますが、
そのような方にご回答いただけて本当に幸いです!

所定のファイルにエラーログをはきださせる方法がわからなかったので
phpのログ(tail -n10 /var/log/phplog)を見てみたところ、
下記のエラーがでておりました。

PHP Warning: PHP Startup: mcrypt: Unable to initialize module
Module compiled with module API=20050922, debug=0, thread-safety=0
PHP compiled with module API=20060613, debug=0, thread-safety=0
These options need to match
in Unknown on line 0

また、maillogは下記になります。
postfix/smtpd[20732]: connect from XXXXXXXX-04.ezweb.ne.jp[59.135.39.238]
postfix/smtpd[20732]: 87ABD7500A2: client=XXXXXXXX-04.ezweb.ne.jp[59.135.39.238]
postfix/cleanup[20736]: 87ABD7500A2: message-id=<XXXXXXXXXXX@XXXXXXX.ezweb.ne.jp(エンコードされたメールアドレス)>
postfix/qmgr[19312]: 87ABD7500A2: from=<mail@ezweb.ne.jp(投稿者の携帯メールアドレス)>, size=6788, nrcpt=1 (queue active)
postfix/smtpd[20732]: disconnect from XXXXXX.ezweb.ne.jp[59.135.39.238]
postfix/local[20737]: 87ABD7500A2: to=<abc-2_a64417@abc.jp(投稿メールの受け取り先メールアドレス)>, relay=local, delay=0.14, delays=0.05/0.01/0/0.09, dsn=2.0.0, status=sent (delivered to command: /usr/bin/php /var/www/html/postdiary.php)
postfix/qmgr[19312]: 87ABD7500A2: removed
postfix/anvil[20734]: statistics: max connection rate 1/60s for (smtp:59.135.39.238)
postfix/anvil[20734]: statistics: max connection count 1 for (smtp:59.135.39.238)
postfix/anvil[20734]: statistics: max cache size 1
※ところどころXXXとしてあり、分かりにくく誠に申し訳ありません。

> GDは入ってますよね?
GDは入っております。実は掲載させていただいたものと
同じようなプログラムで、メールで画像をアップする仕様は
同サーバー環境でうまく動きましたので問題ないかと思います。

エラーログの内容が複雑で分からないのですが、
mcryptのモジュールを初期化できない の意味なのでしょうか。

お礼日時:2010/01/18 23:00

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!