【PHP】質問スレッドpart18【php】
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
04/06/14 14:36ID:???・新規質問の方は上げてください。age進行でお願いします。
・質問する際には環境も明記。
・正しい日本語で分かりやすく。
・レスがつかないからって逆切れする厨お断り。
・解決しなくてもこたえてもらったら礼を。
■本家
http://www.php.net/
■日本 PHP ユーザ会
http://www.php.gr.jp/
■PHP マニュアル
http://www.php.net/manual/ja/
■PEAR マニュアル
http://pear.php.net/manual/ja/
過去スレ, 関連スレ等>>2-4
抜けているものがあったら補足願います
007572
04/06/16 16:00ID:hmUL29ON文字コードがEUCっていうのは関係あるのでしょうか?
0076nobodyさん
04/06/16 16:14ID:???デフォルトだと内部エンコーディングが使われるので、もし違うなら
mb_regex_encodingで設定。
あってるなら、ちとわからぬ。
ちなみにphp4.2.0以上なので、それ以下なら使えないっぽ。
007772
04/06/16 16:25ID:hmUL29ON原因はなんだろう・・
直接 文字を入れた変数になら置換できるのに・・
0078nobodyさん
04/06/16 16:40ID:???マテ、配列からちゃんととれているのか?
配列は値が入っているのか?
print_r($array);
print "{$array[0]}";
$str = $array[0];
print "{$str}";
これで全部表示される事を確認したまい。
007972
04/06/16 17:06ID:hmUL29ON0080nobodyさん
04/06/16 17:14ID:???(;´Д`)?
あー、問題なければその配列の作成部分から取得->置き換え->出力までの流れを書いてみてくれ。
もうさっぱりだ。
0081nobodyさん
04/06/16 17:15ID:???0082nobodyさん
04/06/16 17:17ID:???0083nobodyさん
04/06/16 17:18ID:???0085nobodyさん
04/06/16 19:02ID:FlwZGV+n入力フォームから追加して、一覧にするまではできました。
問題は、編集時に文字化けが起こるんです。
list.phpが一覧表で、こんな感じに出力してます。
echo '<td><a href="redit.php?mode=edit&sid='.$row["sid"].'&brand='.$row["brand"].'&item='.$row["item"].'&c_price='.$row["c_price"].">編集</a></td>';
echo "<td> ".$row["sid"]."</td>\n";
echo "<td> ".$row["brand"]."</td>\n";
echo "<td> ".$row["item"]."</td>\n";
echo "<td> ".$row["c_price"]."</td>\n";
redit.phpへ $mode = 'edit' の時編集モードに入り、各値をGETで渡して、
echo '<form action="'.$_SERVER["PHP_SELF"].'?mode=edit&sid='.$sid.'" method="post">';
echo "<font size=\"3\"><strong>編集/削除</strong></font>";
echo '<tr align="center"><th>ブランド名</th><td><input type="text" name="brand" size="30" value="'.$brand.'"></td></tr>';
echo '<tr align="center"><th>アイテム</th><td><input type="text" name="item" size="30" value="'.$item.'"></td></tr>';
echo '<tr align="center"><th>仕入原価</th><td><input type="text" name="c_price" size="30" value="'.$c_price.'"></td></tr>';
echo "<tr align=\"center\"><td colspan=\"2\"><input type=\"submit\" name=\"post_mode\" value=\"編集\">
このように、valueで値をフォームに表示していますが、'ム'とか、ある一定の文字で文字化けが起こるんです。
PHPにも禁止文字ってあるんですかね?
この対処方をどなたか教えて頂けませんでしょうか?
文字コードはeuc で作成していて、サーバーLinuxでeucです。
0086nobodyさん
04/06/16 19:06ID:???http://jp.php.net/mbstring
0087nobodyさん
04/06/16 19:19ID:???とりあえずphp.iniかhttpd.confの文字設定あたりかな?
0088nobodyさん
04/06/16 19:30ID:FlwZGV+nご返答ありがとうございます。
さっきのURLのところの
PHP 4.3.0以降、このオプション --enable-mbstr-enc-trans は廃止され、mbstring.encoding_translation に変更となります。HTTP入力文字エンコーディング変換は、 このオプションをOnに設定した場合のみ 有効となります。 (デフォルトは、Offです。)
この辺が関係あるのかなとも思いますが、今は自鯖なんで設定いじれるからいいんですが
サーバーの仕様に関係なく表示させる方法ってないもんですかね?
そのまま処理が問題だとすると
フォームから追加するときに、sjisでSQLに入ってるから、
それをeucで表示しようとして、文字が化けるってことですかね?
でも、リストでは化けないので。。。うーん
0089nobodyさん
04/06/16 20:04ID:???1つ前のページからちゃんときてない場合(直リン、お気に入り等)は見れないようにしたいんです。
どうやるんですか?
0090nobodyさん
04/06/16 20:11ID:???そうならlistのほうもsqlから取った値は派手に化けるかと思うんだけど、、。
listでは化けないのにreditで化けるということは、reditへgetで値が渡ってくる時に、
ブラウザがエンコードした文字列の処理でこけてるということっぽい。
ムが化けたりするってことはブラウザからはsjisで来てるんだろうけど、
mb_detect_encoding()でエンコードが所望のものかどうかチェックしてみたほうがいいかも。
ブラウザからの値を内部エンコに変換する方法としは、iniをいじらないなら、
reditのほうでmb_language() + mb_http_input()で入力値を自動変換したり、
$_getの各値をmb_convert_encodingやjcode.phpで逐一変換してから処理するとか。
0091nobodyさん
04/06/16 20:13ID:BaSzqMZ7わからんけど
<a href="redit.php?mode=edit&sid='.urlencode($row["sid"]).'&brand='.urlencode($row["brand"]).'&item=以下略
はどうでしょう。
0092nobodyさん
04/06/16 20:19ID:???ブラウザが送ってくるrefererを見る。
リファラを送る機能の無いブラウザやセキュリティ対策ソフトを入れてるヒトは巻き添えで見られない。
.htaccessなど鯖側でやるものでphpではやらない。
session使えばもう少し複雑なコントロールもできるかな。
0093nobodyさん
04/06/16 20:23ID:???まあその辺りだろうな。
91のやり方は変更が少なくていいと思うが、
ユーザから編集後の文字列が渡ってくるわけだから、
どのみちエンコードは変換する必要がでてくることないか?
009472
04/06/16 21:37ID:hmUL29ON$fp = fopen($file,"r");
flock($fp, 1);
$file = fread($fp , filesize($file));
$file=mb_convert_encoding($file,"EUC","auto");
$csv=split("[\n]",$file);
for($i=1;$i<count($csv)-1;$i++){
$array=split(",",$csv[$i]);
$str=$array[11];
$str=mb_ereg_replace("あ","い",$str);
echo $str;
}
こんな感じでしょうか?
0097nobodyさん
04/06/16 22:13ID:???0100nobodyさん
04/06/17 00:24ID:???先のこと考えずに作るなら 取りあえず何にしてる?
0101nobodyさん
04/06/17 00:35ID:???0102nobodyさん
04/06/17 00:42ID:???OSがEUCなんでスクリプトもDBもEUCにしてる。
下手な小細工要らないし。スプリクトそのものはWin上で
EUCと改行コードLFで書いているんだけどな。
んだけど、UTF8なFedoraCore鯖がそろそろまわってきそうな悪寒。
文字コードそのものはFTPで転送するときに変換すりゃ済むのだが、
メタタグも書き換えるのは面倒そう。http鯖の設定でしのぐ方が
いいのか?
0103nobodyさん
04/06/17 00:52ID:???0104nobodyさん
04/06/17 00:58ID:???簡単な掲示板みたいのを作っているのですが入力されたテキストを
ファイルに保存する際に1件につき1行で格納したいと思います。
ファイルから読み出して表示する際には改行もありの状態にしたいので
保存・読み込みのそれぞれで、テキスト中の文字を以下のように相互変換して
やれば良いかなと思ったのですが・・・
[CR]←→"\r" [LF]←→"\n" \←→"\\"
下記のコードで、$s1 と %s3 が等しければ、相互変換は可能ということになりますよね?
$arr1 = array("\\", "\r", "\n");
$arr2 = array("\\\\", "\\r", "\\n");
$s1 = "ABC\r\nEFG \1,000";
$s2 = str_replace($arr1, $arr2, $s1);
$s3 = str_replace($arr2, $arr1, $s2);
echo "<pre>" . $s1 . </pre>";
echo "<pre>" . $s3 . </pre>";
ところが $s1が上のような場合は問題なく$s3で元に戻るのですが
$s1 = "ABC\\nDEF\\nGHI\\JKL"
などとすると元にもどりません。
何か間違っているでしょうか。
長文ですみませんが、ご教授ください。
0105104
04/06/17 01:00ID:???正しくはこうです。
echo "<pre>" . $s1 . "</pre>";
echo "<pre>" . $s3 . "</pre>";
0106nobodyさん
04/06/17 02:20ID:WEWy3iw0まだ実験的なものとかって書いてあるんだけどじゃあ何を使えっていうんだい?
だれか経験者いない?
0107nobodyさん
04/06/17 02:29ID:???1. 元データ $s1 → ABC\nDEF\nGHI\JKL
2. 変換 $s2 → ABC\\nDEF\\nGHI\\JKL
3. 逆変換 $s3 → ABC\nDEF\nGHI\JKL
各段階での変数の内容(リテラル)はこうなってるんだと思うが。
1で\\nはエスケープされて改行コードではなく文字列それ自体(ABC\nDEF)として$s1に代入、
2でその\nの\が\\に置換され(ABC\\nDEF)、
3で\\が\に置換される(ABC\nDEF)。
LFは$s1にそもそも入ってないから関係なし、と。
したがってコードはかかれたとおり正常に動作してる。
0108nobodyさん
04/06/17 02:34ID:???ってかなんでfor文を1から始めてるの?
ファイルの一行目は使わないってこと?
配列は0から始まるって事を勘違いしてたとしたら
$str=$array[11];
は
$str=$array[10];
の間違い。って事はない?
0109nobodyさん
04/06/17 02:36ID:???dom関数使えばいいよ。
phpでやろうというならdomかdomxmlかxmlparser(expat)かsimplexmlか、pearライブラリの
いずれかを選んでやるしかない。
0111nobodyさん
04/06/17 02:44ID:???なら変更があるといってもよほど妙な機能を使ってない限り
大したことないような。
漏れはSimpleXml関数とXml関数で足りてるからDOMのことば
よう知らんけど。
0112nobodyさん
04/06/17 02:51ID:???csvなら一行目が定義フィールドな可能性はある。
まあイテレータが1から始まる理由にはならんけど。
つーかそれ以前にエラー処理とかflockの定数とかありえない文字コードの指定とか
splitを使ってるとことかキャラクタクラスが\nなとことか""で囲まれた値を考慮してないとか
毎回countしてるとことかfgetcsvを使ってないこととか無意味な代入とか、
ようするに釣りじゃなければなんだってことのほうが重要だと思うけど。
0113nobodyさん
04/06/17 02:58ID:zQROHTgZ0114104
04/06/17 02:59ID:???ありがとうございます。
それが正常にならないのです。
各段階を実際に出力させてみると、以下のようになってしまいます。
(上から$s1 $s2 $s3 です)
<pre>ABC\nDEF\nGHI\JKL</pre>
<pre>ABC\\nDEF\\nGHI\\JKL</pre>
<pre>ABC
DEF
GHI\JKL</pre>
書き忘れていましたが環境は PHP4.3.7 + IIS5.0 です。
0115104
04/06/17 03:00ID:???実際には空いていません。
<pre>ABC
DEF
GHI\JKL</pre>
0116nobodyさん
04/06/17 03:13ID:???検索語・置換語が複数渡ってるから、まず
s2の ABC\\nDEF\\nGHI\\JKL が ABC\nDEF\nGHI\JKL に置換されて、
さらに ABC\nDEF\nGHI\JKL が残りの$arr2の置換(\n -> LF)をやって
s3に改行が入るんだろうね。
0117nobodyさん
04/06/17 03:38ID:???出力時どれも改行に逆変換されちまうってことですな。
だからリテラル\nがもとに戻らず改行になってしまう。
\nという文字列を入力できなくするのはナンセンスだし、エスケープを実装するとコスト高なので、
入力される可能性のない文字列に置換して保存するしかないか。
0119nobodyさん
04/06/17 06:43ID:???ImageTTFTextを使って日本語を書き込みたいのですがどうも文字化けしてしまうのです。
文字の部分はUTF-8にエンコーディングしているのですが、
サーバーの仕様に依存するのでしょうか?
ご教授よろしくお願いします。
0120nobodyさん
04/06/17 06:59ID:???ハードウェアやosやhttpdのことなら関係ないだろ。
phpのコンパイルオプションやini設定には依存する。
何をしてるのかかかれてない以上マニュアル読めとしか言えないよ。
0121nobodyさん
04/06/17 10:35ID:dLzzZdYXありがとうございます。それでいけました(^^)
0122nobodyさん
04/06/17 13:28ID:mG7yRBZ4そのまま表示されてしまいます。<br>を出さずに改行された状態でテキストエリアに読み込みたいのですが
どうすれば良いでしょうか??よろしくお願いします。
0123nobodyさん
04/06/17 13:30ID:???0124ぺぷし
04/06/17 13:30ID:t9pcSu9t初めて書き込みさせていただきます。PHP初心者のため、ご教授いただけたら幸いです。
MySQLのデータベースのBLOBフィールドにバイナリデータとして格納してある複数の画像ファイルをPHPでブラウザに全て自動的に書き出すようにしたいのですが、下記のようにDo Whileを使ってフィールドの全データを書き出そうとすると
"Cannot modify header information- headers already sent by output started ..."というエラーになり、画像ではなくバイナリデータのまま
出力されてしまいます。
ちなみに、ループにいれず、クエリで抽出した単一の画像だけを出力する分にはこのようなエラーは出ず、画像を表示することができるので、
ループに入れることで、header情報のContent-typeの指定が繰り返されるのがいけないのだと思うのですが、試しにループの外にheader("Content-type: " . 'image/jpg'); の部分をおいてみるとファイルダウンロードダイアログボックスが開いてしまいます。
ループでの全データ書き出しはできないのでしょうか?
どなたかご存知の方、いらっしゃいましたらお助け下さい。
***********************************************************************
<table border="1">
<tr><td>ID</td><td>Image</td></tr>
<?php do { ?>
<tr><td><?php echo $row_rs1['id'] ; ?></td>
<td> <?php header("Content-type: " . 'image/jpg');
echo "<img src= {$row_rs1['image'] } >"; ?></td>
</tr>
<?php } while ($row_rs1 = mysql_fetch_assoc($rs1)); ?>
</table>
0125nobodyさん
04/06/17 13:34ID:mG7yRBZ4理屈はわかるのですが^^;ソースで書くとどんな風になりますか??よろしくお願いします。
0126125
04/06/17 13:35ID:mG7yRBZ40127nobodyさん
04/06/17 13:38ID:???なんと言うかだな・・・とりあえず画像とHTMLの出力は別にしようや
>>125
よく分かりませんが、マニュアルを知らないという意味でしょうか?
http://www.php.net/manual/ja/
0129nobodyさん
04/06/17 13:44ID:???mysql ヘルプ!
http://pc5.2ch.net/test/read.cgi/php/1011683282/466
('A`)
できない
0130nobodyさん
04/06/17 13:54ID:mG7yRBZ4ありがとうございます!
これの反対をすればいいということですかね!?
$s = str_replace("\r\n", "\r", $s);
$s = str_replace("\r", "\n", $s);
$s = str_replace("\n", "<br>", $s);
0131nobodyさん
04/06/17 19:09ID:???/link/index.html からの場合で、出力を振り分けたいのですが、
$gets = getenv{"HTTP_REFERER"};
if ($gets =~ "/game/index.html") {
print ("ゲームから来ましたね");
}
elseif ($gets =~ "/link/index.html") }
print ("リンクから来ましたね");
}
こんな書き方をしても、/link/index.html から来たやつも
全部何故か /game/index.html の方に飛んでしまいます。
分かる方お願いします。
0132131
04/06/17 19:09ID:AJJf+veG0134nobodyさん
04/06/17 19:19ID:H2q6Vd97$b = "test";
print $a.$b;
で文字出力させた時、
何故か$aのtestが漢字で文字化けし、
$bのtestは正常に表示されます。
両方とも半角英字で同じ文書なのに、何故最初のだけが
文字化けするのでしょうか?
分かる方居ましたらお教え下さい。
0135nobodyさん
04/06/17 19:22ID:???何が楽しいんだか。
0137nobodyさん
04/06/17 19:27ID:???つーかまともに答えてる奴がいるのが笑えるんじゃね。
0139nobodyさん
04/06/17 19:37ID:???0141131
04/06/17 20:10ID:???他行きます・・
0142nobodyさん
04/06/17 20:12ID:???0145nobodyさん
04/06/17 20:40ID:???0148nobodyさん
04/06/17 21:15ID:???$gets = getenv{"HTTP_REFERER"};
if (preg("|/game/index.html|",$gets)) {
print ("ゲームから来ましたね");
}
elseif (preg("|/link/index.html|",$gets) }
print ("リンクから来ましたね");
}
はい、どうぞ!
0149nobodyさん
04/06/17 21:19ID:???君の言語は難題?
0150nobodyさん
04/06/17 21:28ID:???header('Content-Type: image/jpeg');
imagejpeg($im);
で、イメージを出力させてもjpegにならず、bmpになってしまうのはなぜでしょうか?
ご教授よろしくお願いします。
0152nobodyさん
04/06/17 21:45ID:???漏れも最初釣りかと思ったんだけど、記憶が確かならば
ブラウザがIEだと画像をローカルに保存するときに御丁寧にもBMPに変換してくれたような。
015394
04/06/17 22:01ID:QhI2MtNB>>98 おお、いけました^^ ありがとうございました。
mb_regex_encoding() ではちゃんとEUC-JPとでてるのに・・。
>>99 string(8) "あいうえ" こんなんでました。
>>108 >>112 察するとおりCSVの1行目は使いたくないので1にしてます。
fgetcsv こんな関数があるとは知りませんでした。
その他いろいろな駄目だしありがとうございました^^;
もっと勉強してみます。
0156130
04/06/18 00:01ID:PKyyDHRx釣りじゃないですよ。。
$s = str_replace("\n", "<br>", $s);
これで出来ました!
教えてくださった方達どうもありがとう!
初心者の頃は釣りみたいな質問をしちゃうってことか・・
0157104
04/06/18 00:02ID:???おっしゃるとおり str_replace では複数の置換を同時に行うと、
置き換えた文字列をさらに置き換えることができてしまうようですね。
結局 preg_replace_callback と str_replace を組み合わせることで解決できました。
どうもありがとうございました。
0158nobodyさん
04/06/18 00:44ID:???\n <-> <br> じゃhtmlが見難くて仕方ない
0162nobodyさん
04/06/18 13:54ID:???普通にtesttestと出るよ
0163nobodyさん
04/06/18 14:34ID:YdLASFW3考えているのですが。。
仮に12件のフィールドが合った場合、本来なら次の10件をおすと残りの2件だけが表示されるべき
なんですが、何故か残りの2件のあとにまた1から表示し(8まで)最終的に10件になるまで表示してしまいます。
データベースに直接、select * from db limit 10 offset10;
とすると正常に2件のみが表示されます。
phpのスクリプトは
$con = pg_connect("dbname=datebase user=postgres password=***");
$sql = "select * from database limit 10 offset $page";
$result = pg_exec($sql);
$count = pg_numrows($result);
for ($i=0;$i<$count;$i++)
{
//処理
}
とこんな感じですが$countに10が入ってしまっている状況です。
phpかpostgresql側なのかどちらで適切か解らなかったので、もしスレ違いでしたら
申し訳ないです。
ご教示お願いします。
0164nobodyさん
04/06/18 15:17ID:kjBT0b/w$pageはどこで定義してんの?
0166nobodyさん
04/06/18 15:24ID:???試す事はまだいろいろありそうなんだが
デバッグの仕方を自力で覚えないと一生スキルあがんないよ
0167nobodyさん
04/06/18 15:33ID:YdLASFW3すいません、記入しませんでしたが既に試してます。limitをはずすってどういうことでしょう??
0168nobodyさん
04/06/18 15:37ID:YdLASFW3if($page=='')
{
$page = '0';
}
.
.
.
if ($page<9)
{
<a href=\"index.php?page=".($page-10)."\">前の10件</a>
<a href=\"index.php?page=".($page+10)."\">次の10件</a>
抜粋しましたがこんな感じです
0169nobodyさん
04/06/18 15:38ID:YdLASFW3{
$page = '0';
}
.
.
.
<a href=\"index.php?page=".($page-10)."\">前の10件</a>
<a href=\"index.php?page=".($page+10)."\">次の10件</a>
0170nobodyさん
04/06/18 15:40ID:???0171nobodyさん
04/06/18 15:48ID:???0172nobodyさん
04/06/18 16:15ID:kjBT0b/wGETで来た$pageの値はどこで受け渡してんの?
0174nobodyさん
04/06/18 16:17ID:kjBT0b/w■ このスレッドは過去ログ倉庫に格納されています