トップページ⇒php
949コメント332KB

PHP + MySQL

■ このスレッドは過去ログ倉庫に格納されています
0001ECY NGNG
そろそろPHP + MySQLについても語ってほしい脳
0265nobodyさん02/09/01 05:16ID:ViCsMgui
初歩的な質問ですいません
これからMySQLを使おうと思っているのですが、
iモードでもMySQLは使えるのでしょうか?

よろしくお願いします。
0266nobodyさん02/09/01 09:18ID:???
質問内容が意味不明です。
0267みかか ドキュモ02/09/01 09:23ID:???
弊社の製品にインスコすることはできません。
0268nobodyさん02/09/01 20:01ID:RgHbazF4
>>265
php+MySQLで、i-Mode用サイトを作り、i-Modeでアクセスすることは出来ます。
# EzWeb用も作ってくれ
0269nobodyさん02/09/04 01:49ID:bvAr4qMV
今日から本格的にMySQLを使っているのだが、つかえねぇ。
・トランザクションが無い
・福問合せができない
・トリガも使えない

こんなのデータベースと呼ぶのか?
RDMNSが使いこなせないDQNが使う代物じゃねーの?
0270PostgreSQL使い02/09/04 02:17ID:JM4qWSZC
>269
> ・トランザクションが無い

Use MySQL-MAX

> ・福問合せができない
> ・トリガも使えない

使わなくて済むようにプログラム書け、というのが
MySQLの主張です。

> こんなのデータベースと呼ぶのか?
> RDMNSが使いこなせないDQNが使う代物じゃねーの?

MySQLは、いわゆる「RDBMS」ではなく、「SQLで入出力できるストレージ」と
考えて使うのが正しいような気がします。
0271nobodyさん02/09/04 05:26ID:USu456uJ
プログラミング経験はそれなりにあるのですが、
DBというものに最近はじめて触れました。
ゲームのようなものを作っています。
アカウントごとに、アイテムを持たせます。
そのアイテムの個数は、可変です。
このようなアカウントごとの所有アイテム情報をDBに保持したい時、
どのようにやるのがベストでしょうか?
0272nobodyさん02/09/04 11:11ID:???
>>271
DBを使わないで、ファイルに保存するとして、アイテムの数を可変にするならどうする?

勝手に妄想してみると、アイテムの種類が多いor今後増えそうなら
id,アカウント名,パスワード,ハンドル,レベル,gold,・・・,アイテム数文字列
と言うようにしておいて(1レコード=1アカウントとする)、
「アイテム数文字列」に "アイテム1,アイテム2,・・・"と、カンマ区切りの文字列にしておく。
ただし、アイテム数でランキング表示するなどはやりにくい。
0273nobodyさん02/09/05 00:36ID:uSX7DJwq
DBを使わない時は配列に入れてそれを保存しますよね。
配列を一つのカラムに入れるのはどうなのか?
と思っていたのですが、
それもアリなんですね。
0274nobodyさん02/09/05 01:09ID:???
>>273
もう少し理解してから提案してください。
027527102/09/05 01:12ID:???
すみません273は私です。
272さんへのレスでした。
0276nobodyさん02/09/05 02:03ID:???
>>271
アイテムの数や種類をその都度updateするんなら
きっちりと定期的にバキュームしてやらないと
DBが大きくなるぞ。

それより、テーブルを分散した方がよい。
ユーザー情報テーブルと、アイテムテーブルに。
アイテムテーブルには、
|ユーザーID|アイテム1|
|ユーザーID|アイテム2|
の様に・・・
ユーザー情報の方が大切なんだから、頻繁に更新しないほうが良い。
0277nobodyさん02/09/06 14:30ID:???
>>271
普通に考えれば、
アイテムID, ユーザID のフィールドを持ったテーブル用意して
そこにがつがつ詰め込んでいくんじゃない?
全アイテムに固有のID持たせるのか、アイテム種ごとにID持たせるのか、
とか、仕様によっていろいろ変ってくるだろうけど。
0278nobodyさん02/09/06 20:14ID:EPlc0hR1
こんな表がありまして、

id カテゴリ
+-+---+
|0| A |
|1| A |
|2| B |
|3| B |
+-+---+

