トップページphp
1001コメント286KB

【PHP】下らねぇ質問はID出して書き込みやがれ 109

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2011/07/28(木) 06:53:37.45ID:???
質問者はまず>>1を良く読むこと(必須!)
過去スレ、関連スレ、FAQなどは>>2-10辺り
次スレは>>980が立てる。10分以内に立たない場合、宣言してから立てたい人が立てること。

◆前スレ
【PHP】下らねぇ質問はID出して書き込みやがれ 108
http://hibari.2ch.net/test/read.cgi/php/1309599473/

◆質問用テンプレ
【OS名】CentOS
【PHPのバージョン】5.3
【連携ソフトウェア】MySQL ImageMagick
【質問内容】

◆質問する時の注意
・ スレを上げて自分のIDを表示させること。(メール欄に何も記述しない。専ブラのsageチェックを外す)
・ 己の行った操作、変更などを詳しく明記すること。
・ エラーメッセージはそのまま表記すること。「エラーが出ます」だけでは回答不可。
・ 質問者として、態度をわきまえること。
・ 事前に関連リンクの公式マニュアル、リファレンス本くらいはちゃんと目を通しておくこと。
(PHPで最良の教本はこの公式マニュアル。市販の書籍は嘘が多いので鵜呑みにしない。)

◆質問後の注意
・2回目以降は最初に質問した際のレス番号を入れて、偽者防止に必ずIDを表示させること。
・解決しなくても回答をもらった場合はお礼を言うこと。
 (荒らし、煽りは除く。煽られたときも、無闇に反論せずスルーすること。)

◆回答者への注意
・誰にレスしているのか分からないと困るので、>>(アンカー)をつけて回答すること。

【その他諸注意】
・SQL・正規表現・PEAR・テンプレート(Smarty等)・フレームワークは各該当スレへ
0182nobodyさん2011/08/04(木) 11:34:10.08ID:???
クラスにしちゃうのも良いかもね
0183nobodyさん2011/08/04(木) 11:35:39.13ID:???
なんでもかんでもクラスといえばいいと思ってんの?
0184nobodyさん2011/08/04(木) 11:38:25.15ID:???
そうだねAjaxだね
0185nobodyさん2011/08/04(木) 12:42:21.82ID:???
自分も日曜鯖管・プログラマーで、Noticeエラーで悩まされて
error_reportingでとりあえず対処してる。
PHPで食べてるプロの方々は、どう対処してるんでしょ?
鯖の設定もクライアントによって様々だろうし・・・
error_reporting(1)にしてるけど、問題ないのか自分としても自信がないし
0186nobodyさん2011/08/04(木) 12:44:08.88ID:???
Noticeの対処するだけ。
とりあえずって自分で言ってるから、分かってるんだとは思うけど。
01871752011/08/04(木) 13:20:29.10ID:???
>>181

うーん。サイズが可変である以上は、やはりスクリプト中で毎回
変数をチェックするしかないですかね。

>>182
クラスでできるもんなんですか?

