PHP + MySQL

このエントリーをはてなブックマークに追加
927925:03/06/28 16:24 ID:???
>>926
お返事ありがとうございます。

現在PHPの演習として、HTMLでフォームを作りそこのフォームから送られてきた数値を
SQL文に組み込んで検索させて結果を表示するWebDBを作っています。
で、
$sql = "select * from table1 where percentage >= ". $_POST["percentage1"] ." and percentage <= ". $_POST["percentage2"] ."";
のようなSQL文を作ったのですが、フォームから空白が送られてきた場合にすべてのデータが
HITするようなSQL文を変数の値のみを変更することによって作りたかったのです。

926さんの言うとおり
>○○○の部分だけを変えて動作を切り替えようとしてるから、どうして良いか
>判らなくなってる
ですね。

ご助言ありがとうございました。
とりあえず空白が送られてきたときに条件分岐させて別のSQL文を送るようにしようかと
思います。
928nobodyさん:03/06/28 16:55 ID:???
>>927
演習だからまあ良いけど、公開しようがしまいが多少なりとも
外に繋がるところに置くなら、ユーザからの入力値をそのままSQLクエリに使っちゃ駄目。
最低でも数値ならPHPでintval関数などを通すとか、is_numeric関数で検証するなどして
期待している通りの値なのか確実にしてから使う。

