トップページtech
1002コメント357KB

【PHP】下らねぇ質問はここに書き込みやがれ 4 [無断転載禁止]©5ch.io

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2016/03/12(土) 23:25:33.88ID:j4grSBgs
PHPに関する下らない質問用避難スレです。
まず読むこと【PHPマニュアル】
http://www.php.net/manual/ja/

前スレ
【PHP】下らねぇ質問はここに書き込みやがれ 3
http://echo.2ch.net/test/read.cgi/tech/1447495088/
次スレは>>980が立てる。10分以内に立たない場合、宣言してから立てたい人が立てること。
0002デフォルトの名無しさん2016/03/12(土) 23:27:11.25ID:j4grSBgs
◆質問用テンプレ
【OS名】CentOS
【PHPのバージョン】5.5
【連携ソフトウェア】MySQL ImageMagick
【質問内容】

◆質問する時の注意
・ 己の行った操作、変更などを詳しく明記すること。
・ エラーメッセージはそのまま表記すること。「エラーが出ます」だけでは回答不可。
・ 質問者として、態度をわきまえること。
・ 事前に関連リンクの公式マニュアル、リファレンス本くらいはちゃんと目を通しておくこと。

◆質問後の注意
・ 解決しなくても回答をもらった場合はお礼を言うこと。
(荒らし、煽りは除く。煽られたときも、無闇に反論せずスルーすること。)

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

【その他諸注意】
・ SQL・正規表現・PEAR・テンプレート(Smarty等)・フレームワークは各該当スレへ
0003デフォルトの名無しさん2016/03/13(日) 18:01:24.11ID:9dwDTtH+
関連リンク
■本家マニュアル   http://www.php.net/manual/ja/
■日本PHPユーザ会 http://www.php.gr.jp/
■PHPNG        https://wiki.php.net/phpng
■PEARマニュアル  http://pear.php.net/manual/ja/
■メーリングリスト   http://ml.php.gr.jp/mailman/listinfo/
■ZFマニュアル    http://framework.zend.com/manual/ja/
■Smartyマニュアル  http://www.smarty.net/manual/ja/

(以下英語)
■Zend本家      http://www.zend.com/
■Zend Framework  http://framework.zend.com/
■php | architect   http://www.phparch.com/
■Smarty       http://www.smarty.net
■Smartyマニュアル http://smarty.php.net/manual/en/
■PECL本家(英語) http://pecl.php.net/
0004デフォルトの名無しさん2016/03/13(日) 18:29:54.00ID:kS6/ihj4
POSTで受け取った値でprepara+bindvalueを自動作成する方法を自分で作ってみたのですが、
$stmt = $pdo -> prepare($sql);の部分でエラーが出てしまいます。[42000]
改善策をお願いします。

$table = "$_GET['table']";
$clmname = '';
$valname = '';

foreach ($_POST as $key => $value) {
$clmname .= $key.", ";
$valname .= ":".$key.", ";
}
unset($key);

//末尾のコンマと空白削除
$clmname = substr($clmname, 0, -2);
$valname = substr($valname, 0, -2);

$sql = "INSERT INTO $table($clmname) VALUES($valname)";

$stmt = $pdo -> prepare($sql);
foreach ($_POST as $key => $value) {
$stmt -> bindValue(":$key", $clan_policy, PDO::PARAM_STR);
}
$stmt -> execute();
0005デフォルトの名無しさん2016/03/13(日) 18:56:27.35ID:PAomMvms
>>4
とりあえずSQL文吐いてみ

というかそれ以前にテーブル名やらカラム名やらを外部入力で受け取るとか正気の沙汰じゃないから
0006デフォルトの名無しさん2016/03/13(日) 19:23:29.33ID:kS6/ihj4
?INSERT INTO scouts_a(gender, age, active) VALUES(:gender, :age, :active)

$sqlは上記のような感じで、特に支障はない模様です。
※便宜上パラメーターを3つにしましたが、10ぐらいあり、内容もテーブル名によって変動します。
そのため自動作成したいと考えています。

foreachも間違っていたので修正しておきます。
foreach ($_POST as $key => $value) {
$stmt -> bindValue(":$key", ${$key}, PDO::PARAM_STR);
}

検索してみてもpdo文を自動作成するソースが見つからなかったため、
この方法はひょっとして非推奨なのでしょうか?