>>185
私も同じです。
error_reportingでの対処で問題ないか自信がないので初期化を検討してます。
0188nobodyさん2011/08/04(木) 13:28:13.82ID:???
少なくとも今からコード書くんであればerror_reportingで対処するのはどうかと思う
0189nobodyさん2011/08/04(木) 13:28:17.87ID:???
Noticeなら別にerror_reportingでも問題はない
0190nobodyさん2011/08/04(木) 13:39:30.10ID:???
>>187
http://php.net/manual/ja/class.arrayaccess.php
この辺使えばできるんじゃない?使った事ないけど
0191nobodyさん2011/08/04(木) 13:41:46.56ID:???
結局「Notice: Undefined offset」が出るようなプログラムに問題があるのは明らかだけど、
既存のプログラムを手直ししてられないならerror_reportingしかないんじゃない?
Noticeが出る場所が少ないんなら手直しすべきだなぁ
0192nobodyさん2011/08/04(木) 13:49:13.03ID:???
開発以外でエラー表示してんの?
てか定数で指定しろよ
E_ERROR=1ってWARNINGまで抑制してるんじゃないの
0193nobodyさん2011/08/04(木) 13:54:00.62ID:???
http://midilin.sakura.ne.jp/midilin/php/ppblog/?UID=1170059219
「また、PHPなどで、実行する場合は、SETと、本SQLの2本を同時実行できないっぽい・・」
とありますが出来る方法をご存知の方いらっしゃいましたら教えてください・・・
0194nobodyさん2011/08/04(木) 13:57:16.06ID:???
>>193
>>1
0195nobodyさん2011/08/04(木) 14:11:49.21ID:???
Noticeエラーについてググると、確かに出ないようにプログラムを組むべきとあるのですが、
方法論というか考え方がわかっていなくて・・・
>>175はエラーがでるのは明らかでわかるのですが、
たとえば条件分岐していて、値が入っている時と入っていない時がある場合に
issetで判定しようとするときにもでてたような記憶があるのですが、
そうした場合の初期化はあらかじめ全て0などの値をいれて初期化しておくべきなのでしょうか?
0196nobodyさん2011/08/04(木) 14:13:43.33ID:???
試してから言えよ
0197nobodyさん2011/08/04(木) 14:18:13.81ID:???
isset、is_null、array_key_exists辺りをよく読みなおした方が良い気がする
01981752011/08/04(木) 15:05:45.99ID:???
>>188-189,>>191

ありがとうございます。
一応、地道に警告出ないように書きなおします。

>>190

ありがとうございます。
こちらも試してみます。

>>195-197

試してみたところ、issetでは警告でないようですね。
is_nullでは警告が出ました。
0199nobodyさん2011/08/04(木) 19:14:55.20ID:???
preg_replace ()の $pattern句は普通の正規表現は受付ないのか?
バカヤロー
0200nobodyさん2011/08/04(木) 19:21:22.05ID:???
>>199
「普通の」の定義は何?
0201nobodyさん2011/08/04(木) 19:29:17.08ID:???
>>199
POSIXじゃないってことか?これでも読め
http://www.php.net/manual/ja/pcre.pattern.php
0202nobodyさん2011/08/04(木) 21:09:11.26ID:???
POSIXが通常だとでも思ってたんだろうか?w
0203nobodyさん2011/08/04(木) 23:49:49.51ID:???
PHPをWindowsでやるメリットってなんかあるかな。
0204nobodyさん2011/08/04(木) 23:59:19.75ID:???
>>203
・Windows PCしか持っていない
・Linuxを知らない、覚える気が無い
こういう人でもPHPを利用できるということだろう
そもそもOSに依存しないのが理想的とも言える
0205nobodyさん2011/08/05(金) 00:05:56.98ID:???
逆にPHPをLinuxでやるメリットってあるのかな?
0206nobodyさん2011/08/05(金) 00:30:42.60ID:???
>>205
・Linux PCしか持っていない
・Windowsを知らない、覚える気が無い
・複数台のPCに入れるWindowsの金がない > 俺
こういう人でもPHPを利用できるということだろう
0207nobodyさん2011/08/05(金) 01:10:24.19ID:???
ちょっとアレなんだがPCの仮想化ってのはみんなしないもんなの?
0208nobodyさん2011/08/05(金) 01:52:58.08ID:i/Iug6bT
WinXp、PHP5.2、Operaで
echo preg_replace("/([も])/","$1あ","まみむめも");
とすると「?あ???あ???あ?あ??あ?あ??あ?あ?あ」と出ました。

