Введите слова поля в массив php - PullRequest
1 голос
/ 17 июня 2011

Текстовое поле «Друзья» со сценарием автозаполнения (который поддерживает множественное завершение слов из столбца «полное имя пользователя») в форме регистрации. Теперь вопрос 1. Как получить массив имен из поля ввода текста и найти идентификаторы этих полных имен с помощью php? Вопрос 2: Каким образом форма регистрации будет помещать эти идентификаторы во вторую (друзья) таблицу, если новые пользователи идентифицируют неизвестных во время регистрации? Например, если посетитель пишет «Tu», скрипт находит из таблицы пользователей «Tural Teyyuboglu», дополняет ее, добавляет запятую, пользователь может добавить столько имен, сколько ему нужно. Каждый раз, когда скрипт работает. Я хочу, чтобы эти имена пользователей были разделены запятыми в массиве php, искать эти имена один за другим по идентификаторам и добавлять в таблицу друзей. Но возникает ли вторая мысль? Но как в регистрационной форме эти идентификаторы будут помещены во вторую (друзья) таблицу, если новые пользователи будут неизвестны во время регистрации?

Извините за мой плохой английский. Моя идея: у меня есть база данных пользователей, у каждого пользователя есть поле идентификатора с автоинкрементом и различные другие поля с их подробностями. Я хотел бы сохранить в записи пользователя поле с массивом друзей. Я хотел бы найти наиболее эффективный способ хранения и возможности поиска в поле «массив идентификаторов друзей» каждого пользователя и перечисления идентификаторов друзей по каждому запросу пользователя. если предположить, что в какой-то момент может существовать миллион пользователей, у каждого из которых по миллиону «идентификаторов друзей», я не думаю, что разделение их запятыми будет эффективным, какие-либо решения? может ли он быть сохранен в BLOB-объекте и найден по битам? (например, немного на человека, так что 1K-блоб может хранить до 1024 возможных комбинаций друзей). Я думаю, что другой стол - лучшее решение. Это отношение многие ко многим, я построил отдельную таблицу для друзей пользователей: usrfrnd_tbl со столбцами UserFriendID (уникальный ключ), UserID, FriendID. Я применил автозаполнение Jquery к друзьям в поле формы регистрации: когда посетитель вводит имя Существующий пользователь в это поле ввода, прежде всего, скрипт ищет существование имени, дополняет его (если существует), добавляет запятую. Пользователь может ввести второе, третье ... существующие имена пользователей в это поле, и сценарий будет выполняться автоматически каждый раз. Теперь я хочу создать php-файл, который будет искать идентификаторы этих имен пользователей, создавать массив идентификаторов, добавлять его в таблицу «usrfrnd_tbl» поля «Идентификатор друга» новых пользователей в таблице базы данных. Вопрос: 1. Как это сделать? Теперь, как получить массив идентификаторов написанных имен и поместить в поле «друзья» usr_table после отправки формы регистрации? 2. Мне нужен только идентификатор написанного имени и полное имя. Мне не нужно значение. Как я могу удалить его из кода 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);

Ответы [ 3 ]

2 голосов
/ 17 июня 2011

Хорошо, я бы предпочел реализовать вещи следующим образом:

Каждый раз, когда посетители принимают автозаполнение, создается скрытое поле ввода, как в этом очень простом шаблоне:

<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. Кроме того, я думаю, что это привело бы к гораздо более многократно используемому коду.

Надеюсь, это поможет;]

1 голос
/ 17 июня 2011

Если я правильно оцениваю ваше приложение, ваше автозаполнение заполняет поле ввода именами.Поскольку она заполнена только именами, ваша форма не знает идентификаторов, которые соответствуют каждому имени.То, что вам нужно, это решение, в котором имя будет поддерживать его идентификатор.

Это то, что я использовал: Плагин автозаполнения JQuery в стиле Facebook

Это идентичный FB.Вы можете добавлять / удалять имена и поддерживать их идентификаторы.

Когда ваша форма [POST] отправлена, ваше заполненное поле ввода будет выглядеть следующим образом:

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

Использование PHP взорватьсяфункция, вы можете получить каждый идентификатор и просто обработать вашу информацию для каждого идентификатора.Возможно, так:

$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)
}
1 голос
/ 17 июня 2011
$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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...