1・カテゴリで分類して
2・分類内では ID が一番大きいやつ
をとりだしたいのです。

欲しい結果
+-+---+
|1| A |
|3| B |
+-+---+

で、この場合SQL はどうなるんでしょうか?

SELECT id,`カテゴリ` FROM `表` GROUP BY `カテゴリ`

とかやってみたんですが、2番目の条件がうまくいきません

おしえてください
0279☆02/09/06 20:17ID:zUklKDWI
超適当

SELECT max(id) , カテゴリ FROM 表 GROUP BY カテゴリ ;

ダメっぽいかな??
0280nobodyさん02/09/06 20:28ID:EPlc0hR1
>>279
すんません、それでうまくいきます(^^;

本当にしたかったのはじつはこんなことなんです

id カテゴリ 名前
+-+---+------+
|0| A |あああ|
|1| A |いいい|
|2| B |ううう|
|3| B |えええ|
+-+---+------+

1・カテゴリで分類して
2・分類内では ID が一番大きいやつ
を
3・名前欄付きで

とりだしたいのです。

欲しい結果
+-+---+------+
|1| A |いいい|
|3| B |えええ|
+-+---+------+

0281nobodyさん02/09/06 20:29ID:EPlc0hR1
検索してると サブクエリ使え とか出てくるんですが...
MYSQLなのよ(;´д⊂)
0282nobodyさん02/09/06 20:32ID:EPlc0hR1
ちなみに、
SELECT MAX(id),`カテゴリ`,`名前` FROM `表` GROUP BY `カテゴリ`

とやると
+-+---+------+
|1| A |あああ|
|3| B |ううう|
+-+---+------+
になります
02838月のクリスマス ◆zzfy/JR2 02/09/06 20:47ID:zUklKDWI
>>282
>SELECT MAX(id),`カテゴリ`,`名前` FROM `表` GROUP BY `カテゴリ`
これって GROUP BYの式がありません
というエラーが出ませんか???
02848月のクリスマス ◆zzfy/JR2 02/09/06 20:50ID:zUklKDWI
>>282
もっと良いやり方はあると思うけど

select a.*
 from (select max(id) id from test_tbl group by cat) b,
    test_tbl a
where a.id = b.id ;

こんな感じでどうでしょうか???
0285nobodyさん02/09/06 21:09ID:EPlc0hR1
>>283-284
ありがとうございます。MySQL なんで副問い合わせができないんですよね(;´д⊂)
シンタックスエラーが出ます

ちなみに、282 の式だと エラーは出ません。
MySQL では GROUP BY にないフィールドでも普通に選択できます。
ただ、グループ内のどれが選ばれるかわからない諸刃の剣
グループ内で値がそろってるときには便利なんですが
0286nobodyさん02/09/07 12:01ID:???
php4.2.3:Made MySQL rollback open transactions when the request ends. (Georg)
どうよ?
0287nobodyさん02/09/10 10:05ID:JRVUQPEU
すいません。PHP初心者です。
挿入がうまくいきません。コードは以下です。
【PHP】質問スレッドでたずねたのでマルチになりますが。。。
/**
* インサートテスト
*
* @access public
* @param ProductState $ps 製品状態情報
*/
function insert3($ps)
{
 // DB接続
 $this->connect(); // $this->db = DB::connect( $dsn )にて取得。
 // SQL文
 $sql = "INSERT INTO user (id,name,date) VALUES (?,?,?)";
 // Statement取得
 print "date=" . date("Y-m-d H:i:s",time()) . "\n";
 $stmt = $this->db->prepare( $sql );
 // SQL発行
 // $this->db->execute($stmt, array($ps->id,$ps->name,time())); //これもだめでした。
 $this->db->execute($stmt, array($ps->id,$ps->name,date("Y-m-d H:i:s",time()) ));
 // DB切断
 $this->db->disconnect();
}
※日付は現在時刻を挿入する。
※Access2000(MySQLでありません)のデータ型→日付/時刻型 (書式:yyyy/mm/dd HH:mm:ss)
※日付型以外(文字列、数値型)はうまくいきます。
エラー内容
SQLエラー → ステートは37000

0288nobodyさん02/09/10 14:33ID:???
>>280
SQL だけで解決するのは諦めるというのはアリ?
028928702/09/10 14:38ID:20uIzqy9
>>288
とりあえず。現状、テーブルに規定値 「Date()+Time()」が入るようにしていますが、これからことを考えて知っておく必要があるのです。
0290nobodyさん02/09/10 14:39ID:20uIzqy9
>>288
すいません。288は 280に対する答えでした。
申し訳ありません。
0291nobodyさん02/09/11 23:36ID:thYL5S/g
>>288
ありがとうございます
特に処理が重くならないようなら...
メモリにいったん取り込むのはどうなんだろう、という気はします
0292nobodyさん02/09/12 11:07ID:8CV8Mtvh
PHP+MySQLで日本語の検索がうまくいきません。

LIKE '%(ア%' AND 'ア%' など。
どなたか教えてください。

よろしくお願いします。

0293M02/09/12 17:59ID:???
MySQLは日本語有効にしてる?
DBに格納されている文字と検索文字の文字コードは同じになってる?
029427102/09/15 05:59ID:b9MOuSqZ
>>276-277

ありがとうございました。
アドバイスを参考にして設計しなおしました。
ユーザー情報とは別に「所有アイテム情報テーブル」を作って、

所有者ID
番号(所有者IDごとに連番)
アイテムID
その他…

の列を作ります。
削除/取得時のレコードの処理をすっきりさせるため、
アカウント作成時に、
アイテム最大所持可能数分のレコードを、あらかじめ番号を振って作っておきます。
(まとめて並べておいた方が検索が速くなるんじゃないかという事も期待して)
アイテム取得時には、
アイテムID=nullで一番若い番号のレコードに、情報を書く。
アイテム削除時には、
当該レコードのアイテムIDをnullにする。

検索速度を上げるために、ユーザーIDでインデックスを作る。

というようなものです。
これは妥当でしょうか?
0295nobodyさん02/09/16 05:55ID:???
>>294
>アイテム最大所持可能数分のレコードを、あらかじめ番号を振って作っておきます。
>(まとめて並べておいた方が検索が速くなるんじゃないかという事も期待して)

updateをしたら、見た目には並んでても、データベースの内部的にはバラバラになっていきます。
それに、アカウント取るだけ取って利用しないユーザーも居るはず。
今現在使ってるレコード以外、作る必要なし。

ま、MySQLなら相当なレコード数じゃ無い限り、スピードの事は考えるな。
インデックスも、レコード数が少なければ逆効果という罠。

0296nobodyさん02/09/18 10:52ID:uXrI3/gA
>>295

>インデックスも、レコード数が少なければ逆効果という罠。
まぢですか!( ̄□ ̄;)!!

実際、どれくらいから効率的なのでしょうか?
029729402/09/19 10:36ID:+XOYWduW
>>295

そうなんですかー。
DBの速度とか負荷が未経験なので、
かなり臆病なプログラミングになってる感じなんですが、
そんなに細かい気を遣う必要もないんですね。
0298名無しさん@そうだ選挙にいこう02/09/19 10:57ID:D+O6nPi3
MYSQLにデータを書き込む時ってロックはいるの?
調べてもわかりません。教えてください。
0299nobodyさん02/09/19 22:38ID:jD2DR/iO
>>185
外注してください。
お願いします。
0300nobodyさん02/09/20 00:57ID:???
>>298
>MYSQLにデータを書き込む時ってロックはいるの?
データの整合性を保つため、基本的に必要。
ただし、CGIなどでファイル書き出しと読み込みでかち合うために、
ファイルを壊す、といった事は無い。
0301nobodyさん02/09/20 14:10ID:???
>>300
>CGIなどでファイル書き出しと読み込みでかち合うためにファイルを壊す

こんな事ってあるの?
同時書き込みだけだと思ってたが…
0302nobodyさん02/09/20 23:44ID:???
ファイルを壊す、といった事は無い。
ファイルを壊す、といった事は無い。
0303nobodyさん02/09/21 08:50ID:0HoT4fY5
あるフィールドの値をインクリメントしたい時に、
selectした値をPHPで++してupdateするのではなく、
一文のSQLで書くことはできませんか?
0304nobodyさん02/09/21 16:29ID:???
コネクションプールとか考えているいます?
PHPそのものの機能にはないですよね?
自前でプールクラス用意するしかないのかな
030530002/09/21 16:56ID:???
>>302
>ファイルを壊す、といった事は無い。
そうだね。ファイルの中身が壊れる、だ。

>>303
update test set value=value+1 where id=1
0306nobodyさん02/09/21 20:15ID:bcr2D3RX
あの、PHPとMYSQL
を使った無料検索エンジンスクリプトって
どこかにないでしょうか?
アクセスランキングじゃない奴です。
030730302/09/21 20:28ID:???
>>305
ありがとうございました。
0308nobodyさん02/09/22 01:40ID:???
>>306
お前ラーメンマン?
0309あぼーんNGNG
あぼーん
0310nobodyさん02/09/24 16:49ID:???
>309
           ∧_∧  / ̄ ̄ ̄ ̄ ̄ ̄ ̄
           ( ´Д` ) < 通報しますた!
          /,  /   \_______
         (ぃ9  |
          /    /、
         /   ∧_二つ
         /   /
        /    \       ((( )))  / ̄ ̄ ̄ ̄ ̄ ̄ ̄
       /  /~\ \     ( ´Д` ) < 通報しますた!
       /  /   >  )     (ぃ9  )  \_______
     / ノ    / /    /    ∧つ
    / /   .  / ./     /    \     (゚д゚) ツーホーシマスタ!
    / ./     ( ヽ、     / /⌒> )     ゚(  )−
   (  _)      \__つ  (_)  \_つ     / >      (・∀・)ツーホー!