「まみむめもあ」に置き換えるつもりですが、どうしてこうなるのでしょう?
簡単なことかもしれませんが調べても分かりません。
0209nobodyさん2011/08/05(金) 01:53:37.67ID:???
ここのみなさん優秀そうだけど、元々他の言語とかでプログラミングしてたの?
phpを最初に勉強するとき参考にしたサイトとか
あれば教えて下さい。公式マニュアルサイト以外で
0210nobodyさん2011/08/05(金) 01:55:06.64ID:???
>>209
「PHP 入門」でぐぐれ
プログラムが初めてならプログラムでぐぐれ
あとはPHPの絵本やCの絵本読め
0211nobodyさん2011/08/05(金) 02:09:31.47ID:???
>>210
ググッてきました、リファレンス本買わなくてもいいくらい
解説サイトありますね。自分がわかりやすいところ使います

PHPの絵本はわかるけど、何故にCの絵本まで
読む必要があるのでしょうか?
参考書は最低1冊は必要なのかな
0212nobodyさん2011/08/05(金) 02:46:50.50ID:???
うん、初心者ということで大目に見ていたけど、まずはスレタイと>>1を読もうな
0213nobodyさん2011/08/05(金) 03:37:14.74ID:???
>>211
「PHPマニュアル」という本家の解説本がネット上にあるぞ。

多くのスクリプト言語(perl,PHP,ruby,Python等)の書式や制御式はCをルーツとしているから言ってるのじゃないか。
しかし、英語のルーツがラテン語だからといって、ラテン語を知る必要はないわな。
0214nobodyさん2011/08/05(金) 04:03:35.52ID:???
>>211
超初歩の段階を最も丁寧に教えているのは、C関連の書籍に多い。
他の言語は、超初歩の段階は知ってて当然だろw ばーかw だったり、
酷いものになると、Cの基礎を知っている前提で書かれていたりする。
0215nobodyさん2011/08/05(金) 05:33:01.90ID:???
PHPからシェルスクリプトを実行したいのですが
想定通りの動作をしません。

PHPスクリプトindex.phpとシェルスクリプトtest.shは同じディレクトリ内
に配置しており、
index.phpには以下のように記述してあります。
<?php
$cmd = "./test.sh";
$ret = shell_exec( escapeshellcmd($cmd) );
print $ret;
?>

test.shには以下のように記述してあり、アクセス権限は711になっています。
#!/bin/bash
echo "AAA"


上記がうまく行かなかったので
C++で生成した以下のようなプログラムをindex.htmlと同じディレクトリに配置し、
test.shと同じ方法でPHPから実行したら、想定通りにBBBが出力されました。
#include <iostream>
using namespace std;

int main( )
{
cout << "BBB" << endl;
}


問題点はどこでしょうか?
よろしくお願いいたします。
PHPのバージョンは 5.1.6 です。
02162152011/08/05(金) 05:50:50.80ID:???
>>215
肝心なことを書き忘れていました。
「index.phpからtest.shを実行しても、AAAが表示されない」
というのが現在の問題点です。

