携帯サイトの会員マイページで
個人の画像をアップできる仕様を制作したいのですが
(ブログや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件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
こんにちは。
乗りかかった船ですので、余計なお世話とは思いつつ、
自分なら こうするという方法を書きます。
まず、問題箇所の切り分け。
・メールをトリガとし、PostfixからPHPスクリプトが起動されているか
・そのPHPスクリプトのほうでエラーが出てとまっていないか
(実際のところはPHPのエラーログが出てるので、
PHPスクリプトには渡っていて、
そのPHPスクリプトがエラー出して止まっているんだろうとは思います)
PHPスクリプトのほうを 極めてシンプルなものにして、
ちゃんと Postfixから そのPHPスクリプトが起動されている事を確認する。
↑は例のテキストファイル書き出しだけでいいんです。
mcryptでWarning出てるので、そこらへんだとは思うのですが、
この質問のソースに書かれていない部分でmcryptを使っている部分はないでしょうか?
とりあえず、その部分を除外して実行してみる。
とりあえず、思いつくのは こんなトコですかねぇ。。。
No.2
- 回答日時:
こんにちは。
>そのような方にご回答いただけて本当に幸いです!
すみません。そこまで 大層なもんではないです。
自分が作ったときは、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 …
正直、自分が遭遇した事のないトラブルに関しては、
自分もググってみるぐらいしかできません。
メールログに関しては、見たところ特に問題は起きていないような感じがしました。
ほとんど、参考にならない事しか言えなくて申し訳ないです。
> ほとんど、参考にならない事しか言えなくて申し訳ないです。
とんでもございません!お教えいただきまして本当に感謝しております。
> メールログに関しては、見たところ特に問題は起きていないような感じがしました。
「途中でストップしている」のではなく、正常に動いているのですかね。。
「Unable to initialize module」
URL、ありがとうございました。参考にさせていただきます。
しかし問題はメール転送処理にある可能性が高いかもしれませんね。
再度見直してみます。
ありがとうございました。
No.1
- 回答日時:
はじめまして。
その手のものは似たようなものを作った事がありますが、
とりあえず、「処理が途中でストップされておりました。」は、
何が原因で止まってたのかは分かりませんか?
メールがトリガなので、画面に表示させることはできないでしょうが、
原因の分析に必要なデータは、
そのスクリプトの中でテキストファイルを作り、
随時テキストファイルに追記していけば、
どこで止まったのか、おおよその位置が把握できます。
あまりにも初歩的なことで見落としてないかと一瞬思ったのですが、
GDは入ってますよね?
早速ご回答いただきまして誠にありがとうございます
> その手のものは似たようなものを作った事がありますが、
そのような方にご回答いただけて本当に幸いです!
所定のファイルにエラーログをはきださせる方法がわからなかったので
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のモジュールを初期化できない の意味なのでしょうか。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・ハマっている「お菓子」を教えて!
- ・最近、いつ泣きましたか?
- ・夏が終わったと感じる瞬間って、どんな時?
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
拡張子php画像をjpg画像等に変...
-
libpng 24bpp rawをPNGに変換す...
-
php,mysqlにて画像パス保存/表...
-
どの画像がクリックされたかフ...
-
VBSの「MsgBox」について
-
VBAでJPGサイズ変更
-
手作業で埋め込んだ、UserForm1...
-
PostgreSQLのラージオブジェク...
-
透過PNGが透過されない!!
-
3つ以上の論理積は利用可能なの...
-
.phpファイルが、表示されない
-
PHP4対応のサーバーではinclude...
-
PHPのif文でその処理を途中で抜...
-
フォントの色を変えるには?
-
zip圧縮の種類について
-
トランザクションが原因?DBに...
-
VB.NET 最下位のディレクトリ名...
-
.phpと.incファイルの違いはな...
-
PHPでFilename cannot be empty...
-
CSV出力にHTMLが入ってしまう
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
透過PNGが透過されない!!
-
VBSの「MsgBox」について
-
拡張子php画像をjpg画像等に変...
-
Illustratorで文字と画像を流し...
-
手作業で埋め込んだ、UserForm1...
-
GDI+を使ったビット数とDPIの扱い
-
C# Excelファイルへの画像挿入。
-
VBAでJPGサイズ変更
-
GD(php)での image関数 イメ...
-
ListViewコントロールでサムネ...
-
php,mysqlにて画像パス保存/表...
-
ckfinderの画像のアップロード先
-
pictureboxに表示した画像のフ...
-
改行コードのカウント
-
<ASP.NET+C#+MSDE> JPEG画像の...
-
Web画像コピー不可にする方法
-
phpで画像がどうしても文字化け...
-
iphoneで虫眼鏡の作り方
-
<img src="http://x.y.com/cgi-...
-
PHPで吐き出した画像にリンクを...
おすすめ情報