0311うんこ02/09/27 12:51ID:s5yVUu+t
>>304

持続的接続のことでしょうか?

http://www.php.net/manual/ja/features.persistent-connections.php
http://www.php.net/manual/ja/function.msql-pconnect.php
031230402/09/28 00:48ID:c3sX3Ag2

>>311
あ、ありがとう。いつも普通にmysql_pconnect()使ってるのに
まったく気づいてなかった・・・。
たしかにこれでいけてるようですね。
今度時間があれば負荷はかってみます。
0313nobodyさん02/09/28 01:40ID:AP2KcdnO
>>308 ピンポーン。当たり。今、勉強中。がんばるよ。
0314名無しさん@そうだ選挙にいこう02/09/28 10:59ID:???
>>313
おう!がんがれ!
0315nobodyさん02/09/30 09:52ID:KKxE6nj4
MySQLでRollBackだけができません...
みなさんどのように対処してます?
0316nobodyさん02/09/30 11:29ID:???
>>315
ネタかい?
ロールバックできないのはMySQLの仕様だぞ?
031731502/09/30 11:34ID:KKxE6nj4
>>316
resありがとうございます
バージョンによっては出来るとか出来ないとか書いてあったんです・・・
それで出来ない人はどういうふうに対応してるのかなって思って
あうぅ。。。トランザクションエラー処理かけて戻したいですぅ・・・(T-T
0318noodyさん02/09/30 11:40ID:???
Maxでできるんじゃねえの?
031931702/09/30 12:07ID:KKxE6nj4
>>318
Maxですか???
032051202/09/30 12:29ID:???
>>317

MySQL-MAXってやつだよ
0321noodyさん02/09/30 12:40ID:???
>>319
http://www.mysql.jp/mysql/TIPS/transaction.html
032231902/09/30 12:50ID:KKxE6nj4
>>320-321
ありがとうございます
さっそく調べて実行してみます
032331902/09/30 13:19ID:KKxE6nj4
うちのMySQLのバージョンが古くてinnodbが含まれていないようなのですが、
http://www.innodb.comからダウンロードして設定すれば使えるようになるかな?
032431902/09/30 13:47ID:KKxE6nj4
うちのバージョン
mysql Ver 11.12 Distrib 3.23.33, for pc-linux-gnu (i686)
これはバージョンアップした方が早かったりするのか・・・
0325nobodyさん02/10/01 02:33ID:???
Mysqlのデータを300になったら古いのから削除するには
php側はどのように書けばいいですか?
0326nobodyさん02/10/01 14:28ID:EJy0Vdqk
>>325
300になったらって、なにが300かわからん
具体的な表があると答えやすいかも
032731902/10/01 15:13ID:dCttkLX0
3.23.33ではrollback処理ができないので、
LOCK TABLEでいくつかの処理が行えるという事がわかったんですが
使用方法がいまいちわかりません・・・。
rollback処理のように開始状態に戻すにはどのようにすればよいのでしょう?

↓普通にOCK TABLEを使用した例です
mysql> LOCK TABLES real_table WRITE, insert_table WRITE;
mysql> insert into real_table select * from insert_table;
mysql> TRUNCATE TABLE insert_table;
mysql> UNLOCK TABLES;

よろしくお願いします
0328nobodyさん02/10/01 15:28ID:???
>>326
ありがとうございます。
┌──┬────┬────┐
│ id  │ Mem   │ Mail   │
├──┼────┼────┤
│1   │Xxx    │Xxxx   │
├──┼────┼────┤

│    │      │      │

│299 │Xxx    │Xxxx   │
├──┼────┼────┤
│300 │Xxx    │Xxxx   │
└──┴────┴────┘
         ↓
┌──┬────┬────┐
│ id  │ Mem   │ Mail   │
├──┼────┼────┤
│2   │Xxx    │Xxxx   │
├──┼────┼────┤

│    │      │      │

│299 │Xxx    │Xxxx   │
├──┼────┼────┤
│301 │Xxx    │Xxxx   │
└──┴────┴────┘
データが300というのはこんな感じなんですが、掲示板のように後からデータ入力されて蓄積されるので、
id 1が古いデータになるので、id 301 が追加されると、id 1 が削除される。
この時の300という上限枠をどのようにしたらいいのか
わからない、というかどんな感じにすればいいでしょうか?お願いします。
0329hmk02/10/01 15:50ID:???
>>328 MySQLは良く知らんが、
まず、
"SELECT COUNT(*) FROM the_table" の結果を変数 $cnt に代入せよ。
そして、
"DELETE FROM the_table WHERE id<=${cnt}-300" せよ。
0330nobodyさん02/10/01 16:19ID:???
>>329
あーなるほど、わかりました。
ありがとうございます。
0331nobodyさん02/10/03 13:23ID:m4AMz0v6
>>329
COUNT しちゃだめっしょ うまくいくのは一回目だけ...
0332nobodyさん02/10/03 13:32ID:???
行数拾って300引いて、
正ならその分だけ上から Delete。
0333nobodyさん02/10/07 16:51ID:???
あげ
0334nobodyさん02/10/07 19:16ID:???
何故この板はこんなに人が少ないんだ?
Webプログラミングしてる人間が少ないのか?
0335hmk02/10/07 19:57ID:???
>>331
そうでした。失礼しました。

>>334
何ででしょうね。
本業でやってる人はこんなところに来る必要なないにしても、趣味でいじくってる人は沢山いてもよさそうだが。
他の板とか2ch以外のところで解決してるのかな。
0336nobodyさん02/10/08 14:53ID:???
ページの分割で Mysqlのレコードの20から30を呼び出すにはどうすればいいですか?
0337nobodyさん02/10/08 15:40ID:???
>>336

http://www.mysql.com/doc/en/SELECT.html
0338nobodyさん02/10/08 16:47ID:???
>>337
ありがとう
0339nobodyさん02/10/08 17:02ID:???
>>337
ありがとうって....
あんたあれだけで解るのか?ある意味凄えーーー
0340nobodyさん02/10/09 15:13ID:???
hoge というテーブルが存在するかどうかを調べたいのですが、
どのような方法があるのでしょうか?

現在は SELECT 文を発行して
mysql_error() から判断していますが、
何か他にスマートな方法があるのではないかと思いまして……。
0341nobodyさん02/10/09 15:42ID:k7vFrv7Z
>>340
あんがい、'show databases' がつかえたりして
0342 02/10/09 15:54ID:???
あの〜激しくスレ違いな気がしたのですが質問させていただきます。
PHPで一階層上のファイルを指定するにはどうしたらよいのでしょうか?
HTMLで1階層上を指定するには「../」(ドットドットスラッシュ)ですが、
PHPで同じ事をやろうとしてもうまくいかないみたいです。
すごく初心者な質問で申し訳ないのですがどなたかご教授お願いします。
0343hmk02/10/09 21:12ID:???
>>342
【PHP】質問スレッド Part5
あたりで質問したら?
0344nobodyさん02/10/11 16:35ID:F1zE+kMi

>>14-50
>>298-305

すいません結局頻繁に書き込みされる掲示板などで
MySQL使うな!ってことですか?

MySQLでのトランザクションは遅くてインデックスつくれないカラムとかある
lock tables ではテーブルにロックがかかってしまう
ロックなしではファイルの中身がおかしくなる危険がある

get_lock()の使い方がよくわかりません!
↑これで解決できますか?
0345質問02/10/11 17:04ID:5gjwH8o2
phpでサイトを組むことになりました。
頻繁に更新やバージョンアップが行われそうなかんじです。

そこで質問ですがPHPでのコーディングの見本みたいなのってありますでしょうか?
こうコーディングしろみたいな。
なんか一冊本を読んでみたら、あんまりいいソースではなさそうなので。
へんにテクニックはしったトリッキーなのではなく実際の運用、メンテなんかも考慮して
いいソースがあったら教えてください。
0346nobodyさん02/10/11 17:27ID:vFRmIjHv
>>344
よかったら俺の開発したクラスでも使いたまへ。

/*
ロックするクラス
使い方
//インスタンス生成→初期化→ロック実行
$issue_lockSet = new lockSet;$issue_lockSet->init("lockman",10);$issue_lockSet->lock_suru();
// 更新作業する。
//lockをはずす
$issue_lockSet->lock_kaijo();unset($issue_lockSet);
*/

class lockSet{
var $string;var $timeout;
function init($inputString, $inputTime)
{
$this->string = $inputString;$this->timeout = $inputTime;
}
function lock_suru(){
global $my_con;
if (!$result_lockSet = @mysql_query("select GET_LOCK(\"$this->string\",$this->timeout)",$my_con)){
print "データのロックに失敗しました コード=".mysql_errno()."<br>";exit;}
$get_lock = mysql_fetch_array($result_lockSet);
if ($get_lock[0] != 1){print ("他のスレッドによるロックがかかっています<br>しばらく置いてからもう一度トライしてください。");exit;}
mysql_free_result($result_lockSet);
}
function lock_kaijo(){
global $my_con;
if (!@mysql_query("SELECT release_lock(\"$this->string\")",$my_con)){print "ロックの開放に失敗しました<br>";exit;}
}
}
0347nobodyさん02/10/11 19:53ID:???
>ロックなしではファイルの中身がおかしくなる危険がある
これはMySQLに限ったことじゃないんじゃないのか?
0348名前02/10/11 20:15ID:???
すいません。PHP&mysqlでデータベース使おうと思ってるんですが、
ローカルから接続しようとすると
DBI->connect(atmarkit:localhost) failed: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2) at list1.pl line 5
Can't call method "prepare" on an undefined value at list1.pl line 6.
とやられてしまいます。
http://www.atmarkit.co.jp/flinux/index/indexfiles/mysqlindex.htmlの記事を読んで、そのままやってみたのですが、うまくいきません。
権限の問題なのでしょうか?
0349nobodyさん02/10/11 20:54ID:???
>>348

