1

jQuery Tag-it! を使用しています。ユーザー向けの「スキル」入力フォームを作成します。tag-it の UI は機能していますが、ユーザー入力を PHP 配列に取得できません。この配列をシリアル化し、後で表示するために mysql データベースに保存しようとしていますが、データを配列に入れることさえできません。

tag-it を初期化する JavaScript は次のとおりです。

$('#skills').tagit({     
    allowSpaces: true,
    placeholderText: "Separate skills with a comma please",
    autocomplete: true
});

HTMLは次のとおりです。

<div>
    <label class="add_label">Skills: </label>
    <ul id="skills" style="width: 275px; margin-bottom: 8px;"></ul>
</div>

これは、ユーザー入力が保存されることになっている入力フィールドを作成する JavaScript です。

if (!this.options.singleField) {
       var escapedValue = label.html();
       tag.append('<input type="hidden" style="display:none;" value="' + escapedValue + '" name="' + this.options.fieldName + '" />');
}

そして、これはユーザー入力を取得する PHP です。これは機能していない部分です。フォームからデータを取得できません:

$skillsArr = $link->real_escape_string($_POST['skills']);

フォームを送信すると、mysqli クエリが実行され、データベースに "N;" と表示されます。シリアル化された配列があるべき場所。

jQuery Tag-it の値を、シリアル化して mysql データベースに保存できる PHP 配列に取得するにはどうすればよいですか?

4

2 に答える 2

1

バックエンド (php/mysqli) ですべてのクエリを実行する方が簡単であることがわかりました。

そうすれば、jQuery オートコンプリートで必要だったのは次の 1 つだけでした。

<script>
$(document).ready(function(){
  $("#tagit").tagit({
    autocomplete: {
   source: "ajax-search.php",
}
  });
});
</script>

ファイルのソースを定義しました。必要に応じてこれに区切り文字などを追加できます (代わりにソースを変更しただけです)。

ただし、主な関数は php ファイルからのもので、JSON エンコードされた結果を返します。

<?php
include("dbconnect.php"); //Including our DB Connection file

    if ( !isset($_REQUEST['term'])) //if there's no search, exit
  exit;

    $keyword = trim($_REQUEST['term']);
    $keyword = mysqli_real_escape_string($db, $keyword);
    $query = "SELECT * FROM animals WHERE english LIKE '%$keyword%' LIMIT 10";
    $result = mysqli_query($db, $query); //Run the Query

    $data = array(); //initialize array

    if ($result && mysqli_num_rows($result)){
   while($row = mysqli_fetch_assoc($result)){
      $data[] = array(
        'id' => $row['row_id'],
    'label' => $row['english'], //This is the 'live return of the search
    'value' => $row['eng_dir'], //The value returned. Not needed if you're returning the label
    'latin' => $row['latin'] //Another result (you can add more)
       );
    }
     }
    echo json_encode($data);
    flush();
  ?>

次に、tag-it.js ファイル内で、タグとしてプッシュするものを選択できます。

if (this.options.availableTags || this.options.tagSource || this.options.autocomplete.source) {
   var autocompleteOptions = {
   select: function(event, ui) {
     that.createTag(ui.item.id); //pushes the ID
 that.createTag(ui.item.value); //pushes the value
     that.createTag(ui.item.label); //pushes the label
     that.createTag(ui.item.latin); //pushes the extra variable
 // Preventing the tag input to be updated with the chosen value.
 return false;
    }
   };
  $.extend(autocompleteOptions, this.options.autocomplete);

上記のコードは、結果に応じて同じタグの 4 つのインスタンスを返します。

于 2013-06-28T13:24:03.217 に答える
1

問題は、tag-it がデフォルトで次のようなデータを含むポスト リクエストを送信することです。

tags=foo&tags=bar&tags=blah

PHP は、$_POST['tag'] ='blah' にすることでそれを解釈します。PHP が配列のように処理するには、投稿データは次のようにする必要があります。

tags[]=foo&tags[]=bar&tags[]=blah

これを解決する最も簡単な方法は、次のように、tag-it をセットアップするときに fieldName パラメーターを変更することです。

$('.taglist').tagit({
    allowSpaces: true,
    placeholderText: 'add new tag here...',
    fieldName: 'tags[]'
});

[] を含むように名前を変更するだけで、PHP によって必要に応じて解釈され、配列になります。

または、調整できない場合は、生の PHP データを常に処理して、次のようにタグを配列として取得できます。

$query = array();
foreach (explode('&', file_get_contents('php://input')) as $kv) {
    list($k, $v) = explode('=', $kv);
    $k = urldecode($k);
    $v = urldecode($v);
    if (!isset($query[$k])) {
        $query[$k] = $v;
    } else {
        if (is_array($query[$k])) {
            $query[$k][] = $v;
        } else {
            $query[$k] = array($query[$k], $v);
        }
    }
}

これで $query['tags'] は予想どおり配列になります。

注意: タグが 1 つしか送信されない場合は、上記のコードの文字列になるため、結果がループなどになる場合は配列としてキャストしてください。

foreach((array)$query['tags'] as $tag) ...
于 2013-06-24T15:49:47.243 に答える