sql >> データベース >  >> RDS >> Mysql

SQLデータベースに基づくオートコンプリートテキストボックスの結果

    jQuery UIオートコンプリートは、ソースオプション の3種類の値を取ることができます。 :

    1. 配列 オートコンプリートに入力するもののリストが含まれています
    2. 文字列 リストをフィルタリングして結果を送信するスクリプトのURLが含まれています。プラグインは入力されたテキストを受け取り、termとして送信します 提供したURLに追加されたクエリ文字列のパラメータ。
    3. 関数 データを取得し、そのデータを使用してコールバックを呼び出します。

    元のコードは最初の配列を使用しています。

    var availableTags = [
      "autocomplete.php";
    ];
    

    オートコンプリートを示すのは、文字列"autocomplete.php" オートコンプリートするもののリストにあるのはこれだけです。

    あなたがやろうとしていたことは、次のようなものを埋め込んだことだと思います:

    $(function() {
    
      var availableTags = [
        <?php include("autocomplete.php"); /* include the output of autocomplete as array data */ ?>;
      ];
    
      $( "#tags" ).autocomplete({
        source: availableTags
      });
    
    });
    

    データベースから返されるもののリストが常に短いままであると仮定すると、それはおそらく問題なく機能します。 PHPからの生の出力をJSに押し込んでいるだけなので、このようにするのはちょっと壊れやすいです。返されたデータに"が含まれている場合 addSlashes を使用する必要がある場合があります 正しくエスケープします。ただし、*ではなく単一のフィールドを返すようにクエリを変更する必要があります 、行全体ではなく、オートコンプリートのラベルとして1つのフィールドのみが必要になる可能性があります。

    特にリストが非常に大きくなる可能性がある場合は、2番目の方法を使用することをお勧めします。

    $(function() {
    
      var availableTags = "autocomplete.php";
    
      $( "#tags" ).autocomplete({
        source: availableTags
      });
    
    });
    

    これには、リストを取得しているバックエンドスクリプトに変更を加えて、フィルタリングを実行する必要があります。この例では、プリペアドステートメント を使用しています。 ユーザーが$termにデータを提供したことを確認します SQLインジェクション を利用できません :

    <?php
    
    include('conn.php');
    
    // when it calls autocomplete.php, jQuery will add a term parameter
    // for us to use in filtering the data we return. The % is appended
    // because we will be using the LIKE operator.
    $term = $_GET['term'] . '%';
    $output = array();
    
    // the ? will be replaced with the value that was passed via the
    // term parameter in the query string
    $sql="SELECT name FROM oldemp WHERE name LIKE ?";
    
    $stmt = mysqli_stmt_init($mysqli);
    
    if (mysqli_stmt_prepare($stmt, $sql)) {
    
      // bind the value of $term to ? in the query as a string
      mysqli_stmt_bind_param($stmt, 's', $term);
    
      mysqli_stmt_execute($stmt);
    
      // binds $somefield to the single field returned by the query
      mysqli_stmt_bind_result($stmt, $somefield);
    
      // loop through the results and build an array.
      while (mysqli_stmt_fetch($stmt)) {
          // because it is bound to the result
          // $somefield will change on every loop
          // and have the content of that field from
          // the current row.
          $output[] = $somefield;
      }
    
      mysqli_stmt_close($stmt);
    }
    
    mysqli_close($mysqli);
    
    // output our results as JSON as jQuery expects
    echo json_encode($output);
    
    ?>
    

    mysqliを使用してからしばらく経ちました。そのため、コードはテストされていないため、微調整が必​​要になる場合があります。

    プリペアドステートメントを適切に使用するとSQLインジェクションが不可能になるため、プリペアドステートメントを使用する習慣を身に付けるとよいでしょう。代わりに、通常のプリペアドされていないステートメントを使用して、ユーザーが提供したすべてのアイテムを mysqli_real_escape_string SQLステートメントに挿入する前に。 ただし 、これを行うとエラーが発生しやすくなります。攻撃にさらされるためには、1つのことを逃れるのを忘れるだけです。 主要な「ハッキング」 最近の歴史では、SQLインジェクションの脆弱性を導入するずさんなコーディングが原因です。

    プリペアドされていないステートメントを本当に使い続けたい場合、コードは次のようになります。

    <?php
      include('conn.php');
    
      $term = $_GET['term'];
      $term = mysqli_real_escape_string($mysqli, $term);
      $output = array();
    
      $sql = "SELECT name FROM oldemp WHERE name LIKE '" . $term . "%';";
    
      $result = mysqli_query($mysqli,$sql) or die(mysqli_error());
    
      while($row=mysqli_fetch_array($result))
      {
        $output[] = $row['name'];
      }
    
      mysqli_close($mysqli);
    
      // output our results as JSON as jQuery expects
      echo json_encode($output);
    ?>
    


    1. SQL Server 2016:可用性グループの機能強化

    2. SQL Server(T-SQL)の文字列の途中に文字を挿入する

    3. postgresで指数移動平均を計算する方法は?

    4. %の代わりにMySQLの1つの文字を一致させる方法は?