何故 ".pl" なの?
035034402/10/11 21:06ID:F1zE+kMi
>>346さんありがとうございます!!
ってちゃんとクラス使ったことのない初心者なんでちゃんとクラスの勉強して
使わせて頂きます!

>>347
そうですね、MySQlだけ、みたいな書き方してましたね
紛らわしいいカキコですいませんでした。
0351nobodyさん02/10/11 21:39ID:???
2つのルーチンで半分ずつデータを作って、それを別のルーチンが全部読み込むという処理なんですが、
A,B,C,D,E,F,G,H,I
と1つのテーブルで処理するのと
A,B,C,D,E
A,F,G,H,I
と2つのテーブルにするのとでは、どちらが処理時間が短く済みますか?
0352nobodyさん02/10/12 01:10ID:???
>>351
ケースバイケースだね。
レコード数にもよるし…

毎度毎度joinするなら、一つにして置いた方が良いけど、
それぞれ別で使うけど、たまにjoinする位なら分けても良いだろうね。

どんな処理が一番使用頻度が高いのか見極めないと…

単純に、全てのデータを読み込むだけってなら、一つの方。
0353nobodyさん02/10/14 20:41ID:OXcSlbm9
>>348
http://www.atmarkit.co.jp/flinux/rensai/mysql04/mysql04b.html
のやつそんまま動かしたね?それPerlの記事…
http://www.atmarkit.co.jp/flinux/rensai/mysql05/mysql05b.html
を見られたし。
0354nobodyさん02/10/14 23:11ID:BzOMwuS2
著しく既出かもしれませんがPHP+MySQLで