シェルスクリプトもC++も同じように標準出力に出力しているのに
違いが出てしまうので困惑しています。
0217nobodyさん2011/08/05(金) 07:32:46.91ID:bQIZhMIz
http://blogs.yahoo.co.jp/nonpipo/3382183.html
↑のように、設定して
DB側の構造はutf8_general_ciにしてるんですが、
phpファイルで呼んだときに
一部日本語の文字が化けてしまいます。
おおまかな原因がありそうだったら教えてもらえますか?
文字化けも
ほむらちゃ→ほ(読み込めない文字)?らち
みたく、一部が見れるんですよね... こういう文字化けの仕方は経験が
無かったので、質問させていただきました
0218nobodyさん2011/08/05(金) 07:40:59.16ID:???
>>215
>>1
0219nobodyさん2011/08/05(金) 09:06:24.32ID:???
>>217
原因絞り込む為にとりあえずhttp_outputをpassとかにしてみたらば?
0220nobodyさん2011/08/05(金) 09:52:41.07ID:bQIZhMIz
>>219さんレスありがとう
モバイル対応にスクリプトを弄っていて
絵文字対策の部分でSJISコードがあったのを見落としていました。
解決です
0221nobodyさん2011/08/05(金) 15:02:26.75ID:???
????●
0222nobodyさん2011/08/05(金) 18:02:05.75ID:kOt9+/Uj
WindowsXP PHP5.3 SQLiteをPDOを使って操作しています。
コーディングミスで、
トランザクション中に無限ループしてしまいました。
それ以降select文以外のいかなる動作も受け付けなくなってしまったのですが、
どうしたらいいでしょうか?
updateやinsertを行うとmax_execution_timeの60秒まで砂時計が回っています。
0223nobodyさん2011/08/05(金) 18:22:24.61ID:???
>>222
砂時計を止める
02242222011/08/05(金) 18:57:24.85ID:kOt9+/Uj
Apacheを再起動したら解放されました。
そしてもう1度実行してみたら正常に実行されました。
無限ループにはなっていなかったようです。
一体なんだったんでしょう・・・
02252222011/08/05(金) 19:04:32.45ID:kOt9+/Uj
すみません。原因はコード戻していったところわかりました。
PDOStatement::executeメソッドをexecとしてトランザクション中に実行してそんなメソッドないとFetal Errorが出てました。
どっちみちエラーでトランザクションを正常終了できなかったために起きた現象のようですが、
Apache再起動以外に何か解決方法はあるのでしょうか?
詳しい方教えてください。
0226nobodyさん2011/08/05(金) 19:13:46.02ID:???
なんか書き込めない
0227nobodyさん2011/08/05(金) 19:16:05.07ID:???
***.php?url=
g4z5s4m453w2p22636r4r2n4x5j4u5e5l5k4l414l4r5f4r5m274s5v5w2o5q
5i4d43466r5q3t4t483y224v3e484r47404q4d4h4f406

http://とあるサイトのドメイン.com/ から始まるURLなんですけど
何形式の暗号かわかりますか?
今までbase64だったんですが変えたみたいで・・
0228nobodyさん2011/08/05(金) 19:16:32.52ID:hKMJhK9s
ID忘れました
すみません。。
0229nobodyさん2011/08/05(金) 19:52:35.53ID:???
>>225
デッドロックは書いたコードに原因がある可能性が高いので
それを出さなきゃ誰も答えられない

> PDOStatement::executeメソッドをexecとしてトランザクション中に実行してそんなメソッドないとFetal Errorが出てました。
PDO#query辺りでfalseが返ってきてるんだろうが
そこは自分でチェックしなさいよって話
http://www.php.net/manual/ja/pdo.error-handling.php

>>228
スレ違い
02302222011/08/05(金) 20:24:33.75ID:kOt9+/Uj
>>229
try {
$db = new PDO('sqlite:test.db');
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$db->beginTransaction();
$stmt = $db->prepare('insert into hoge (foo, bar) values (?, ?)');
$stmt->exec(array('aaa', 'bbb'));
$db->commit();
} catch (PDOException $e) {
$db->rollBack();
}

$stmt->execute();と書くべきところを、
$stmt->exec();という存在しないメソッドを呼び出すことにより、fetal errorが出ます。
ちなみにsetAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
を指定してるにもかかわらず例外ブロックには行きませんでした。
これによりロールバックが出来ないため正常な終了ができないということだと思います。
0231nobodyさん2011/08/05(金) 20:31:48.81ID:???
>>225
try catchしなよ。
DB操作に失敗したときの処理を入れとかないと、アクセス過多な時サーバー道連れになっちゃうよ!
0232nobodyさん2011/08/05(金) 20:32:30.87ID:???
してるじゃん
02332222011/08/05(金) 20:44:04.36ID:kOt9+/Uj
すみません。
stmt(文)にも設定しないとだめなんですね。
$stmt->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
としたところ$stmtでの例外も投げてくれるようになりました。
冗長な気がしますが、これからは文にも指定したいと思います。
02342222011/08/05(金) 20:51:54.40ID:kOt9+/Uj
すみません。ウソつきました。
$stmt->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
この文がだめで例外が出ていました。
ほんとすみません。
やっぱコーディングミスがないように気をつけなければならないようですね。
SQLiteのデッドロック情報少なくてどうしたらいいのか・・・
0235nobodyさん2011/08/05(金) 21:58:34.95ID:???
確かに初歩の本はCが・・というか、基本情報とか大学の授業とかで最初の言語のお勉強はたぶんCなんだろな。
俺はBasicだったけどな!