手動でも出来なくはない量なのですが、メンテナンス性や可読性のために挑戦してみました。
0007デフォルトの名無しさん2016/03/13(日) 19:31:11.69ID:GjqBj5dI
→に半角スペースはいらない。
$stmt = $pdo -> prepare($sql);
$stmt = $pdo->prepare($sql);
0008デフォルトの名無しさん2016/03/13(日) 19:40:29.09ID:GjqBj5dI
スペースと中括弧を入れて変数を明確にする。
{$table} ({$clmname}) VALUES ({$valname})";
0009デフォルトの名無しさん2016/03/13(日) 20:27:39.52ID:PAomMvms
>>6
PHPのバージョン, 利用するRDBMSとバージョン。
名前付きプレイスホルダで42000エラーが発生することがあった。

その方法で自動生成を実装するとSQLインジェクションのいい的だぞ
自前で実装するならDataMapperでSQLをカプセル化する手法を採るべきだし, テーブルの変更が頻繁ならテーブル生成とActiveRecordクラス生成を同時に行うようにすべき(手動では弄らない)
あんまりテーブル構造変更が頻繁ならそもそも設計を見直すべきだろうが
何れにせよテーブル名を外部入力から受け取るなんてのはまともな実装とは言えない
0010デフォルトの名無しさん2016/03/15(火) 00:55:48.95ID:vuaCyoYo
俺一人で作るWebサービス、初フレームワークだけどFuelPHPでいい?
0011デフォルトの名無しさん2016/03/15(火) 01:00:58.09ID:Yu+x6j+1
vimなら許可する
0012デフォルトの名無しさん2016/03/15(火) 01:39:32.63ID:XuEL3mf6
フレームワークも自前で
0013デフォルトの名無しさん2016/03/15(火) 12:00:31.00ID:vuaCyoYo
自前でやってたけどセキュリティ関係が不安…
0014デフォルトの名無しさん2016/03/15(火) 17:35:49.44ID:M/KZKru9
半日程費やしたのですが、もしかしてwindows環境で64bit版のPHP7とapache2.4の組み合わせは無理ですか
0015デフォルトの名無しさん2016/03/15(火) 18:52:30.10ID:6Fnnrg8u
ウェブブラウザで動くPHPのプログラムを、サーバーなしのWindowsソフトに変換する方法を教えてください。
0016デフォルトの名無しさん2016/03/15(火) 19:07:10.09ID:Yu+x6j+1
.exeにするとして画面どうすんの引数授受どうすんのjavascriptどうすんの
0017デフォルトの名無しさん2016/03/15(火) 19:47:53.75ID:0p8ka/G8
htaでいいじゃん
javascriptに変える必要があるけど
0018デフォルトの名無しさん2016/03/15(火) 20:20:47.01ID:61Q7YxSP
PHPって5年後も開発されてると思う?
0019デフォルトの名無しさん2016/03/15(火) 20:39:21.88ID:O2FU5DmM
Webの仕組みが大きく変わらないなら、残っているでしょうね
0020デフォルトの名無しさん2016/03/15(火) 21:49:01.86ID:6tnBTcMG
>>15
Nabetapって言うのがある。
これはexeには変換できないけど自分のソフトのようには見せれる

>>16
CGIは元々コマンド引数ないよ。
Nabetap使うと画面出てPHPとjavascript使えるよ
0021デフォルトの名無しさん2016/03/15(火) 22:15:38.87ID:bRerDqNG
PDO で LIKE を使った部分一致検索をするとき、値そのものに % なんかが含まれてる場合のエスケープってどうやってる?
泥臭く strtr かなんかでやるしかない?
0022デフォルトの名無しさん2016/03/15(火) 22:26:34.65ID:Yu+x6j+1
addcslashesの第二引数に指定してやるとか

>>20
GETやPOST、それと考え方によっちゃcookieなんかも引数だろうというのはおいとくとしても
簡易Webサーバ&(IE利用の)簡易Webクライアントを「サーバなしのWindowsソフト」というのはどうなんだ
bcompilerって手もあるが
0023デフォルトの名無しさん2016/03/15(火) 23:05:03.91ID:g1PqSQB6
>>21
str_replace を使ってる。
%は\\%に置き換える。_は\\_に置き換える。
strtr でも同様だろう。
他にやりようが有れば知りたいね。
0024デフォルトの名無しさん2016/03/16(水) 00:52:15.32ID:YUxkRKsr
>>22
ネットつながってなくても動くんならWindowsソフトでいいんじゃない?
0025デフォルトの名無しさん2016/03/16(水) 01:20:47.41ID:BN+Lq3m+
配列に対してある操作をする時って、
foreachとarray_*関数使うのはどっちが早いの?
例えばある配列から特定のキーと値だけを取り出す場合、
foreachで回して取り出すのか、array_searchで取り出すのかで処理スピードに差は出てくる?
0026デフォルトの名無しさん2016/03/16(水) 01:22:13.55ID:W+A3q4l0
なぜ試さないのか
0027デフォルトの名無しさん2016/03/16(水) 03:07:40.77ID:6pUenI4F
>>22
プロセス間通信にhttp使ったらそれはもうサーバなしのソフトとはいえないだろ的な?
0028デフォルトの名無しさん2016/03/16(水) 09:42:43.04ID:31XCK0BE
そういえば毎回処理速度を計測するの面倒だけどみんなちまちま計測してるの?
俺は関数あればそっち使って、問題ありそうなら回してるって基準だけでやってる。
よほど大きなデータじゃなければいちいち計測なんかしてない。
0029デフォルトの名無しさん2016/03/16(水) 10:44:00.47ID:Ny+vSnKw
普通は速度よりもコードの読みやすさを重視する
関数があれば関数を使う
速度が要件を満たさない場合にボトルネックの発見と改善のために計測する
0030デフォルトの名無しさん2016/03/16(水) 11:31:36.06
二重ループになってるところくらいしか計測しないっすわ
データベースはデータベースで計測出来るし
0031デフォルトの名無しさん2016/03/16(水) 13:01:21.01ID:uy33h+7U
phpに詳しい方、教えてください