$sql="select * from table1 where year>1998 and month>9 ;

where以降の複数の条件をプルダウン形式か何かで選択して、ボタンで実行するのに何か助言が参考URLがあればよろしくお願いします。
0355nobodyさん02/10/15 00:00ID:???
$sql = "SELECT * FROM table1 WHERE year>{$_GET['year']} AND month>{$_GET['month']}";
ってか質問するレベルじゃないだろ
0356nobodyさん02/10/15 00:01ID:???
XSS に気を使えよ。
0357hmk02/10/15 00:09ID:JxJ8+H53
>>354
MySQLはよく知らんが、以下のようにすればよいでしょう。WHEREで指定する条件を以下のように配列に入れてからimplode()する方法ですと、条件を簡単に付け加えられるので皆様におすすめします。PHP4の場合、フォーム変数を$_GET等で取得するのを忘れずに。

<?php
// ここでDB接続する。

$where[] = "year>${year}";
$where[] = "month>${month}";
$sql = "SELECT COUNT(*) FROM table1 WHERE " . implode(" AND ", $where);

// 結果を$cntに代入する処理をする。
?>
<html><body>
<?php if (empty($submit)) { ?>
<form action="">
年を選んで下さい。
<select name="year">
<option value="1999">1999</option><option value="2000">2000</option><option value="2001">2001</option>
</select><br>
月を選んで下さい。
<select name="month">
<option value="1">1</option><option value="2">2</option><option value="3">3</option>
</select><br>
<input type="submit" name="submit" value="送信">
</form>
<?php } else { echo "該当${cnt}件"; } ?>
</body></html>
0358nobodyさん02/10/15 00:52ID:???
ってかみんなユーザーからのリクエスト(POST、GET)の値を生でSQL文とかに入れてんのか??
セキュリティ的にヤバイだろ。