86C試食版?とか言うのはやったことがある。
つか、Cが一番概念がわかりやすいというか、とりあえず何にもわからなくても何とか動いちゃうPHPよりは
後々のことを考えたらよいんじゃないかなあと。
0236nobodyさん2011/08/05(金) 22:24:12.31ID:???
↓こんな感じでinclude_pathをプログラム中で追加しようとしているんですができません。

$include_path = ini_get('include_path');
$include_path .= PATH_SEPARATOR . realpath('../lib');
echo $include_path;
echo '<hr>';
ini_set($include_path);
echo ini_get('include_path');

ちなみに環境はPHP5.3.6のPHP-FPMです。
動的に追加しようとしているのは、php.iniで変更しても反映されないからです。
PHP-FPMに何か設定がありますか?
0237nobodyさん2011/08/05(金) 22:26:21.15ID:???
あ、すいません。
ソースを間違えてました。

ini_set('include_path',$include_path);
0238nobodyさん2011/08/05(金) 22:26:43.00ID:???
しかもID出してなかったっす。すいません。
0239nobodyさん2011/08/05(金) 22:29:01.75ID:???
>>236
realpathを使わずにフルパスを自分で書いてみる
それで思い通りに動いたならrealpathのマニュアルを熟読
0240nobodyさん2011/08/05(金) 22:33:20.85ID:???
オブジェクト指向で書けないPGはゴミですか?
何でもincludeしてるんですが
0241nobodyさん2011/08/05(金) 22:33:56.92ID:???
ID出さない質問者はクズだけど?
0242nobodyさん2011/08/05(金) 22:34:54.27ID:???
顔を真っ赤にしての即レスお疲れ様です
02432402011/08/05(金) 22:37:14.39ID:???
自己解決したのでもういいです
02442412011/08/05(金) 22:38:43.86ID:???
ごめんなさい、俺が悪かったです
02452422011/08/05(金) 22:40:16.29ID:???
はぁ?くそが氏ねよ
0246nobodyさん2011/08/05(金) 22:40:28.43ID:???
includeとオブジェクト指向が関係あると思ってるバカはGを名乗る資格のないゴミ野郎なのは確かですね
0247nobodyさん2011/08/05(金) 22:42:42.38ID:???
はあ?フレームワーク使ったことないだろお前
0248nobodyさん2011/08/05(金) 22:42:46.90ID:???
オブジェクト指向しかないと思ってる点もクズとしてふさわしい点だね
0249nobodyさん2011/08/05(金) 22:45:14.40ID:???
PHPでオブジェクト指向笑(
0250nobodyさん2011/08/05(金) 22:46:28.42ID:???
Javaのimportを否定するようなもんだな
0251nobodyさん2011/08/05(金) 22:50:58.20ID:???
テンプレート言語なのにSmarty使ってるバカみたいなもんだな
0252nobodyさん2011/08/05(金) 22:53:42.60ID:???
MVCモデルとか恥ずかしいよな
0253nobodyさん2011/08/05(金) 22:56:07.24ID:???
230をくだらん話で流すなよ
0254nobodyさん2011/08/05(金) 22:56:12.88ID:???
テンプレート言語じゃねぇしw
0255nobodyさん2011/08/05(金) 22:59:19.86ID:+OkG+2Fo
画像のアップロードの処理を作ってるんですがうまくいきません
move_uploaded_file($_FILES['eventPic1']['tmp_name'], $eventPic_keep1); に対して
failed to open stream: No such file or directory といわれるわけですが、

var_dump($_FILES['eventPic1']);すると以下のようになり、tmp_nameはあるのではと思います
array(5) { ["name"]=> string(12) "kangaroo.jpg" ["type"]=> string(10) "image/jpeg" ["tmp_name"]=> string(14) "/tmp/phpplztTz"
["error"]=> int(0) ["size"]=> int(65553) }

でも、実際にサーバで ls -la /tmpをすると以下のようなファイルは見つかります。
-rw------- 1 apache apache 11312 8月 5 22:48 sess_c9qn85ga588h2s0la6u04vl2d0
※処理の時間のタイムスタンプをもつファイルはこれだけです

どういうことなんでしょうか?
本来なら ls -la /tmp で /tmp/phpplztTzが見つからないといけないんですよね?
0256nobodyさん2011/08/05(金) 23:00:21.33ID:???
PHPはプログラム言語ではなく、HTMLテンプレート言語である。
そしてそのテンプレート言語に思いつく限りの魅力的な機能を盛りに盛った言語であるということ。
これはPHPの出自を思い返せば納得のいく話。

にもかかわらず、PHPは5になってオブジェクト指向のための構文まで備えちゃったそうですね。
そして、もはやPHPはプログラム言語らしさを持ってしまった。
他の言語でできることの多くもPHPでできちゃうようになっちゃいました。

結構なことです。僕もたまに電子レンジで洗濯もできればいいのになんて考えることがあります。
ついでにこたつ代わりにもなってくれればそれに越したことはない。

でもきっと電子レンジで洗濯ができないのには理由があると思います。僕は高校で物理学が得意
じゃなかったのでよくわからないですが、きっと水道をつなぐ穴がないからとか、そういう理由だと
思います。

それでもいろんな機能を盛り込んだ電子レンジ、じゃなくてPHPは、ここにきて本来の目的を見失
っている気がします。それもPHP自身さえも自分が何者であるかわからなくなるほどに。
0257nobodyさん2011/08/05(金) 23:03:24.36ID:???
>>256
http://yuukiremix.s33.xrea.com/chirashi/
0258nobodyさん2011/08/06(土) 00:11:36.41ID:???
>>230
例外やFATALエラーも関係ない
PDOオブジェクトが破棄される時点で
sqlite3_close()が呼び出されるのでデッドロックになりようがないと思うんだけどな
http://www.sqlite.org/c3ref/close.html
> If sqlite3_close() is invoked while a transaction is open, the transaction is automatically rolled back.
今度デッドロックが発生したら *.sqlite-journal ファイルが残ってないか、
残っていたらどのプロセスが開いているか確認してみたら?

>>255
$eventPic_keep1 のディレクトリは存在する?ファイルは書き込める?
02592552011/08/06(土) 00:45:35.45ID:???
>>258
アドバイスありがとうございます
ウッカリしてました、パーミッションが書き込み禁止になってました
ファイルでなくてディレクトリ側の問題とは… 以後注意します。ありがとうございました
02602272011/08/06(土) 02:42:32.61ID:???
誰か分かりませんか?
phpで使える可逆暗号だと思えんですが
0261nobodyさん2011/08/06(土) 03:15:41.34ID:???
スレタイが読めませんか?
0262nobodyさん2011/08/06(土) 08:48:42.39ID:???
↑の書込みを見て欲しい。
なんとつまらない書込みだろうか。
義務教育を終えていない小学生であったとしても
多少のヒネリを加えて書き込む事は容易いはずである。
しかしこの書込み内容からはその形跡は微塵も感じられない。

彼の脳に重大な障害が発生している事は誰の目にも明らかだろう。
恐らく彼は経済的な事情で十分な治療を受ける事が困難な状況に陥っているに違いない。
この一見無意味としか思えない彼の書込みは、
現在の医療システムの見直しを訴えたメッセージなのではなかろうか。
0263nobodyさん2011/08/06(土) 09:13:45.97ID:???
>260
いままでbase64でデコードした事もあるんなら、その暗号の元が何だったかわかるんでね?
暗号について少しでも学んだ事があるんなら分かるはずだが、元と暗号化された後のサンプルが無い事には特定できない。
02642222011/08/06(土) 10:02:22.66ID:JkSTeXHr
>>258
返信ありがとうございます。
再現してやってみたところやはりデッドロックっぽいことになっています。
デッドロックではないのかもしれませんが、select以外のクエリは受け付けません。

>>230でfatal errorを出した直後では*.sqlite-journalは存在しませんが、
同じデータベースで問題のないスクリプトからinsertやupdateをしようとすると、
*.sqlite-journalが作成され、max_execution_timeになったところで削除されます。
削除されたところで、insertやupdateを再び行うと同様の現象になります。
タイムアウトまで次の操作を受け付けず、次の操作を受け付けたところで、
タイムアウトまで何もしないためデッドロックっぽいことになっています。
Apacheを再起動したところで、ようやくinsertやupdateを受け付けてくれます。
02652552011/08/06(土) 14:46:21.36ID:Oz13PhNe
すみません、255なんですが、画像のアップローダを作っててまた問題が発生しました
処理はありきたりで、 アップロードフォーム>確認画面>登録・完了画面 という流れなんですが
確認画面でプレビューするとき元の画像が90度回転して表示されてしまいます

正確に流れを書くと
・確認画面で、画像がアップされたらtempディレクトリから保存用ディレクトリに移動(>>255で書いた処理:move_uploaded_file)
・その後、保存用ディレクトリに移動したファイルを引数にして 出力用.phpで出力
 <img src="imgoutput.php?file=*********.jpg" />という形
・出力用.phpは以下
<?php
$file= $_GET['file'];
header("Content-type: image/jpeg");
readfile($file);
?>

これをやったところ、元は縦長だった画像が横回転して横長画像として表示されてしまいます
何が原因でしょうか? 何度も質問してすみません
02662552011/08/06(土) 14:51:45.80ID:Oz13PhNe
すみません、書き忘れてました
<img>タグの中に入れずに、ブラウザで直接 http://******/imgoutput.php?file=******.jpg をURLとして開くと
正常に、縦長画像のまま表示されます
0267nobodyさん2011/08/06(土) 17:56:47.57ID:???
>>265
長い。3行にまとめてくれ
0268nobodyさん2011/08/06(土) 18:14:44.06ID:???
>>267
確認画面でプレビューするとき元の画像が90度回転して表示されてしまいます
元は縦長だった画像が横回転して横長画像として表示されてしまいます
何が原因でしょうか? 何度も質問してすみません
0269nobodyさん2011/08/06(土) 18:20:04.43ID:???
>>264
*.sqlite-journal が削除されるのなら
リクエスト終了時にトランザクションも終了している訳だ
その問題のないスクリプトとやらも晒して貰えないだろうか
できれば再現する最小のコードで
02702222011/08/06(土) 19:23:37.84ID:DEQATyEe
>>269
返信ありがとうございます。
そしてすみませんでした。>>230は簡素化しすぎでした。
>>230の例だと問題ないことを確認しています。
実際のスクリプトは以下のようになっています。

1.まずDBを作ります a.php
<?php
$db = new PDO('sqlite:test.db');
$db->query('create table if not exists hoge (id integer not null primary key, foo text not null)');
?>

2.とりあえず中身を入れます b.php
<?php
$db = new PDO('sqlite:test.db');
for ($i = 0; $i < 100; $i++) {
$db->query('insert into hoge (foo) values ("aaa")');
}
?>

続く
02712222011/08/06(土) 19:30:52.48ID:DEQATyEe
3.fooカラムの前後に/を入れたものに更新するスクリプトでわざとエラーを起こさせます c.php
<?php
try {
$db = new PDO('sqlite:test.db');
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$length = $db->query('select count(*) from hoge')->fetch(); //登録されてる件数を取得します
$offset = 0;
$db->beginTransaction(); //トランザクション開始
while ($length[0] > $offset) {
$sql = 'select id, foo from hoge limit 10 offset ' . $offset; //メモリを考慮して10件ずつ更新します
$stmt = $db->prepare('update hoge set foo = ? where id = ?');
foreach ($db->query($sql) as $row) {
$stmt->exec(array('/'.$row['foo'].'/', $row['id'])); //ここでわざとエラーしてます executeなら問題なく更新できます
}
$stmt = null;
$offset += 10;
}
$db->commit();
} catch (PDOException $e) {
try {
$db->rollBack();
} catch (PDOException $e) {
}
}
?>

4.2のb.phpを実行するとデッドロックっぽいことになってるのが確認できます。

こんな感じになります。最後のコードが長くなりすみません。
0272nobodyさん2011/08/06(土) 19:46:23.95ID:???
>>268
ID
0273nobodyさん2011/08/06(土) 19:51:40.68ID:???
>>271
primary重複してると思うが
02742222011/08/06(土) 19:59:42.67ID:DEQATyEe
>>273
primary keyのことですか?

>>270の一番最初のスクリプトを見てもらえばわかりますが、

create table if not exists hoge (
id integer not null primary key,
foo text not null
)

としてるので重複はしてないです。
他のことを言ってるのならすみません。
0275nobodyさん2011/08/06(土) 20:00:28.97ID:???
>>265
Exif情報を消してみ
02762222011/08/06(土) 20:00:56.10ID:???
>>273
あ、すみません。意味がわかりました。
SQLiteではinteger型で主キーカラムはオートインクリメントになります。
02772222011/08/06(土) 20:35:12.85ID:DEQATyEe
>>271はややこしいので、さらに簡素化させて再現できました。
hello()は存在しない関数です。

try {
$db = new PDO('sqlite:test.db');
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$db->beginTransaction();
foreach ($db->query('select * from hoge') as $row) {
hello();
}
$db->commit();
} catch (PDOException $e) {
try {
$db->rollBack();
} catch (PDOException $e) {
}
}

どうやら、foreachで取るところの中でエラーが起きるとまずいようです。
PDO::queryの例として紹介されてるやり方なんですが、なぜこんなことに・・・
http://www.php.net/manual/ja/pdo.query.php
0278nobodyさん2011/08/06(土) 20:43:13.64ID:???
sqliteなんか使うな
0279nobodyさん2011/08/06(土) 20:52:04.75ID:???
>>268
アップする画像を直接ブラウザで表示してみ
02802692011/08/06(土) 21:29:46.39ID:???
>>277
確かに PDOStatement を foreach でイテレートした時だけロックが開放されてないな
https://bugs.php.net/report.php から報告した方がいい

$con = new PDO('sqlite:test.db');
if (!$con->query("SELECT 1 FROM sqlite_master WHERE type='table' AND name='t'")->fetch()) {
    $con->query('CREATE TABLE t (c INT)');
}

$con->query('INSERT INTO t VALUES (1)');

foreach ($con->query('SELECT * FROM t LIMIT 1') as $row) {
    trigger_error('abort', E_USER_ERROR); # test.db not unlocking
}


バフフィックスされるまでの回避策は
foreach($result as $row) {
を止めて
foreach ($result->fetchAll() as $row) {
または
while ($row = $result->fetch()) {
スタイルを利用するぐらいか
02812222011/08/06(土) 21:35:53.60ID:DEQATyEe
>>280
ありがとうございます。
PHPのバグなんですかね?
英語苦手ですが頑張って報告してみます。

回避策も載せていただきありがとうございます。
早速適用したいと思います。
■ このスレッドは過去ログ倉庫に格納されています