【问题标题】:Input field words to php array输入字段词到php数组
【发布时间】:2011-09-16 18:02:35
【问题描述】:

在注册表单中带有自动完成脚本的朋友文本框(支持从用户表的“全名”列完成多个单词)。现在问题 1:如何从文本输入字段中获取名称数组并使用 php 查找这些全名的 id?问题2:如果注册时新用户id未知,注册表如何将这些id放在第二个(朋友)表中? 例如,如果访问者编写“Tu”脚本从用户表“Tural Teyyuboglu”中找到,完成它,添加逗号,用户可以添加他想要的用户名。每次脚本都有效。我想用逗号分隔这个用户名到 php 数组,一一搜索这些用户名的 id 并添加到朋友表中。但是第二个问题发生了吗?但是,如果在注册过程中新用户 id 未知,注册表如何将这些 id 放到第二个(朋友)表中?

对不起,我的英语不好。我的想法:我有一个用户数据库,每个用户都有一个自动递增的 ID 号字段,以及其他各种带有他们详细信息的字段。我想在用户记录中存储一个包含一组朋友的字段。我想要最有效的方式来存储并能够搜索每个用户的“朋友 ID 数组”字段并列出每个用户搜索的朋友 ID。假设在某个时候可能有一百万个用户,每个用户在他们的数组中都有一百万个“朋友 ID”,我不认为用逗号分隔它们是有效的,有什么解决方案吗?它可以存储在一个blob中并按位搜索吗? (例如每人一点,所以 1k blob 最多可以存储 1024 个可能的朋友组合)我认为另一个表是最好的解决方案。这是一个多对多的关系,我为用户朋友建立了一个单独的表:usrfrnd_tbl 与列 UserFriendID(唯一键),UserID,FriendID 在我将 Jquery 自动完成应用于注册表单的朋友字段:当访问者键入名称时现有用户到此输入字段,首先,脚本搜索名称存在,完成它(如果存在),添加逗号。用户可以在此字段中键入第二个、第三个...现有用户名,并且每次脚本都会自动完成。现在我想创建 php 文件,它将搜索这些用户名的 id,创建 id 数组,将其添加到 db 表中的新用户“FriendID”字段中。问题: 1. 怎么做?现在,如何获取书面姓名的id数组,并在提交注册表后放入usr_table的“friends”字段? 2.我只需要书面姓名的ID和全名。我不需要值。如何从 jquery 代码中删除它?

HTML

<form action="index.php" method="post">      
<input class="std" type="text" name="friends" id="friends"/>
<input type="submit" name="submit">
</form>

jQuery

$(function() {
    function split( val ) {
        return val.split( /,\s*/ );
    }
    function extractLast( term ) {
        return split( term ).pop();
    }

    $( "#friends" )
        // don't navigate away from the field on tab when selecting an item
        .bind( "keydown", function( event ) {
            if ( event.keyCode === $.ui.keyCode.TAB &&
                    $( this ).data( "autocomplete" ).menu.active ) {
                event.preventDefault();
            }
        })
        .autocomplete({
            source: function( request, response ) {
                $.getJSON( "search.php", {
                    term: extractLast( request.term )
                }, response );
            },
            search: function() {
                // custom minLength
                var term = extractLast( this.value );
                if ( term.length < 2 ) {
                    return false;
                }
            },
            focus: function() {
                // prevent value inserted on focus
                return false;
            },
            select: function( event, ui ) {
                var terms = split( this.value );
                // remove the current input
                terms.pop();
                // add the selected item
                terms.push( ui.item.value );
                // add placeholder to get the comma-and-space at the end
                terms.push( "" );
                this.value = terms.join( ", " );
                return false;
            }
        });
});

search.php