>357
そんなんだと単純なSQL文にしか対応できないからヤダ
0359hmk02/10/15 01:27ID:JxJ8+H53
>>358
>セキュリティ的にヤバイだろ
「生で」の意味がよくわからないが、掲示板程度のものならセキュリティなんて問題にならないと思われ。

>そんなんだと単純なSQL文にしか対応できないからヤダ
そんなことはない。

例えば、以下のようにすれば状況に応じて条件を加えたり外したりできる。
if ($male_only == TRUE) {
$where[] = "SEX='male'";
}

また、357の例だとAND条件しか出てこないが、工夫次第でOR条件も組み合わせられる。
上記方法は、約一年の業務経験から、コーディング速度、メンテナンス性共に高いものだと思われます。

お前ら、WHERE句の柔軟な整形法について何か他の意見はありませんか?
0360nobodyさん02/10/15 01:29ID:???
> 掲示板程度のものならセキュリティなんて問題にならないと思われ。

氏ねよ。
0361nobodyさん02/10/15 01:31ID:???
>>358
> ってかみんなユーザーからのリクエスト(POST、GET)の値を生でSQL文とかに入れてんのか??
> セキュリティ的にヤバイだろ。

356氏が喚起してる。
0362nobodyさん02/10/15 01:34ID:lZ9npSqA
>>357
うまく行きました。ありがとうございました。
OR条件もうまくいきました。感謝です。
0363hmk02/10/15 01:59ID:JxJ8+H53
>>360,361
掲示板程度云々は言い過ぎました。失礼しました。
だけど、SQLの検索条件にするだけなら、「生」で問題はないのでしょう?
0364nobodyさん02/10/15 02:26ID:0Z8FjDM5
>>363
「ちょっとくらいなら」とか言って生で中出しするタイプだな。
0365 02/10/15 02:37ID:???
「生」で insert
■ このスレッドは過去ログ倉庫に格納されています