bugfix> php > 投稿

私のスクリプトはPHPを使用しており、イベントに登録するWebフォームのjQueryオートコンプリートを使用しています。 jQueryは name で動作します名前を選択してから、他のすべてのテキストフィールドに入力します。
ただし、データベースには過去のイベントのすべてのレコードが保存されます。たとえば、スーザンボイルは私の前のイベントの5つに参加しました、そして name Susan と入力すると、テキストフィールドに5つのスーザンボイルが表示されます 。同じ名前を除外するにはどうすればよいですか?

私のjQueryコード:

 $('input.item-autocomplete').on('autocompleteselect', function (e, ui) {
  $.ajax({
  url:"ajax_reg.php",
  dataType:"json",
  data:{
    'name' : ui.item.value,
    'action' : 'get_fulldata'
  },
  success:function(data){
    $("#mobile1").val(data.mobile1);
    $("#mobile2").val(data.mobile2);
    $("#email").val(data.rt_email);
    $("#tf1").val(data.tf1);
    $("#tf2").val(data.tf2);
    $("#tf3").val(data.tf3);
    }
   });
});

更新:申し訳ありませんが、SQLコードを忘れてしまいました。別のphpファイルにSQLを書いています。 (SQLコードadjax_reg.php)

<?php
$name = $_GET['name'];
$action = empty($_GET['action'])?'':$_GET['action'];
if(empty($name)){
exit('No data');
}
require_once("../winphplib/kernel.php");
require_once ('../winphplib/dbconnect_egen.php');
if($action=='get_name'){
    $sqlquery = "SELECT rt_name FROM reg_ticket WHERE rt_name LIKE '%$name%' LIMIT 15";
    $result = mysql_query($sqlquery) or die(mysql_error());
    while($myrow = MySQL_fetch_array($result)){
        $data[] = strtoupper($myrow['rt_name']);
    }
}elseif($action=='get_fulldata') {
$sqlquery = "SELECT * FROM reg_ticket WHERE rt_name = '$name' LIMIT 1";
$result = mysql_query($sqlquery) or die(mysql_error());
$data = mysql_fetch_assoc($result);
if(count($data)>0){
    list($data['mobile1'], $data['mobile2']) = explode("-", $data['rt_contact']);
    list($data['tf1'], $data['tf2'], $data['tf3']) = explode("-", $data['rt_ic']);
}
}
mysql_free_result($result); 
echo json_encode($data);

回答 2 件
  • あなたは users を取得する必要があります  彼らが少なくともイベントに参加したという基準で。おそらく users に参加しています   events と 、しかし、あなたは users をフィルタリングする必要があります  彼らの participation に基づいて 。次の表を使用していると仮定します。

    users(id, mobile1, mobile2, email, tf1, tf2, tf3)

    events(id, name)

    participations(id, user_id, event_id)

    次のようなクエリが必要になります。

    select id, mobile1, mobile2, email, tf1, tf2, tf3
    from users
    where exists (select 1
                  from participations
                  where users.id = participation.user_id)
    and users.name like '%Susan%'
    
    

    これにより、少なくとも1つのイベントに参加した検索テキストを含む各ユーザーのレコードが返され、必要な列が提供されます。

    編集

    編集した質問を確認しましたが、多くの修正すべき問題があります。

    クエリでSELECT *を使用しないでください

    問題点:

    大量のメモリと時間を浪費する可能性のある非常に大きなデータがある可能性があります

    機密データをユーザーに返す可能性があります

    select句で列リストを使用して、必要なものだけを選択するようにします。

    select mobile1, mobile2, rt_contact, tf1, tf2, tf3, rt_ic ...
    
    

    これを修正します。

    問題を修正する

    distinctキーワードを使用する必要があります

    select distinct mobile1, mobile2, rt_contact, tf1, tf2, tf3, rt_ic ...
    
    

    これは distinct を選択します  値ですが、矛盾がある場合、つまり、同じ人物に対して同じ名前の異なる属性がある場合、いくつかのレコードが返されます。

    LIKEなしではオートコンプリートは機能しません

    LIKE を使用する必要があります  および %...%   if のように  あなたが select したい場合   name を持つユーザー  渡されたテキストが含まれています。また、 select を傷つけることはありません   name  同様に、おそらく idname の場合  一意ではありません。

    mysql_関数は非推奨です

    代わりにPDOまたはmysqli_関数を使用してください。

    クエリにあるようにユーザー入力を使用しないでください

    これはSQLインジェクションの影響を受けやすいため、ハッカーがデータベースに危害を加えたり、ロードする資格のないデータをロードしたりすることは非常に簡単です。 PDOでパラメーター化されたクエリを使用するか、パラメーターをエスケープします。

    スパゲッティコードを書かない

    データベースを扱う部分をビュー部分からエンジン部分から分離すると、コードの保守が容易になります。

    データベースを正規化する

    通常の形式ではないデータベースは、うまく機能することはめったになく、保守が難しく、冗長性や不整合が生じやすく、通常はうまく機能しません。

  • PHPスクリプトで、 GROUP BY を追加して、SQLクエリを微調整するだけです。  句。

    私はあなたのクエリを見ていませんが、このようなもの:

    SELECT * FROM events
    JOIN artists ON events.artist_id = artists.id
    WHERE artist like :searchterm
    GROUP BY artists.artist_name
    
    

あなたの答え