【PHP】下らねぇ質問はここに書き込みやがれ 29
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2006/09/17(日) 04:26:39ID:???まず読め→【PHP マニュアル】http://www.php.net/manual/ja/
PHPで最良の教本はこの公式マニュアル。市販の書籍は嘘が多いので鵜呑みにしない。
過去スレ、関連スレ、FAQなどは>>2-10辺り
◆質問する場合の注意
1. 自分のIDを表示させること。(メール欄に何も記述しないでください)
2. サーバーのOS、WebサーバーとPHPの種類やバージョン等を明記すること。
3. 己の行った操作、変更などを詳しく明記すること。
4. エラーメッセージはそのまま表記すること。「エラーが出ます」では絶対分かりません。
5. 質問者としても態度をわきまえること。
6. 事前に公式マニュアル、リファレンス本くらいはちゃんと目を通しておくこと。
◆質問後の注意
・質問者は必ずIDを表示させてください。(メール欄に何も記述しないでください。)
・2回目以降は最初に質問した際のレス番号を名前欄に入れてください。
(逆に回答者は質問者に対して>>(アンカー)をつけて答えてください。)
・解決しなくても回答をもらった場合はお礼を言う。
(荒らし、煽りは除く。逆に煽られたときも、無闇に反論せずスルーすべし)
【その他諸注意】
・正規表現・PEAR・テンプレート(Smarty等)・フレームワークはそれぞれの該当スレへ
・SQLについての質問はデータベース板(PCカテゴリ)の各スレで
・オブジェクト指向については良スレがないから本を買え。理解できないならムリに使うな。
・速さについては自分でベンチをとってここに書け(違う環境の人も調べてくれるかも)
0611nobodyさん
2006/09/27(水) 01:52:50ID:???でもさ、数値かどうかを判定するロジックを仮に無くしたとして、
それで何か弊害が出るかい?
その判定ロジックを省いて、
とにかくmysql_real_escape_stringをかければ、結果は同じでしょう。
0612611
2006/09/27(水) 01:56:17ID:???intval()をかけないと致命的だ・・・とか書いてるけど、
俺はそうは思わない。
なぜなら、その変数をPOSTなどから受け取った時点で、is_numericやctype_digitなど
適切な手段にてしっかりバリデートしてれば問題ないわけで。
(むろん、この場合でもmysql_real_escape_stringは必須だが)
0613nobodyさん
2006/09/27(水) 02:08:47ID:???好みの問題だから、そこをお互いどうこう言っても仕方ない。
postで受け取った時点でっていうのはあるね。俺も初めの頃はそうしてた。
でも毎回やるのが面倒になったから、DB用のクラスにエスケープするfunction作って、あとはデータ全部投げるだけ。
エスケープ以外のバリデートが必要なところはその場その場でやるけどね。
まぁ、それも好みの問題。
特に俺のDBクラスではいくつかのDBに対応させてて、magic_quotes_gpcがonの時にstripslashesするからfunction内でのis_boolチェックは必須。
0614611
2006/09/27(水) 02:15:59ID:???う〜ん、どうせ同じ正常な結果が得られるのなら、
わざわざ好んで無駄なコードを増やさないほうがいい気がするけど…。
コードが1行増えるたびにセキュリティ・ホールやバグが発生する可能性が増えると思う。
無意味なコードを「好みで」増やすという思考がよく理解できない。
0615nobodyさん
2006/09/27(水) 02:31:19ID:???もし「データ型」を理解していて、あえて型チェックしないコードを書くのは、まぁアリだと思う。
でも話から察するにそうでもないみたいだね。プログラムの基礎を学んだほうがいいかもしれない。
PHPはデータ型が緩い言語だから柔軟にコーディング出来るのは利点だけど、
「データ型」を意識しない(理解できていない)ところからくるセキュリティホールやバグもあるわけです。
「好みの問題」とは言ったけど、データ型を理解できていないなら好みの問題では済まされない。
少し勉強してみて下さい。
0616nobodyさん
2006/09/27(水) 02:59:55ID:???>>612の4行目を100回くらい読み直せ。
ついでに言うと、いまの話の流れで、データ型を考慮しないせいで
セキュリティ上の問題が発生するケースはありえない。
0617初心者
2006/09/27(水) 03:04:17ID:???セキュリティーを意識した事は一度もないのですが
どんな怖いことがおきますか?
たまに鯖缶から突然PHPの停止を受ける事があるのですが
関係ありますか
鯖缶は外人なのでうまくコニュミニケーションがとれなくて
困ってます 教えてください
0618nobodyさん
2006/09/27(水) 03:27:44ID:YNifcXJT0619nobodyさん
2006/09/27(水) 04:12:30ID:???php_flag magic_quotes_gpc off
も受け付けないサーバーって存在するの?
0620nobodyさん
2006/09/27(水) 06:18:59ID:???0621nobodyさん
2006/09/27(水) 07:16:57ID:???なぜでしょうか?
また、使わないとすると代わりに何を使えばいいのでしょうか?
0623nobodyさん
2006/09/27(水) 07:34:32ID:???データを持ち回すときにセキュリティーが必要な場合はセッションを使えってこと
普通の掲示板とかならhiddenで持ちまわしてもいい
0625nobodyさん
2006/09/27(水) 08:45:41ID:???良くないとどこかできいたのですが、本当でしょうか?
本当の場合、どうやって移動させるのがいいのでしょうか?
教えてください。
0626nobodyさん
2006/09/27(水) 08:47:58ID:???0627nobodyさん
2006/09/27(水) 09:15:43ID:???関数が定義されてないエラーが出て使えない・・・
PHPのバージョンは5.16。なんでだろう。
0628nobodyさん
2006/09/27(水) 09:29:56ID:???別にする必要は無いですか?
0629nobodyさん
2006/09/27(水) 12:28:30ID:???そういう言い方は誤解を受ける。
hiddenだからセキュリティに問題があるとか、セッションだからセキュリティ的に安全ってわけじゃない。
どちらにしても入力データのバリデートや各種エスケープをしっかりやればいい。
もちろん、パスワードなど見せてはいけないデータをhiddenで持ちまわるのは厳禁。
>>628
とりあえずお前の認識は間違っている。
で、このスレを読み返すだけでも答えはあると思う。
0630nobodyさん
2006/09/27(水) 12:34:45ID:???、htmlspecailcharsをして出力するの!?
0633nobodyさん
2006/09/27(水) 13:30:02ID:???からな。
0634nobodyさん
2006/09/27(水) 13:36:43ID:???同感。自分も型チェックの分岐を書く。
stringを期待してる関数に他の型を渡す奴は低レベルとしか言いようがない。
0635nobodyさん
2006/09/27(水) 13:58:46ID:???SCRIPT_NAMEにもpathinfo入ってます。
レン鯖の場合どうするのがいいでしょう?
>> SCRIPT_NAMEにはPATH情報が無いのでこの問題は発生しません。
ttp://blog.ohgaki.net/index.php/yohgaki/2006/02/28/php_selfa_ma_a_ra_fa_fa_oa_a_sa_a_oa
>> apacheの設定で、pathinfoをonにすると明らかな差が現れました。
ttp://ml.php.gr.jp/pipermail/php-users/2003-June/016472.html
0636nobodyさん
2006/09/27(水) 15:34:34ID:???繰り返し言うが、mysql_real_escape_stringをかける段階において、
string型かどうかをチェックしなかったがために問題が発生するということは無い。
型の自動変換などを備えて、型について「わざわざ」甘くしてあるPHPにおいて、
不必要な場面まで型についてこだわるヤツこそ低レベルで馬鹿としか言いようがない。
悔しかったら型変換を怠った場合の問題点でも示してみたまえ(そんなもの無いけどね)。
0637634
2006/09/27(水) 16:19:34ID:???お前アレだな。けっこうイタイな。
0638nobodyさん
2006/09/27(水) 16:21:21ID:???負け惜しみはいいからさ、早く具体的な問題事例があれば出してみろよwww
まさかとは思うけど、逃げんなよww
0639nobodyさん
2006/09/27(水) 16:29:10ID:???0640アチャコ
2006/09/27(水) 16:44:56ID:???0641nobodyさん
2006/09/27(水) 16:48:16ID:???参考までに聞きたいが、↓の様なコードを実行する際
$_POST['hoge']をどんな感じにエスケープしてる?
$sql = "select * from test where data like '%".$_POST['hoge']."%'";
$result = mysql_query($sql);
俺はこんな感じの関数使ってる。
function sql_escape($sql){
$sql = mysql_real_escape_string($sql);
$sql = str_replace(array("%", "_"), array("\%", "\_"), $sql);
return $sql;
}
0642nobodyさん
2006/09/27(水) 17:08:42ID:???マジで
エスケープいらないから
0643634
2006/09/27(水) 17:29:28ID:???0644trab
2006/09/27(水) 17:29:59ID:tKdESkZE早速ですがご質問です。
mail1.○○○.jp
mail2.○○○.jp
mail3.○○○.jp
という風に複数のメールサーバを用意して
phpのプログラム上から条件によって
メールサーバを選択してメール送信することは
可能でしょうか?
例えばAさんならmail1.○○○.jp、
Bさんならmail2.○○○.jpという具合です。
0645nobodyさん
2006/09/27(水) 17:40:16ID:???ttp://ww.mysql.com/doc/refman/4.1/ja/string-syntax.html
>>644
可能
0646trab
2006/09/27(水) 18:00:57ID:tKdESkZE具体的にどのようにすればよいか
教えていただけないでしょうか?
0647nobodyさん
2006/09/27(水) 18:29:23ID:???元気モリモリのー
色とりどりのー
トリオ!
さらにノビノビとー
このトビトビのー
語尾と語尾をつなぐ
喜び!
0648nobodyさん
2006/09/27(水) 18:30:04ID:???0651nobodyさん
2006/09/27(水) 20:45:28ID:???-----------st01.php
<?php #ファイルの先頭に記述
session_start();
$_SESSION['id']=0;
?>
<br><a href="st02.php">Session Test</a>
-----------st02.php
<?php #ファイルの先頭に記述
session_start();
echo $_SESSION['id'];
?>
<form method="post" action="st02.php">
<table border="1">
<tr>
<?php
for($i=1;$i<10;$i++){
echo "<td><input type=\"submit\" name=\"$i\" value=\"$i\"></td>";
if(!empty($_POST['$i'])){
$_SESSION['id']=$i;
}
}
?>
</tr>
</table>
</form>
各ボタン押したらそのボタンの値を表示させたいんだが0しか出ないよ(´・ω・`)
0654nobodyさん
2006/09/27(水) 21:49:10ID:???ありがとうございます。"$i"でくくったら出来ました。
でもクリック1回分遅れて表示してしまうので、正常には表示出来ません。
何とか上に表示させたいんですが、何か良い方法あればご教授を願いたいです。
0655nobodyさん
2006/09/27(水) 21:51:23ID:???for($i=1;$i<10;$i++){}の後ろにecho $_SESSION['id'];付けたら出来ました。
テーブルの下に表示されちゃうのではないのか?と思ったのですが
</table>タグの前なので表示されるんですね、気づきませんでした。
ありがとうございました。
0656nobodyさん
2006/09/27(水) 21:54:27ID:???$_POSTそのまま表示すれば良いだろ。
$_POSTで取った値をセッションに入れて、次のページに渡してるんだから
クリック1回遅れるのは当たり前。
0657nobodyさん
2006/09/27(水) 21:58:25ID:???すべて@で処理してもエラー文が1行表示されます。
まったく何も表示しないという事は無理なんですか?
0658nobodyさん
2006/09/27(水) 22:07:12ID:???0659nobodyさん
2006/09/27(水) 22:08:38ID:???0660伊藤アチャコ
2006/09/27(水) 22:20:25ID:???0662nobodyさん
2006/09/28(木) 00:18:50ID:yFiHvde3段落段落段落段落段落
段落段落段落';
という文字列を……:
'<p>段落段落段落段落段落段落段落段落</p>
<p>段落段落段落</p>
という感じで、空行で区切って「<p></p>」で括りたいのですが、どうすれば出来るのでしょうか?
いろいろと試してみたのですがベストな方法が浮かびません。
よろしくお願いします。
0663nobodyさん
2006/09/28(木) 00:21:02ID:???0664nobodyさん
2006/09/28(木) 00:30:59ID:???$text = '段落段落段落
段落段落段落段落段落
段落段落段落段落段落
段落段落段落段落段落
段落段落段落';
echo "<p>" . str_replace("\n\n", "</p><p>", $text) . "</p>";
0666nobodyさん
2006/09/28(木) 02:51:04ID:Pq7J5CUU↑これって何ですか?
0667nobodyさん
2006/09/28(木) 02:57:30ID:???$ncolor = $colorb;
} else {
$ncolor = $colora;
}
と同じ意味
0669nobodyさん
2006/09/28(木) 06:24:52ID:???初めて知った。
便利そうだけど、慣れるまで見辛そう…
>>666じゃないけど1つ勉強になりますた。
0670662
2006/09/28(木) 07:57:28ID:yFiHvde3ご回答ありがとうございます。
>>664だと、連続した三つ以上の改行があると '<p></p>' という内容が空のP要素を
生成してしまいます。
自己解決かもしれませんが、次のようにしたら出来ました。
何か問題があれば指摘をよろしくです。
function 関数名 ($lines)
{
$lines = explode ("\n\n", $lines);
$lines = str_replace ("\n", '', $lines);
$line = '';
if (is_array ($lines)) {
for ($i = 0; $i < count ($lines); $i++) {
if (! preg_match ('/^$/', $lines[$i])) {
$line .= "<p>" . htmlspecialchars ($lines[$i]) . "</p>\n";
}
}
} else {
$line .= "<p>" . htmlspecialchars ($lines) . "</p>\n";
}
return $line;
}
0671nobodyさん
2006/09/28(木) 08:26:15ID:???> 連続した三つ以上の改行があると
そんな変な条件があるなら先に言わないと。
メインの変換処理で多重空行に対応するのも手だけど、
場合によっては先にイレギュラーなデータを補正しとくことで
ロジックを単純にでき、バグの少ない高品質なプログラムを
作ることができる、ということも覚えといた方がいいと思う。
でもぶっちゃけ、その程度なら
echo "<p>" . preg_replace("/\n\n+/", "</p><p>", $text) . "</p>";
でいいと思う。
htmlspecialcharsを仕込むなら
echo "<p>" . preg_replace("/\n\n+/", "</p><p>", htmlspecialchars($text)) . "</p>";
かね。
0672nobodyさん
2006/09/28(木) 08:54:08ID:???関数本体も冗長だな。>>671が正解だけど、全く同じロジック書く場合もこれくらい緩くていいよ。
function paragraphs($text)
{
$lines = array();
foreach ((array) explode("\n\n", $text) as $line) {
$line = str_replace("\n", '', $line);
if ($line != '') {
$lines[] = htmlspecialchars($line);
}
}
return '<p>' . implode("</p>\n<p>", $lines) . '</p>';
}
0673nobodyさん
2006/09/28(木) 12:06:09ID:???セッションを用いてるからなんですか?それとも、クッキーを使用しているのですか?
セッションは、初期設定では24分!?ごとに一回アクセスがあるかぎり、
保持されると聞いたのですが、mixiの場合はその設定時間をのばしているのですか?
また、ログアウトせずに、お気に入りに入れて開いても、何日もログインの
状態にあるのは、クッキーを使用しているからですよね?
setcookieとsessionを両方、用いているのでしょか?
長くなって申し訳無いですが、ご教授下さい。
0674nobodyさん
2006/09/28(木) 12:24:42ID:???間違い探し
1.一般にセッションはCookieを利用して実装されるので併用が普通
2.セッションのデータ保持時間はPHPなどが勝手に定めてる
3.mixiはPerlで作られていてPHPのルールは関係ない
4.質問時のメルアド欄は「亜sdfghj」などと入れるものではない
で、本題だがmixiでセッションが使われてるかどうかは知らないが
パラメータなしのブックマークからログインできるのはCookieによるものだよ。
0675nobodyさん
2006/09/28(木) 12:52:54ID:???ログイン後のページ遷移が自分のページ基準になるのは
単なるCookieでもできるし持ちまわるデータ量が多い場合は
セッションを使う場合もある。mixiがどっちかは知らない。
mixi程度の処理でセッションが必要とも思わないし。
(必要なのはログイン情報だけでページ間でデータを持ちまわらないので)
0676nobodyさん
2006/09/28(木) 13:13:24ID:???データ量が多いとセッションなの!?
セキュリティ面でクッキーよか、セッションの方がいいんじゃないの?
ちなみに、mixiはphpも使われてます。
0677nobodyさん
2006/09/28(木) 13:16:55ID:???0678nobodyさん
2006/09/28(木) 13:23:08ID:???0679nobodyさん
2006/09/28(木) 13:35:51ID:X3mGBPuB'/hoge[1-9]/'の条件に当てはまる文字列を置き換えたいのですが、置き換える時に
hoge1の場合はhogeXX
hoge2の場合はhogeXXX
とゆう置き換えにすることは可能でしょうか?
どのようにすれば効率的かご教示くださいませm(_ _#)m
0680nobodyさん
2006/09/28(木) 14:03:15ID:???×ゆう
0682681
2006/09/28(木) 14:07:06ID:???わざわざ性器表現使う必要なくね?
0683nobodyさん
2006/09/28(木) 14:07:56ID:bhCM1dKbjavascriptのfor(i=0; i<10; i++)の中で取り出すには
どういう風に書けばいいでしょうか?
for(i=0; i<10; i++) {
document.write(<?= $hogehoge[$i]['fugafuga'] ?>);
}
これは通用しませんでした,,,。
よろしくお願いします。
0684nobodyさん
2006/09/28(木) 14:08:41ID:5RjmQpnD$hairetsu[0] = '0';
これだと何も入らず空っぽだと認識されます><
0685nobodyさん
2006/09/28(木) 14:09:06ID:X3mGBPuBもしご存知でしたらお教えいただけないでしょうか?
str_replaceで'hoge1','hoge2'と置き換えするやり方はすぐに浮かぶのですが、
その場合、
'/hoge[1-9]h(a|b|c)/'という置き換えもありえますので厖大なソースになってしまいます。
0687nobodyさん
2006/09/28(木) 14:12:39ID:???preg_replace_callbackでできるけど、そこまで形が決まってるなら
$from = range(1, 9); $to = array();
foreach ($from as $n) $to[] = str_repeat('X', $n);
$result = str_replace($from, $to, $text);
でもいいかも。
正規表現使うなら、
preg_replace_callback('/hoge([1-9])/', function ($m) {
return 'hoge' . str_repeat('X', $m[1]);
}, $text);
って感じかな。どっちもあんま効率よくなさそうなので、適当に改造してくれ。
0688683
2006/09/28(木) 14:19:36ID:bhCM1dKbレスありがとうございます。
実際にはjavascriptの関数の引数として、phpの配列のあたいを順番に渡したいのです。
単に表示させるだけならphpで回すのですが、javascriptで処理しなければならないところがあるので。
phpの配列をそっくりjavascriptの配列に変換(?)するようなことはできないでしょうか?
0689nobodyさん
2006/09/28(木) 14:31:39ID:???できれば$hogehoge[$i]['fugafuga']なんていう面倒な構造に最初からならないように工夫したほうがいいけど、どうにもならないなら、
$hogehoge2 = array();
foreach ($hogehoge as $i => $hoge) {
$hogehoge2[$i] = $hoge['fugafuga'];
}
// ↑ここで ' と \ をエスケープする処理も必要ならいれる
?>
var hogehoge = ['<?php echo implode("', '", $hogehoge2)?>'];
for(i=0; i<10; i++) {
document.write(hogehoge2[i]);
}
こんな感じで無理やりやる。
0690nobodyさん
2006/09/28(木) 14:57:33ID:bhCM1dKbレスありがとうございます。
javascriptのコードの中にphpの変数を入るというより、
hpの変数が展開されたjavascriptのコード全文を一個の文字列として丸ごとjavascriptに投げました。
強引な手段だとは思いますが、一応動きます。
これはマズイやりかたでしょうか?
0691nobodyさん
2006/09/28(木) 14:58:32ID:bhCM1dKbhpの → phpの
すみません。
0693nobodyさん
2006/09/28(木) 15:18:39ID:???動くならいいんじゃね?(そもそもやっていることが一般的とは言えないから)
ボトムネックになったら直せばいい。
0694662
2006/09/28(木) 15:25:13ID:yFiHvde3ありがとうございました。
0695nobodyさん
2006/09/28(木) 15:31:01ID:bhCM1dKbありがとうございます。
いま作っているサービスで、googlmapを使っていて、
mysqlからお店のデータをとりだして、map上の各マーカーをクリックしたときに出るふきだしの中身にそのデータを入れたかったんです。
極端にいうと、
$マーカー[マーカーの番号][お店の名前];
$マーカー[マーカーの番号][お店の電話番号];
とかそんな具合にしたのです。
マーカーの番号は、何個お店データが抽出されるか分からないので、
$iとおきました。
あとは、googlemapのjavascriptで、マーカーを表示させる行をforするだけだと思ったのですが、うまくいかなかったので、
そのjavascriptのコード全部を文字列としてphpの変数に入れました。
あとは、googlemapのコードの中でその変数を一回だけ表示させればいいという仕組みです。
ajaxとかは使えませんし、javascript自体もあまり分かっていないので、苦肉の策といったかんじです。
0696nobodyさん
2006/09/28(木) 15:47:38ID:???http://study.rakuto.net/php/phptips/path_info/を参考にして入るのですが、htaccess文が全く分かりません
教えてくだっさい
0697nobodyさん
2006/09/28(木) 16:18:41ID:???<FilesMatch "^hoge$">
ForceType application/x-httpd-php
</FilesMatch>
0698nobodyさん
2006/09/28(木) 17:17:22ID:???AddType application/x-httpd-php .html
と書いておけばいい。
0699nobodyさん
2006/09/28(木) 17:27:41ID:???<FilesMatch "^index$">
ForceType application/x-httpd-php
</FilesMatch>
とやって、indexにアクセスしましたが無理でした...
(index.php設置済み)
また、indexで設定した場合、DirectoryIndexの設定はindexになるのでしょうか?
0700nobodyさん
2006/09/28(木) 17:28:36ID:???0701nobodyさん
2006/09/28(木) 17:35:53ID:???ありがとうです
ではDirectoryIndexもindexにする必要がありそうですね
0702nobodyさん
2006/09/28(木) 18:14:22ID:???mod_rewrite使えばいいんじゃね
RewriteEngine On
RewriteRule ^(.*)$ $1.php
0703nobodyさん
2006/09/28(木) 18:42:29ID:loAqiE0j<br> ではなく <br/>
と書くのはどうしてなのでしょうか?
<br>と書いても正しく動作はしました。
0704nobodyさん
2006/09/28(木) 18:50:09ID:???HTMLなら <br>
XHTML なら <br />
それぐらい知っとけ。
主要ブラウザではどっちで書いても同じ動作。
<br/> や <br></br> も XHTML として正しい表記だが、
XHTML未対応の古いブラウザだと誤動作を起こすことがある。(改行されないとか2回改行されるとか)
0705nobodyさん
2006/09/28(木) 19:52:10ID:fnAbwW59スクリプト、出力、データベース入力共にSJISのシステムにアクセスしてからEUCのシステムにアクセスするとこのエラーが発生しだします。
このエラーは上位ディレクトリにあるphpMyAdminでも発生するようになります。
おそらくhtaccessの設定によるものだと思うのですが、なぜ違う上位ディレクトリにまでエラーが出るのかわかりません。
SJISのシステムは携帯の絵文字を使用する掲示板のためEUCにするのは難しいです。
問題点と改善策を教えてください。
お願いします。
0707705
2006/09/28(木) 20:14:37ID:fnAbwW59Parse error: parse error, unexpected T_STRING in /home/????/public_html/????/m/mobile/includes/languages/japanese.php on line 70
というエラーが出たり出なかったりします。
その行は
define('HEADER_TITLE_TOP', 'トップ');
です。
0708nobodyさん
2006/09/28(木) 20:17:00ID:???本によると、規格化するときに<></>にしようとしたらbrがあったので<br></br>だとめんどくさいし古いのだとあれだし、
ましてや<br>だけだとだめだから、からタグ?でコメントないなら<br />で良いやって乗ってたような
0709705
2006/09/28(木) 20:19:51ID:fnAbwW59Parse error: parse error, unexpected T_STRING, expecting ')' in /home/????/public_html/phpMyAdmin/lang/japanese-euc.inc.php on line 19
でその行は
$day_of_week = array('日', '月', '火', '水', '木', '金', '土');
です。
0710nobodyさん
2006/09/28(木) 20:23:13ID:???■ このスレッドは過去ログ倉庫に格納されています