コードをrejuvinateしようとすると、私は主に14年以上前に書いています。私が書いた素敵なセットアップは、特定の場所に欠けていた、つまりユーザーの入力を処理することがなかったことがわかりました。PHP/MySQLのより良いユーザー検索
レッスン:ごみ箱、タイプミス、およびダンプをバリデーターよりも先に注入する能力を過小評価しないでください。
今やSELECTドロップダウンには470個のアイテムが存在するため、古い方法が限界に達しています。私はプロセスのこの部分を再考したいので、それが突破口を打つことについて心配する必要はありません。
したがって、タイピストが検索文字列を入力した後、同じ行にある5つのデータをチェックするように、ファジー検索メソッドを作成することを考えます。
ステージ名、2つの既知の名前、正当な名前、およびステージ名に基づいたsoundex()インデックスに対する最終チェックとして送信された名前を確認する必要があります。
do/whileループの一部として、これらのことをチェックするために複雑なコードブロックを試しました(そして、これは動作しません。 。
以下では、var $Rin
にはユーザー指定の名前が含まれています。
$setr = mysql_query("SELECT ID,StageName,AKA1,AKA2,LegalName,SoundEx FROM performers");
IF ($R = mysql_fetch_array($setr)) {
do {
$RT = substr(trim($Rin), 5);
$RT1 = substr($R[1], 5);
$RT2 = substr($R[2], 5);
$RT3 = substr($R[3], 5);
$RT4 = substr($R[4], 5);
$RTx = soundex($RT);
IF ($RT == $RT1) {
$RHits[] = $R[0];
}
IF ($RT == $RT2) {
$RHits[] = $R[0];
}
IF ($RT == $RT3) {
$RHits[] = $R[0];
}
IF ($RT == $RT4) {
$RHits[] = $R[0];
}
IF ($RTx == $R[5]) {
$RHits[] = $R[0];
}
} while ($R = mysql_fetch_array($setr));
}
私は、全体のテーブルだけがうまくいけば、より少ないヒットを持って選択し、ドロップダウンに移入ます近くヒットのID番号の年代の配列を、構築しますということでアイデア。つまり、その配列の内容から結果セットを照会することで、実行者の名前をSELECTドロップダウンに表示し、その選択肢の値としてID#を渡します。
「WHERE句で配列を使用する必要があります」というヒットをしたときに、その答えを見つけた後、私は下の規定#2のために私が運が悪いと思われ始めました。だから私は別の検索方法を見て始めました。どこにいてもわかりませんが、もっと混乱しました。
したがって、6つのフィールドについて1つのテーブルをスキャンし、ユーザー入力に対して5をチェックし、元のテーブルのサブセットに表示する6番目のテーブルを調べる方が良いでしょうか?
思考プロセス:テーブル全体に対する
、レコードごとに、この順序でこれらのテストに対するテスト$りん:
$凛 - >芸名
$凛 - > AKA1
$凛 - > AKA2
$凛 - >氏名権
のsoundex($りん) - > SOUNDEX
ここで、5つの操作のいずれかでヒットすると、結果セットを470人のパフォーマーから適切なリストに絞り込むために使用される結果配列にID#が追加されます。
に関する規定:
1)書かれたとして、私はこれは、SQLインジェクション攻撃に対して脆弱であることを知っています。
2)サーバーがPHP 4.4.9とMySQL 4.0.27-Standardを実行しているため、アップグレードできません。私はお金が費やされる前にそれが動作することを証明しなければなりません。
3)これは趣味レベルのもので、私の仕事ではありません。
4)出演者は、名前に英語以外の名前や要素を使用することが多く、データ入力タイピストによるタイプミスや重複が発生しています。
私はこの種のものについて多くのmysqliとPDOの回答を見つけました。そして、半分しか意味をなさないことがたくさんあります(下記のリンク#4のように)。私は何を壊すようにしようとすると、これらのもののスピードアップに取り組んでいます。私はJavascriptの先行入力ライブラリは良いかもしれないとのコメントで述べた
- PHP mysql using an array in WHERE clause
- PHP/MySQL small-scale fuzzy search
- MySQL SubString Fuzzy Search
- Sophisticated Name Lookup
最初に最初に "mysql_ *"がデリケートされました。代わりに "mysqli_ *"関数を使用してください。 :) – Ronald
mysqliはPHP4.4.9で利用できますか? –
数百のオプションとタイプアヘッドで、ページロード後にバックグラウンドでサービスコール(AJAX)を使用してデータをロードし、Javascriptツールで先行処理を行うことをお勧めします。 [TwitterのTypeaheadライブラリ](https://twitter.github.io/typeahead.js/examples/)、複数の列を検索している場合は特に*です。 – alttag