2011-07-29 18 views
1

php/mysqlを使ってシンプルなWebベースのデータベースを使って、私の在庫室から出る商品を追跡するのに使用します。MySQLテーブルのエントリに基づく入力検証? (php/ajax/html/mysql)

MySQLデータベースは、テーブルの束を持っているが、私はと心配です二人は、あなたが(私は無関係な情報を省略しました)以下を参照することができます「要求」と「販売員」です。

// Autocomplete Salesperson Field 
$("#form_specialist").autocomplete("../includes/get_salesperson_list.php", { 
    width: 260, 
    matchContains: true, 
    //mustMatch: true, 
    //minChars: 0, 
    //multiple: true, 
    //highlight: false, 
    //multipleSeparator: ",", 
    selectFirst: false 
}); 

AAANDのget_salesperson_list.php:

<?php 
require_once "get_config.php"; 
$q = strtolower($_GET["q"]); 
if (!$q) return; 

$sql = "select DISTINCT S_Name as S_Name from Salesperson where S_Name LIKE '%$q%'"; 
$rsd = mysql_query($sql); 
while($rs = mysql_fetch_array($rsd)) { 
$cname = $rs['S_Name']; 
echo "$cname\n"; 
} 
?> 

私はあなたがそれらを入力して動的に弊社営業担当名のリストを移入する次のスクリプトを持っている私の頭のセクションで

Requests 
R_ID ...  R_Salesperson 
1  ...  James 
2  ...  Bob 
3  ...  Craig 

Salesperson 
S_ID   S_Name 
1  ...  James 
2  ...  Bob 
3  ...  Craig 

私はまた、営業担当者のフィールドに値を入力する必要があるいくつかの基本的なjavascript入力検証を持っています(スクリプトは頭のセクションにあります):

<!-- Input Validation --> 
<script language="JavaScript" type="text/javascript"> 
<!-- 
function checkform (form) 
{ 


// ** Validate Salesperson Entry ** 
if (form.form_specialist.value == "") { 
alert("Please enter Salesperson Name"); 
form.form_salesperson.focus(); 
return false ; 
} 
// ** END Salesperson Validation ** 

return true ; 
} 
//--> 
</script> 

Aaaaanyway - 問題は「営業担当者」テーブルにない名前を拒否する方法を見つけることができないことです。たとえば、「Jaaames」と入力すると、「James」を無視して「Jaaames」を送信すると「Requests」テーブルに入力されます。私の診断されていないOCDを考えると、これは比較的厄介なことです。私はそう頻繁に編集するたびに何百ものリクエストを処理する必要はありません。

答えて

1

ここで間違ったアプローチをしていると思います。

Requestsテーブルには営業担当者のNAMEが格納されていてはなりません。そのIDはそのIDを保存する必要があります。 Sales Personテーブルの主キー。

次に、オートコンプリートを使用してTEXT入力にデータを入力する代わりに、Sales PersonのIDを値として使用するSELECTメニューにデータを入力することをお勧めします。

これは、次のことを実現:

  1. データベースは
  2. 以上の正規化となり、それはクライアント側
  3. に営業担当者の名前を確認する必要がなくなり
  4. 要求テーブルからの冗長な情報を削除しますS_IDをRequestsテーブルの外部キーとして定義することにより、Sales PersonテーブルのエントリのみがRequestsテーブルに存在することが保証されます。
+0

ええと私は怠け者ですが、ごみコーダーです。 – Barry

0

データベースに追加する前に何らかの検証を追加してみてください。つまり、リクエストをテーブルに入れるスクリプトの中にあるのですか?あなたは、フォームの提出やフィールドがフォーカスを失ったときに多分あなたのテキストフィールドを変更したり、上のいずれかにAJAX要求を結合しようとすることができ

1

。 、あなたはまた、と話をし、このためのPHPファイルを必要とする

$('input[name=salesperson').blur(function(){ 
    //when the text field looses focus 
    var n = $(this).val(); 
    $.post('a_php_file_that_checks_db_for_names.php', {salesperson:n}, function(data){ 
     //post the name to a php file which in turn looks that name up in the database 
     //and returns 1 or 0 
     if (data) 
     { 
      if (data==='1') 
      { 
       alert('name is in database'); 
      } 
      else 
      { 
       alert('name is not in database'); 
      } 
     } 
     else 
     { 
      alert('no answer from php file'); 
     } 
    }); 
}); 

例があること:

if (isset($_POST['salesperson'])) 
{ 
    //query here to check for $_POST['salesperson'] in the db, 
    //fill in the blanks :) 
    $yourquery='select name from db where name=?'; 

    if ($yourquery) 
    { 
     //looks like there were results, so your name is in the db 
     echo '1'; 
    } 
    else 
    { 
     echo '2'; 
    } 

} 

必要な空白を埋めるのビットができますこの例では、私はjQueryのを使用しています アイデアを得る。 - あなたが販売員のリストを取得し、それぞれの隠しフォームフィールドを作ることができれば、あなたはにそれらすべてを読むことができる

秒、よりエレガントな解決策はただ頭に浮かんだ: 希望これは

EDITをあなたを助けJSオブジェクトを作成し、フォームフィールドが変更されるたびにそれに対してテストします。残念ながら私はあなたに例を書く時間がありませんが、それは私にそれをするより良い方法のように聞こえる。

-1

mustMatchオプションがあなたのために働いていないですか?私はそれがコメントアウトされて参照してください。

また、あなたのスクリプトはSQLインジェクション攻撃に対して脆弱です。私はこれが社内のアプリケーションであることを認識していますが、クレイジーが表示され、あなたの日を傷つけることはありません。

if (!preg_match("/^\w+$/", $q)) { 
    // some kind of error handling here, or at least a refusal to fulfill the request: 
    exit; 
} 

UPDATEを:あなたのget_salesperson_list.phpの上部には、あなたが$_GETからクエリを取得した直後に、あなたはこのような何かを追加することができます申し訳ありませんが、私の代わりに「リターン」の「終了」を言うことを意味しました。あなたのスクリプトが機能していないことがわかります。私はそれを説明するために上記を編集しました。それを指摘してくれてありがとう。

+0

-1、Geez、SQLインジェクションは社内アプリケーションと何が関係していますか? SQLの注入を避けるためには、常に準備された文や適切な関数(mysql_real_escape_stringなど)を使用してください。また、 'get_salesperson_list.php'は関数ではないようですので、' return'を使うと実行フローは終了しません。 –

+0

ありがとう! - 私はその機能をコメントアウトしたことに気づいていないような馬鹿みたいな気がする。 ああうまくいっている:D – Barry

1

入力を検証するためにJavascriptを使用しているようですが、ユーザーがJavascriptをサポートしていないか無効にしていても実行されないため、これはうまくいかないでしょう。上に示唆したように、サーバー側の検証はデータベースに対してチェックする方がはるかに簡単です。しかし、クライアント側の検証は、一般的に高速であるため、不正な入力に対する一種の第一の防衛線として持つのにも役立ちます。私はこれを行うための素晴らしい方法を考えることはできませんが、1つの方法は、販売員のPHP配列を作成し、それをjavascript配列に変換し、フォームの値が配列内にあるかどうかを確認することです。おそらく、ここでサーバー側の検証を使用するだけで、おそらく速くなり(コードは大幅に少なくなります)

+0

幸いにも、このweb-appは内部ネットワーク上でのみ実行されている。これは通常、いくつかのマシン上でのみ実行されています - これらはすべてjavascriptを許可しています:) – Barry

関連する問題