現在JavaScriptでロード時(リロード時)に特定のhtmlタグの値を書き換えるコードを使用しているのですが、訳あって使うことができなくなります

phpは使うことができるのですが、上記の動作と同じようなものは作成可能でしょうか

よろしくお願いします
0032デフォルトの名無しさん2016/03/16(水) 16:57:24.73ID:WJMGp9Ue
詳しい状況がわからないけど、出来るかできないかといえば出来る。
ただそれがあなたの思ってるとおりのものなのかは保証できない。
最初から書き換えたものを使えばいいのでは?という疑問に答えてくれれば、
もっといいアドバイスが出来ると思う。
0033デフォルトの名無しさん2016/03/16(水) 17:34:10.57ID:uyHrsjE6
>>31
PHPを使おうと使うまいと、普通のウェブブラウザを使う限りJavascriptは使えると思うが。

PHPはリロード痔にタグを書き換えるどころか、全く違うHTMLを出力することもできる。
常に全く同じHTMLを出力するだけなら、HTMLでよく、PHP使う必要ないでしょ。
だから、できると思うが、できるんですか?と聞いている人にできるかどうかは分からないよ。
0034デフォルトの名無しさん2016/03/16(水) 19:56:53.04ID:08Q65Pye
いやこれは答えとしては出来ないだろうな
phpはhtmlそのものを書き換える事は出来るけどタグだけなら書き換え出来ない
0035312016/03/16(水) 20:02:58.06ID:uy33h+7U
>>32
>>33
お二方、レスありがとうございます

>>32
個人的なことなのですが、正確には書き換えるではなく削除するでした
htmlの話になるので割愛しますが、textareaタグの初期値をロード時に削除しないとplaceholder属性を使用することができないため、JavaScriptを使って削除していました。
本題の初期値を指定しなければいいという話になりますが、指定せずにいるとバリデーターにて構文エラーが出て気持ちが悪いという本当にただの個人事です。

>>33
おっしゃるとおりJavaScriptは使おうと思えば使えます。
使うことができないという理由はこちらもhtmlの話になるので割愛しますが、doctype宣言をhtml4.01からiso-htmlに切り替えるためということになります。
iso-htmlではJavaScriptを使用することができないため、phpでできないかと考えたしだいです。

お二方のアドバイスからphpでも可能と判断しました。
これから参考書を買ってきます。
レスをくださり、ありがとうございました。
0036デフォルトの名無しさん2016/03/16(水) 21:26:32.52ID:bVagARgS
>>34
はあ?タグを書き換えられないだと? 意味不明。

#!/usr/bin/php

print "<html><body>";

if($tag_default){
print "<tag 1>";
}
else{
print "<tag 2>";
}

print "</body></html>";
0037デフォルトの名無しさん2016/03/16(水) 21:34:35.21ID:/m4HeSgG
それPHPのコードじゃないw
0038デフォルトの名無しさん2016/03/16(水) 21:38:12.31ID:08Q65Pye
>>36
上の人曰くロード時にjsを使ってタグを書き換えると書いてある
なら最初からタグを書き換えた"html"をphpで吐けばいいと言う話でそちらの例文通りなんだが
わざわざタイミング的にロード時に"タグ"を書き換えるというなら出来ないと
0039デフォルトの名無しさん2016/03/16(水) 21:38:16.49ID:6pUenI4F
>>35
なんか不安になる流れだけど、言葉を借りながら書くと、ロード後に何か変更することはできないよ。
0040デフォルトの名無しさん2016/03/16(水) 21:39:18.20ID:TswKIM7e
>>36
いやぁ>>35の要求は無理でしょ
バリデーションエラー抑制なんだから読まれるHTMLそのものにはtextareaの初期値が設定されている必要があり, onload或いはreadyイベント時にクリアする必要があるわけでしょ
クライアントサイドのお仕事なんだからサーバサイドではどうにもならん
0041デフォルトの名無しさん2016/03/16(水) 21:42:40.76ID:1Ad9HLvE
>>40
form部品のidだかnameだかを動的に変えてやってcacheも無効にすればあるいは
0042312016/03/16(水) 21:54:52.61ID:uy33h+7U
みなさんレスをくださり、ありがとうございます。
荒らしてしまったようで申し訳ありません。