http://jp.php.net/manual/ja/security.database.php#security.database.sql-injection
他にも"SQL セキュリティ"をキーに探すと参考になるページが見つかると思うので
調べて、危険性について理解しておくこと。
929ショシンシャ:03/06/30 11:31 ID:???
HOGEというフィールドの一番ケツのセルのデータを取り出すには、
select * from test where HOGEのあとになにをいれたらいいんでしょうか。
930nobodyさん:03/06/30 12:31 ID:???
>929
HOGE 内の一番右側の文字を取り出すの?
それとも一桁目の数字?
931ショシンシャ:03/06/30 12:36 ID:???
>>930
レスさんくすでつ。
HOGE内にはユーザーIDをあらわす数字があって、
実はその数字に1をたして次に登録する人のID番号に
したいんでつ。おながいします。
932ショシンシャ:03/06/30 12:40 ID:???
$sql_id = "SELECT * FROM test WHERE HOGE??";//ケツの番号
$id = $sql_id + 1;
$insert = mysql_query("INSERT INTO membertbl VALUES ($id,$passwd,....

みたいなかんじでつ。
933ショシンシャ:03/06/30 12:42 ID:???
ああぁ
3行目
$insert = mysql_query("INSERT INTO test VALUES ($id,$passwd,....
でした。

934nobodyさん:03/06/30 12:49 ID:???
DB板行ってる?
935nobodyさん:03/06/30 12:49 ID:???
>ユーザーIDをあらわす数字があって、実はその数字に1をたして次に登録する人のID番号に
したいんでつ

そのユーザーIDはユニークで、新規登録者に今まで使ってたID+1の
IDを使わせるってことだよね??
idフィールドをauto incrementにするんじゃだめなの?
936nobodyさん:03/06/30 12:52 ID:???
>今まで使ってたID
今まで使ってた一番大きな数のID
937nobodyさん:03/06/30 14:03 ID:???
IDというフィールドを別に作れ。
938ショシンシャ:03/06/30 14:57 ID:???
レス有賀トン。
オートインクリメント!(・∀・)
さすがでつ。ありがとうごいますた。
939nobodyさん:03/07/06 21:31 ID:7NRYAhNq
PHP(4.3.2)+mysql(3.23.57)+phpMyAdmin(2.5.0)+win2000です
phpMyAdminからレコードの追加をすると、phpMyAdminのレコードが文字化けします。
mysql(dos窓)のselectで見ると正常です

色々しらべていじってみたけどわからないです。
↓関係ありそうなphp.iniの設定
mbstring.language = Japanese
mbstring.internal_encoding = EUC-JP
mbstring.http_input = auto
mbstring.http_output = SJIS
mbstring.encoding_translation = On
↓my.iniの設定
[mysqld]
default-character-set=ujis
[mysql]
default-character-set=ujis
[mysql-dump]
default-character-set=ujis
phpMyAdminは(ja-euc)で表示させてます。
940nobodyさん:03/07/06 22:49 ID:???
全部はずして、ゆっくり考えてみろ。
941nobodyさん:03/07/07 01:38 ID:lhtnLc4P
>939
MySQLとPHPで基本としたい文字コードはなに?
942939:03/07/07 23:18 ID:???
>>940
mbstring.http_output = SJIS
をコメントアウトしたらOKでした

>>941
とりあえず出来たみたいです
レスありがとうございました
943山崎 渉:03/07/15 11:08 ID:???

 __∧_∧_
 |(  ^^ )| <寝るぽ(^^)
 |\⌒⌒⌒\
 \ |⌒⌒⌒~|         山崎渉
   ~ ̄ ̄ ̄ ̄
944nobodyさん:03/07/23 19:42 ID:c/+uzDLa
テーブルA
id b c
1 1 1
1 1 5
2 1 2
3 5 1
3 1 2
3 2 0

id b*c
1 6
2 2
3 7
と言った感じに 同IDのb*cを足した数を取得したいのですが

SELECT SUM(b*c) from A GROUP BY id
こう書くと
下のように同じIDのBが足された数に、同idの最後のcを掛けた数が返ってきます

id b*c
1 10
2 2
3 0

どこを直せば良いのか検討もつきません、誰か助けて
945944:03/07/23 20:23 ID:c/+uzDLa
>>944
自己解決しました。
946nobodyさん:03/08/10 03:00 ID:fzrQOeyO
webarenaのsuite2使ってるんですが、
サイトのipは*.*.*.100
なのに、
別鯖のmysqlにアクセスすると、ipが
*.*.*.2になります。
これはモジュール版だからでしょうか?
別のバーチャルホストのphpも*.*.*.2で走ってるとすると、
ちょっとセキュリティー的にどう? と思うのですが
(もちろんパスはかけていますが)
こんなものなのでしょうか。
947nobodyさん:03/08/18 00:26 ID:I4OY3KuJ
pconnectを使った方が効率が良くなるリクエスト数の目安みたいなものはありますか?
xreaで昨日pconnect使ってみたところ負荷が上昇したので…

デイリーアクセスが6000程度、リクエスト数が300000程度
リクエストの7〜8割がMysqlを利用するCGIです
948nobodyさん:03/09/02 11:46 ID:8zFi1SPw
自分のパソコンにサーバーソフトを入れて動作確認した結果と、レンタルサーバーにうpして動作確認した時とで、
違う検索結果が返ってくるのですが、何が原因なんでしょう?

レンタル鯖(PHP4.2.2 mysql3.23.46)
「なし」でLIKE演算子を利用して検索をかけた結果、「なし」「にし」「すし」が検索結果として返ってくる

自分のパソコン(PHP4.2.3 mysql4.0.5)
「なし」でLIKE演算子を利用して検索をかけた結果、「なし」のみが返ってくる

文字コードは全てEUC、mysqlのdefault-character-setはどちらもujisです。
わかる方いらっしゃったらよろしくおながいします。
949nobodyさん:03/09/02 14:51 ID:oASbZti5
phpMyAdminの使い方がわからない・・・(´Д`)
どこかにいいマニュアルありませんか?
探したんだけどサパーリです。(´・ω・`)
950nobodyさん:03/09/02 18:50 ID:???
>>949
MySQLのマニュアル調べた方が手っ取り早いです。
951nobodyさん:03/09/02 22:19 ID:???
>>949
GUIなんだから適当にいじって覚えろ。
日本語訳がめちゃくちゃなことを頭の片隅においておくと吉。
952nobodyさん:03/09/03 01:45 ID:???
>>948
どうすれば良いかということなら、
"BINARY"付けて比較しる!
(MySQLのMLの過去ログ等参照)

>>949
「MySQL徹底活用」に、それなりに載ってたかな。
もっと簡単部類のMySQLな本で書いてあるのも見た気がするけど。
953nobodyさん:03/09/03 09:41 ID:???
ありがとうございます。MLの過去ログ漁って探してみます。
954953:03/09/03 09:42 ID:???
>>953>>952に対するお礼です。
955nobodyさん:03/09/04 11:46 ID:???
リモートホストのことでは
956nobodyさん:03/09/14 01:00 ID:SxMgLT7D
今掲示板を作っています。発言ランキングを作ろうと思ってます。
`name`フィールドに名前を記録しているのですが、
これを動的にランキングとして生成したいのです。
どのようなロジックにすればいいのでしょうか。
957nobodyさん:03/09/14 02:49 ID:???
>>956
頻度集計ってSQLで一発で取ってこれるのかな?
良く判らないので私ならnameフィールドについて全件取ってきた結果を
スクリプトで個々にカウントして、それをソートして必要な上位件数を抽出します。

ランキングを出すことが頻繁でスピードが欲しいなら逐一集計するより、
nameフィールドに入れる値で分類したフィールドをもつテーブルを用意しておき、
発言する度に発言数を1増加。必要なら発言取り消しで1減少。
上位集計は発言数でORDERかけてLIMITで、必要な上位項目を制限して取り出す。
958nobodyさん:03/09/14 03:00 ID:4aTBFeIT
>>956
そのランキングをBBS本体とは別のページに常に表示させておくような
場合は957さんが書いてくれているやり方のほうがいいと思うけど、
SELECT name, COUNT(*) FROM name_of_table GROUP BY name
でいけるはず。
959957:03/09/14 03:00 ID:???
ああ、ここはMySQL+PHPスレか。
ならnameの内容をkey項目にしたarrayを作って、全件取った結果を使い
nameの値に対応するarrayのvalueをカウントアップしていけば集計が出来る。
で、arsortを数値オプション付きで掛ける。
960nobodyさん:03/09/14 03:01 ID:???
sage忘れスマソ。
>>956 追記。この板はsage推奨。
961nobodyさん:03/09/14 08:13 ID:???
>>960
「このスレッド」の間違いか?
962nobodyさん:03/09/15 13:21 ID:3OfqCmu9
>>957さん >>958さん
おへんじありがとうございます!
COUNT()なんてものがあったのですね。
MySQLのリファレンス見て、自分なりにアレンジして、

$sql = "SELECT `name`, COUNT(`name`) FROM `$db_table` GROUP BY `name` ORDER BY 'COUNT(`name`)' DESC;";

でできました!!
でもこれだと名前がローマ字のばやい大文字も小文字もいっしょくたにされてしまう・・・
963nobodyさん:03/09/15 13:31 ID:???
BINARY
964956:03/09/15 23:06 ID:A4TTummz
>>963さん
重ねx2さんくす!!
またまたリファレンスを検索してヒットしました。
表示タイプをバイナリにすればよいのですね!
スクリプト修正してないのに、しっかり区別できました。
さんくす いん あどばんす!!
965nobodyさん:03/09/18 02:18 ID:???
よく聞け!喪前ら!!!

前日アクセス数、本日アクセス数、トータルアクセス数をゲットするカウンターをPHP+MySQLで作ってください。

どうかお願いします。

966nobodyさん:03/09/18 08:48 ID:???
何故にカウンターごときでMySQL使う?
967nobodyさん:03/09/18 12:06 ID:???
>966
将来的にログとってアナライズする機能を拡張する目論見があるからでは。
でもそういうやつは「作ってください」なんていっちゃだめ。
他人に言う言葉なら「売ってください」はありだけど
968nobodyさん:03/09/18 16:37 ID:???
>>965
select count(*) from log
969nobodyさん:03/09/18 16:40 ID:???
>>968
それじゃトータルだけやん

select count(*) as total,
count(case when access_date = '今日の日付' then 1 else null end) as today,
count(case when access_date = '昨日の日付' then 1 else null end) as yesterday
from log

ってするんかな、ログを兼ねるなら。
970avx:03/09/21 00:10 ID:???
>>965

これ結構便利ですよ
http://www.phpopentracker.de/
971nobodyさん:03/09/26 02:55 ID:prC9hqpx
一度に15万件ぐらいのレコードをループしながらInsertさせたいのですが
2万から3万件ぐらいでエラーが出るでもなく止まってしまいます。

最初は実行時間が足りなかったようなので(これはエラーが出ました)
php.iniのmax_execution_timeを上げました。
memory_limitも念のため上げました。
mysql_connectが駄目だったのでmysql_pconnectも使ってみましたが駄目でした。

何がいけないのでしょうか。どなたか教えてください。お願いします。
972nobodyさん:03/09/26 10:22 ID:???
ブラウザから実行してんの?
定期的に文字出力してないと切られて止まっちゃうと思う
973971:03/09/26 10:48 ID:prC9hqpx
ブラウザから実行し、文字も定期的に出力しているんですが
途中で止まってしまいます。
974nobodyさん:03/09/26 11:20 ID:???
んじゃ、webサーバの設定はどうかな?
もしApacheなら、httpd.confのTimeoutとか
975971:03/09/26 12:27 ID:???
>>974さん、ありがとうございます。解決しました。
WEBサーバのTimeoutではなく、(言いづらいのですが)WEBサーバの
再起動がしっかりできてなかったみたいです。

なぜ再起動せずmax_execution_timeの設定も反映されていないのに
ブラウザにタイムアウトのエラーメッセージが出なくなったのかは???です。
出たり出なかったりするんでしょうか。

もう一回、ありがとうございました。
976nobodyさん
age