$db = new mysqli('localhost', 'user' ,'pass', 'db') or die(mysqli_errno());
$q = strtolower($_GET["term"]);
if (!$q) return;
$query =  $db->query("select id, fullname from usr_table where fullname like '$q%'")  or die(mysqli_errno());
$results = array();
while ($row = mysqli_fetch_array($query)) {$results[] = array ( "id" => $row[0] , "label" => $row[1], "value" => $row[1] );}
echo json_encode($results);

【问题讨论】:

    标签: php mysql arrays autocomplete


    【解决方案1】:

    好吧,我更喜欢这样实现:

    每次访问者接受自动完成时,都会创建一个隐藏的输入字段,就像在这个非常简单的模板中一样:

    <input type="text" name="user[id]" value="Friend's name" />
    

    在一些自动完成后,动态表单将如下所示:

    <form>
        <input type="hidden" name="friends[14]" value="Stephen Hawking" />
        <input type="hidden" name="friends[22]" value="Josh Obama" />
        <input type="hidden" name="friends[19]" value="Julia Bin Laden" />
        <input type="submit" />
    </form>
    

    您的$_REQUEST 数据将以这个更优雅的关联数组结束:

    Array
    (
        [friends] => Array
            (
                [14] => Stephen Hawking
                [22] => Josh Obama
                [19] => Julia Bin Laden 
            )
    
    )
    

    有了这些结构化数据,就没有任何借口可以进行棘手的 PHP 字符串操作了。另外,我认为这会导致代码的可重用性更高。

    希望对你有帮助;]

    【讨论】:

      【解决方案2】:
      $usr_fullname = mysql_real_escape_string($_GET['usr_fullname']);
      // other user information here
      
      $friend_str = mysql_real_escape_string($_GET['friend_str']);
      
      $sql = "
      INSERT INTO usr_table 
          (`fullname`, `etc`) 
      VALUES 
          ('$usr_fullname', etc)
      ";
      
      $result = mysql_query($sql) or die(mysql_error());
      
      $new_user_id = mysql_insert_id($result);
      
      $friend_arr = explode(',', $friend_str);
      
      foreach($friend_arr as $friend_name) {
          $friend_name = trim($friend_name);
      
          if (empty($friend_name)) {
              continue;
          }
      
          $sql = "
          SELECT id
          FROM usr_table
              WHERE `fullname` = '$friend_name'
          LIMIT 1
          ";
      
          $result = mysql_query($sql);
      
          if (!$result) {
              echo "$sql failed " . mysql_error();
              exit;
          }
          if (mysql_num_rows($result) == 0) {
              continue; // this person does not exist
          }
      
          $data = mysql_fetch_array($result);
          $friend_id = $data['id'];
      
          $sql = "
          INSERT INTO usrfrnd_table 
              (`user_id`, `friend_id`)
          VALUES
              ('$new_user_id', '$friend_id')
          ";
      
          mysql_query($sql);
      }
      

      【讨论】:

      • 请帮忙。你能把我加到你的 Skype 列表中吗,我想和你聊天。请:tural.teyyuboglu
      【解决方案3】:

      如果我正确评估了您的申请,您的自动完成功能会使用名称填充输入字段。因为它只填充了名称,所以您的表单不知道与每个名称对应的 ID。您需要的是一个解决方案,其中名称将保持其 ID。

      这是我用的:Facebook style JQuery autocomplete plugin

      是同一个FB。您可以添加/删除名称,并维护其 ID。

      当您的 [POST] 表单提交时,您填充的输入字段将输出如下:

      $_POST['friends'] = "24,54,67,7,9"; // comma-delimited list of corresponding IDs
      

      使用 PHP 的explode 函数,您可以获得每个 ID 并简单地处理每个 ID 的信息。可能,像这样:

      $personAddingFriendsID = 45; // arbitrary
      $friends = explode(",", $_POST['friends']);
      
      foreach ($friends AS $friendID) {
           $insertQuery = "INSERT INTO friendsMap SET friend1 = '$personAddingFriendsID', friend2 = '$friendID";
           //etc.. (not including SQL injection)
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-10
        相关资源
        最近更新 更多