>>38
補足として、ロード時にタグを書き換えるではなく、ロード時にタグの値を削除するです。
before:<textarea>hoge</textarea>
after:<textarea></textarea>
紛らわしかったですね。ごめんなさい。

>>39
ロード後というよりはロード時なのでScript系でいうonload的な何かトリガーになる関数やメソッドがないかなと思いまして。
0043デフォルトの名無しさん2016/03/16(水) 22:41:03.47ID:TswKIM7e
>>41
実装案あるなら詳しく知りたい
0044デフォルトの名無しさん2016/03/16(水) 22:41:21.24ID:uh2T6fm3
>>37
PHPじゃなければなんだ?
PHPは、printf("abcdefg\n"); と書いても動くで。

>>40
リロードされるということはサーバーが情報出すわけでどうにでもなる。
もちろん、リロードさせないで変えることは、PHPというより、CGIではできない。

<html><body>
<?php
なんか処理
?>
</bdoy></htm>

だと、bodyタグは書き換えられないけど、

print "<html>"
if($default){
print "<body>";
}
else{
print "<aaaa>";
}
print "</body></.html>"

だと書き換えられるだろ。
タグ書き換えられないなら、もはやCGIの意味ないだろ。
書き換える条件は、GETまたはPOSTで受け取れるだろ。何言っているのか意味不明だよマジで。
0045デフォルトの名無しさん2016/03/16(水) 22:54:25.28ID:TswKIM7e
>>44
何でCGIとか言い始めたのか分からんのだけど
で, >>35の要求はクライアントサイドでの書き換えだと読めるわけだし, それは>>42でもそうだということが分かるわけだけど, サーバサイドで何するの?
0046デフォルトの名無しさん2016/03/16(水) 23:06:42.52ID:uh2T6fm3
>>45
「ロード時」って言っているんだからサーバーだろ。

というか、おまえのブラウザはPHPプラグインでもあるのかよ?
聞いたことねーぞそんなの。
どこに、ブラウザのクライアントサイドでPHP使っている奴がいるんだよ。
話にならんわマジで。
PHPはJavascriptみたいにクライアントサイドでは動くわけない。
そんな低次元な話を言いたいわけ?当たり前じゃん
0047デフォルトの名無しさん2016/03/16(水) 23:13:18.12ID:TswKIM7e
>>42
とまぁサーバサイドからすればロード後もロード時もレスポンス送出後の話なので関与出来ない。
当然JavaScriptで操作するイベントハンドラもサーバ側からは全く見えない。
0048デフォルトの名無しさん2016/03/16(水) 23:21:29.98ID:yE3DB2AT
つまりクライアントサイドPHPという方向
0049デフォルトの名無しさん2016/03/16(水) 23:28:54.37ID:UiCQsACT
>>46
既にあるシステムの出力をいじりたいんだろ?
サーバサイドを自由にできるなら既存の出力処理に手を入れる話だろ。
PHP がどうとかいうレベル以前のことなわけで。
0050デフォルトの名無しさん2016/03/16(水) 23:29:40.46ID:uh2T6fm3
まあ、ここにバカがいることから分かるように、
サーバーとの通信で成り立っているから、
クライアントだけで完結するプログラムで簡単にできることも、CGIとなると難しいんだよ。
できるんですか?って聞いているような人にはできないから諦めなよ。
バカにかかるとできることもできなくなる。
それはどんな言語でもどんなプログラムでも同じ。
0051デフォルトの名無しさん2016/03/16(水) 23:42:41.54ID:UiCQsACT
バカは誰なんだかw
後半には同意だがな
0052デフォルトの名無しさん2016/03/16(水) 23:50:29.07ID:t34HQYxh
>>31
>上記の動作と同じようなものは作成可能でしょうか
PHPでは無理。不可能。

>>42
>Script系でいうonload的な何かトリガーになる関数やメソッドがないかなと思いまして
PHPには無い。

だから参考書は買わなくていいぞ。
■ このスレッドは過去ログ倉庫に格納されています