PHP + MySQL
■ このスレッドは過去ログ倉庫に格納されています
0001ECY
NGNG0293M
02/09/12 17:59ID:???DBに格納されている文字と検索文字の文字コードは同じになってる?
0294271
02/09/15 05:59ID:b9MOuSqZありがとうございました。
アドバイスを参考にして設計しなおしました。
ユーザー情報とは別に「所有アイテム情報テーブル」を作って、
所有者ID
番号(所有者IDごとに連番)
アイテムID
その他…
の列を作ります。
削除/取得時のレコードの処理をすっきりさせるため、
アカウント作成時に、
アイテム最大所持可能数分のレコードを、あらかじめ番号を振って作っておきます。
(まとめて並べておいた方が検索が速くなるんじゃないかという事も期待して)
アイテム取得時には、
アイテムID=nullで一番若い番号のレコードに、情報を書く。
アイテム削除時には、
当該レコードのアイテムIDをnullにする。
検索速度を上げるために、ユーザーIDでインデックスを作る。
というようなものです。
これは妥当でしょうか?
0295nobodyさん
02/09/16 05:55ID:???>アイテム最大所持可能数分のレコードを、あらかじめ番号を振って作っておきます。
>(まとめて並べておいた方が検索が速くなるんじゃないかという事も期待して)
updateをしたら、見た目には並んでても、データベースの内部的にはバラバラになっていきます。
それに、アカウント取るだけ取って利用しないユーザーも居るはず。
今現在使ってるレコード以外、作る必要なし。
ま、MySQLなら相当なレコード数じゃ無い限り、スピードの事は考えるな。
インデックスも、レコード数が少なければ逆効果という罠。
0296nobodyさん
02/09/18 10:52ID:uXrI3/gA>インデックスも、レコード数が少なければ逆効果という罠。
まぢですか!( ̄□ ̄;)!!
実際、どれくらいから効率的なのでしょうか?
0297294
02/09/19 10:36ID:+XOYWduWそうなんですかー。
DBの速度とか負荷が未経験なので、
かなり臆病なプログラミングになってる感じなんですが、
そんなに細かい気を遣う必要もないんですね。
0298名無しさん@そうだ選挙にいこう
02/09/19 10:57ID:D+O6nPi3調べてもわかりません。教えてください。
0299nobodyさん
02/09/19 22:38ID:jD2DR/iO外注してください。
お願いします。
0300nobodyさん
02/09/20 00:57ID:???>MYSQLにデータを書き込む時ってロックはいるの?
データの整合性を保つため、基本的に必要。
ただし、CGIなどでファイル書き出しと読み込みでかち合うために、
ファイルを壊す、といった事は無い。
0301nobodyさん
02/09/20 14:10ID:???>CGIなどでファイル書き出しと読み込みでかち合うためにファイルを壊す
こんな事ってあるの?
同時書き込みだけだと思ってたが…
0302nobodyさん
02/09/20 23:44ID:???ファイルを壊す、といった事は無い。
0303nobodyさん
02/09/21 08:50ID:0HoT4fY5selectした値をPHPで++してupdateするのではなく、
一文のSQLで書くことはできませんか?
0304nobodyさん
02/09/21 16:29ID:???PHPそのものの機能にはないですよね?
自前でプールクラス用意するしかないのかな
0305300
02/09/21 16:56ID:???>ファイルを壊す、といった事は無い。
そうだね。ファイルの中身が壊れる、だ。
>>303
update test set value=value+1 where id=1
0306nobodyさん
02/09/21 20:15ID:bcr2D3RXを使った無料検索エンジンスクリプトって
どこかにないでしょうか?
アクセスランキングじゃない奴です。
0309あぼーん
NGNG0310nobodyさん
02/09/24 16:49ID:???∧_∧ / ̄ ̄ ̄ ̄ ̄ ̄ ̄
( ´Д` ) < 通報しますた!
/, / \_______
(ぃ9 |
/ /、
/ ∧_二つ
/ /
/ \ ((( ))) / ̄ ̄ ̄ ̄ ̄ ̄ ̄
/ /~\ \ ( ´Д` ) < 通報しますた!
/ / > ) (ぃ9 ) \_______
/ ノ / / / ∧つ
/ / . / ./ / \ (゚д゚) ツーホーシマスタ!
/ ./ ( ヽ、 / /⌒> ) ゚( )−
( _) \__つ (_) \_つ / > (・∀・)ツーホー!
0311うんこ
02/09/27 12:51ID:s5yVUu+t持続的接続のことでしょうか?
http://www.php.net/manual/ja/features.persistent-connections.php
http://www.php.net/manual/ja/function.msql-pconnect.php
0312304
02/09/28 00:48ID:c3sX3Ag2>>311
あ、ありがとう。いつも普通にmysql_pconnect()使ってるのに
まったく気づいてなかった・・・。
たしかにこれでいけてるようですね。
今度時間があれば負荷はかってみます。
0313nobodyさん
02/09/28 01:40ID:AP2KcdnO0314名無しさん@そうだ選挙にいこう
02/09/28 10:59ID:???おう!がんがれ!
0315nobodyさん
02/09/30 09:52ID:KKxE6nj4みなさんどのように対処してます?
0317315
02/09/30 11:34ID:KKxE6nj4resありがとうございます
バージョンによっては出来るとか出来ないとか書いてあったんです・・・
それで出来ない人はどういうふうに対応してるのかなって思って
あうぅ。。。トランザクションエラー処理かけて戻したいですぅ・・・(T-T
0318noodyさん
02/09/30 11:40ID:???0319317
02/09/30 12:07ID:KKxE6nj4Maxですか???
0321noodyさん
02/09/30 12:40ID:???http://www.mysql.jp/mysql/TIPS/transaction.html
0322319
02/09/30 12:50ID:KKxE6nj4ありがとうございます
さっそく調べて実行してみます
0323319
02/09/30 13:19ID:KKxE6nj4http://www.innodb.comからダウンロードして設定すれば使えるようになるかな?
0324319
02/09/30 13:47ID:KKxE6nj4mysql Ver 11.12 Distrib 3.23.33, for pc-linux-gnu (i686)
これはバージョンアップした方が早かったりするのか・・・
0325nobodyさん
02/10/01 02:33ID:???php側はどのように書けばいいですか?
0326nobodyさん
02/10/01 14:28ID:EJy0Vdqk300になったらって、なにが300かわからん
具体的な表があると答えやすいかも
0327319
02/10/01 15:13ID:dCttkLX0LOCK 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:???ありがとうございます。
┌──┬────┬────┐
│ 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という上限枠をどのようにしたらいいのか
わからない、というかどんな感じにすればいいでしょうか?お願いします。
0329hmk
02/10/01 15:50ID:???まず、
"SELECT COUNT(*) FROM the_table" の結果を変数 $cnt に代入せよ。
そして、
"DELETE FROM the_table WHERE id<=${cnt}-300" せよ。
0331nobodyさん
02/10/03 13:23ID:m4AMz0v6COUNT しちゃだめっしょ うまくいくのは一回目だけ...
0332nobodyさん
02/10/03 13:32ID:???正ならその分だけ上から Delete。
0333nobodyさん
02/10/07 16:51ID:???0334nobodyさん
02/10/07 19:16ID:???Webプログラミングしてる人間が少ないのか?
0335hmk
02/10/07 19:57ID:???そうでした。失礼しました。
>>334
何ででしょうね。
本業でやってる人はこんなところに来る必要なないにしても、趣味でいじくってる人は沢山いてもよさそうだが。
他の板とか2ch以外のところで解決してるのかな。
0336nobodyさん
02/10/08 14:53ID:???0337nobodyさん
02/10/08 15:40ID:???http://www.mysql.com/doc/en/SELECT.html
0340nobodyさん
02/10/09 15:13ID:???どのような方法があるのでしょうか?
現在は SELECT 文を発行して
mysql_error() から判断していますが、
何か他にスマートな方法があるのではないかと思いまして……。
0341nobodyさん
02/10/09 15:42ID:k7vFrv7Zあんがい、'show databases' がつかえたりして
PHPで一階層上のファイルを指定するにはどうしたらよいのでしょうか?
HTMLで1階層上を指定するには「../」(ドットドットスラッシュ)ですが、
PHPで同じ事をやろうとしてもうまくいかないみたいです。
すごく初心者な質問で申し訳ないのですがどなたかご教授お願いします。
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でのコーディングの見本みたいなのってありますでしょうか?
こうコーディングしろみたいな。
なんか一冊本を読んでみたら、あんまりいいソースではなさそうなので。
へんにテクニックはしったトリッキーなのではなく実際の運用、メンテなんかも考慮して
いいソースがあったら教えてください。
0346nobodyさん
02/10/11 17:27ID:vFRmIjHvよかったら俺の開発したクラスでも使いたまへ。
/*
ロックするクラス
使い方
//インスタンス生成→初期化→ロック実行
$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:???ローカルから接続しようとすると
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の記事を読んで、そのままやってみたのですが、うまくいきません。
権限の問題なのでしょうか?
0350344
02/10/11 21:06ID:F1zE+kMiってちゃんとクラス使ったことのない初心者なんでちゃんとクラスの勉強して
使わせて頂きます!
>>347
そうですね、MySQlだけ、みたいな書き方してましたね
紛らわしいいカキコですいませんでした。
0351nobodyさん
02/10/11 21:39ID:???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:???ケースバイケースだね。
レコード数にもよるし…
毎度毎度joinするなら、一つにして置いた方が良いけど、
それぞれ別で使うけど、たまにjoinする位なら分けても良いだろうね。
どんな処理が一番使用頻度が高いのか見極めないと…
単純に、全てのデータを読み込むだけってなら、一つの方。
0353nobodyさん
02/10/14 20:41ID:OXcSlbm9http://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$sql="select * from table1 where year>1998 and month>9 ;
where以降の複数の条件をプルダウン形式か何かで選択して、ボタンで実行するのに何か助言が参考URLがあればよろしくお願いします。
0355nobodyさん
02/10/15 00:00ID:???ってか質問するレベルじゃないだろ
0356nobodyさん
02/10/15 00:01ID:???0357hmk
02/10/15 00:09ID:JxJ8+H53MySQLはよく知らんが、以下のようにすればよいでしょう。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:???セキュリティ的にヤバイだろ。
>357
そんなんだと単純なSQL文にしか対応できないからヤダ
0359hmk
02/10/15 01:27ID:JxJ8+H53>セキュリティ的にヤバイだろ
「生で」の意味がよくわからないが、掲示板程度のものならセキュリティなんて問題にならないと思われ。
>そんなんだと単純なSQL文にしか対応できないからヤダ
そんなことはない。
例えば、以下のようにすれば状況に応じて条件を加えたり外したりできる。
if ($male_only == TRUE) {
$where[] = "SEX='male'";
}
また、357の例だとAND条件しか出てこないが、工夫次第でOR条件も組み合わせられる。
上記方法は、約一年の業務経験から、コーディング速度、メンテナンス性共に高いものだと思われます。
お前ら、WHERE句の柔軟な整形法について何か他の意見はありませんか?
0360nobodyさん
02/10/15 01:29ID:???氏ねよ。
0361nobodyさん
02/10/15 01:31ID:???> ってかみんなユーザーからのリクエスト(POST、GET)の値を生でSQL文とかに入れてんのか??
> セキュリティ的にヤバイだろ。
356氏が喚起してる。
0362nobodyさん
02/10/15 01:34ID:lZ9npSqAうまく行きました。ありがとうございました。
OR条件もうまくいきました。感謝です。
0363hmk
02/10/15 01:59ID:JxJ8+H53掲示板程度云々は言い過ぎました。失礼しました。
だけど、SQLの検索条件にするだけなら、「生」で問題はないのでしょう?
0364nobodyさん
02/10/15 02:26ID:0Z8FjDM5「ちょっとくらいなら」とか言って生で中出しするタイプだな。
0366hmk
02/10/15 03:53ID:OUYqpstsよくよく考えてみたのだが、ユーザからのデータは生のままDBに入れておくほうが良いと思う。セキュリティが問題となる場面では、DBから取り出した後にデータを加工すれば良いのですから。
ところで、不要/不正なデータをINSERTしないのは良いとしても、何らかの加工をしたデータを挿入するのはブ男のすることだと思う。
0368hmk
02/10/15 13:47ID:???処理速度を稼ぐためだとか、プライバシーを守るためだとかいう理由があるのなら、加工されたデータをDBに保存しておいてもよいと思うが。
0369nobodyさん
02/10/15 21:32ID:V68LrvQrif (! $result) echo mysql_error();
$affectedRows = mysql_affected_rows($result);
という何の変哲もないコードなんですが、
affected_rowsの行でエラーになります。
delete自体は問題なく行われているのですが…
何故なんでしょう?
0370nobodyさん
02/10/15 21:55ID:???mysql_connectまたはmysql_pconnectの戻り値を渡すのでは?
0371nobodyさん
02/10/15 22:04ID:???仰る通りでした。
引数に結果IDと接続IDを取るパターンがあるんですね。
すべて結果IDと思いこんでいたのでかなり悩みました。
ありがとうございました。
0372さばかん
02/10/16 13:05ID:IQMQRi3ESQL構文にそのままユーザー入力血を入れるのはやめれ
「CGI」 と 「セキュリティー」で検索すれば
いろいろ参考資料が出てくると思うが
ここに出てるのはサンプルなんで
mysql_escape_string とか使ってないだけだよね……
本物ではちゃんとエスケープしてるよね……
0373nobodyさん
02/10/16 13:57ID:???とあるときに、
$a に 「');update t_hoge set comment='';」
とされるとか。
0374nobodyさん
02/10/17 17:54ID:UeoXfZ3yhttp://www.ipa.go.jp/security/awareness/vendor/programming/a02_01_main.html
0375nobodyさん
02/10/17 20:22ID:???0376nobodyさん
02/10/17 23:47ID:???0377nobodyさん
02/10/18 00:50ID:???hmkのテーブルをdropしまくりたかったのに。
0378hmk
02/10/19 01:36ID:???まだ自前のサイト作ってないからセーフでした。
今更ながら、漏れが仕事やってたときに作ったスクリプトではヤバいかも。
ちゅうことで、>>377君、直しておいてくだちい。
0379nobodyさん
02/10/25 21:04ID:8s4WkUQVmysql -u root
set password for root=('設定するパスワード');
flush privileges;
で最後のとこで
ERROR 1045 Access denied for user: '@localhost' (Using password: NO)
ってでてつまってます。
なんか他のユーザー作成とかなにかやろうとするとすぐ同じエラーがでてきちゃう
んですけど、だれかたすけて〜
0381PHP
02/10/31 10:48ID:Ey5wVXntデータ件数が50万件くらいの規模ならサーバスペックはどれくらい必要なの?
ピークは1時間に2000件くらいかな。
PHP+Apacheのサーバを別に立てて検索させます。
みなさまプリーズ!
0382nobodyさん
02/10/31 10:50ID:YIQwg1nb0385nobodyさん
02/10/31 13:21ID:???0386nobodyさん
02/10/31 14:08ID:???>ピークは1時間に2000件
なら、一件辺りは1.8秒だろ。
家のPentium 133MHzでも十分な結果を出せる
相当複雑な問い合わせをしない限り
で、複雑なことすんの?
0387PHP
02/10/31 14:43ID:Ey5wVXnt>>386
検索一覧と、検索集計です。
テーブルは2テーブル(マスタ、明細)を利用します。
SQLは以下の通りです。
・select * from detail where xxx= 999 order by yyy;
・select * from detail where xxx = 999 order by zzz ;
・select aaa,sum(bbb),sum(ccc) from detail where xxx = 999
group by ddd
order by sum(金額) ;
0389nobodyさん
02/11/04 00:32ID:laarhpsvMySQLとPostgreSQLで
table1
id
name
table2
id
date_from 期間はじめ
date_to 期間終わり
というテーブルで、
任意の日付がtable2の期間に引っかかる場合のtable1.name
を求めるにはどうしたらよいですか?
table1のidについてtable2で複数の期間が設定されています。
よろしくお願いします。
0390nobodyさん
02/11/04 00:50ID:???SELECT t1.name FROM table1 AS t1,table2 AS t2 WHERE t1.id=t2.id AND (NOW() BETWEEN t2.date_from ND t2.date_to) GROUP BY t1.name
こういうこと?
0391389
02/11/04 01:34ID:laarhpsvサンクスコ。
うまくできました。ありがとうございました。
0392nobodyさん
02/11/07 00:21ID:xJ2aD5Sd0393nobodyさん
02/11/07 00:32ID:???http://www.mysql.gr.jp/jpdoc/3.23.x/manual.ja_Reference.html#BLOB
■ このスレッドは過去ログ倉庫に格納されています