Разделение имени и фамилии с помощью даталистов

Я использую список данных для хранения всех имен и фамилий, которые я получаю из таблица базы данных MySQL.

Когда кто-то вводит имя и репетитора и нажимает "показать репетитора", вызывается showTutor().

<input list="tutorData" name="tutors" id="tutorToShow">
<datalist id="tutorData">
    <?php
    $sql = "SELECT name, surname FROM tutors ORDER BY surname ASC";
    if (!$res = $link->query($sql)) {
        trigger_error('error in query ' . $link->error);
    } else {
        while ($row = $res->fetch_assoc()) {
            $name = $row['surname'];
            $sName = $row['name'];
            ?>

            <option value="<?php echo "$sName $name" ?>" >
                <?php
            }
        }
        ?>
</datalist>
<input type="button" value="Weergeven" onclick="showTutor();">

Мой даталист заполнен и работает отлично. Сейчас: при вызове showTutor, то есть при нажатии кнопки:

function showTutor(){
   var tut = document.getElementById("tutorToShow").value;
}

Это дает мне что-то вроде Джона Смита или Мэри Джейн Доу.

В чем проблема, когда я перезагружаю показанный div репетитора с помощью ajax, мне нужно получить идентификатор этого репетитора из базы данных.

Итак, что мне обязательно понадобится, так это этот SQL:

SELECT ID
FROM tutors
WHERE name LIKE '$name%'
AND surname LIKE '$surname%'

Теперь мне просто нужно отделить имя.

Другими словами, как мне получить идентификатор из таблицы с идентификатором столбцов, именем, фамилией, не зная разделения между именем и фамилией?

Джон Смит: легко, первое слово имя, второе слово фамилия

Мэри Джейн Тесто: что теперь?

Я думал добавить запятую, которая разделяет оба имени, но это не очень стильно.

Другой вариант — добавить в мою базу данных столбец с обоими именами в одной записи, но это хлопотно, когда нужно добавить новых наставников.


person Community    schedule 19.03.2015    source источник
comment
Добавьте идентификатор записи в качестве свойства «data-id=xx» в ‹option›, а затем отправьте его с помощью javascript, чтобы напрямую получить строку.   -  person Oli    schedule 19.03.2015
comment
Что же происходит, когда пользователь вводит текст, а не выбирает его из раскрывающегося списка? Что делать, если полное имя скопировано откуда-то?   -  person    schedule 19.03.2015
comment
Если я правильно понимаю, введенное или скопированное имя может соответствовать только записям, определенным в вашем списке данных. Таким образом, вы сможете найти идентификатор, который был добавлен в соответствующую запись списка данных. Я протестировал элемент datalist на developer.mozilla.org/en/ документы/Интернет/HTML/Элемент/список данных   -  person Oli    schedule 19.03.2015
comment
Хорошо, но тогда мне нужно проверить, содержит ли мой список данных параметр, который был введен или скопирован пользователем? Если нет, его можно отправить только после нажатия всплывающей опции, иначе ID не будет.   -  person    schedule 19.03.2015
comment
Да, похоже... проблема в том, что пользователь должен щелкнуть эту опцию?   -  person Oli    schedule 19.03.2015
comment
Я полагаю, чем меньше кликов, тем лучше. Я хотел бы иметь возможность щелкнуть «Отправить», если введенное значение было таким же, как и то, которое появилось.   -  person    schedule 19.03.2015
comment
Давайте продолжим обсуждение в чате.   -  person Oli    schedule 19.03.2015
comment
Вопрос решен в чате - ответ опубликую позже   -  person    schedule 19.03.2015


Ответы (2)


Сделайте это, прежде чем назначать данные своим элементам.

if (strpos($sName, ' ') != false) {
    // if above string position of space isn't false,
    // explode the string at the space into an array of
    // individual names.
    $sName = explode(' ', $sName);
    echo $sNames[0];
    echo $sNames[1];
    // you will need to look at foreach loop and counting the array length
}

Попробуй это.

<datalist id="tutorData">
<?php
$sql = "SELECT name, surname FROM tutors ORDER BY surname ASC";
if (!$res = $link->query($sql)) {
    trigger_error('error in query ' . $link->error);
} else {
    while ($row = $res->fetch_assoc()) {
        $surname = $row['surname'];
        $first_names = $row['name'];
        if (strpos($first_names, ' ') != false) {
            /*
               if above string position of space isn't false,
               explode the string at the space into an array of
               individual names.
            */
            $first_name = explode(' ', $first_names); // EG: Paul John
            $name1 = $first_name[0]; // Paul
            $name2 = $first_name[1]; // John
            /* 
               you will need to look at foreach loop and counting
               the array length  
            */
    }

    ?>
    <option value="<?php echo $name1 . ' ' . $name2 . ' ' . $surname" ?>" >
    <?php
    }
}
?>
</datalist>
person Chris    schedule 19.03.2015
comment
Я не уверен, как я должен применить это на практике, вы разделяете фамилию на массив, тогда что? Мне нужно будет сделать то же самое для другого имени? - person ; 19.03.2015
comment
это проверяет вашу переменную $sName на наличие пробела, который является именем из базы данных. Я предполагаю, что это имена, например: Роберт Пол или Элисон Дайан и отдельное поле для фамилий. Разрыв разбивает строку на и массив по пробелам (пробелы не добавляются в массив). - person Chris; 19.03.2015
comment
А что, если мои фамилии тоже состоят из нескольких пробелов? - person ; 19.03.2015
comment
Просто используйте тот же код, но измените разделяемые переменные. - person Chris; 19.03.2015
comment
Я никогда не использовал это раньше, извините, если задаю глупые вопросы: $sNames теперь сам по себе массив? $sNames[0] = alison,` $sNames[1] = diane?`, поэтому мне нужно было бы добавить эти массивы имен в один большой массив, а потом что? не понимаю, как мне это помогает.. - person ; 19.03.2015
comment
Глядя на ваш код выше. $row — это массив, $name — это значение $row['surname'], которое должно быть строкой из одного слова. Поэтому, когда вы делаете взрыв, он не должен взрываться на пробелах, поскольку их нет. Делая это с переменной $sName (да, я думаю, что вы их перевернули), как сейчас, что у одного может быть или не быть более одного имени, следовательно, если часть кода, ЕСЛИ в нем есть пробелы, выполняется внутри, если не просто использовать переменную (именно поэтому я назвал их одинаковыми, поэтому один перезапишет другой, если он будет выполнен. - person Chris; 19.03.2015

Прошу прощения за задержку, @Oli помог мне в чате несколько недель назад.

<input list="tutorData" name="tutors" id="tutorToShow">
<datalist id="tutorData">
    <?php
    $sql = "SELECT name, surname, id FROM tutors ORDER BY surname ASC";
    if (!$res = $link->query($sql)) {
        trigger_error('error in query ' . $link->error);
    } else {
        while ($row = $res->fetch_assoc()) {
            $name = $row['surname'];
            $sName = $row['name'];
            $id = $row['id'];
            ?>

            <option value="<?php echo "$sName $name" ?>" data-id="<?php echo $id; ?>">
                <?php
            }
        }
        ?>
</datalist>
<input type="button" value="Show" onclick="showTutor();">

Итак, в основном я добавил только идентификатор данных, затем я написал этот javascript:

<script>
    function showTutor() {
        var tut = document.getElementById("tutorToShow").value;
        var list = document.getElementById("tutorData");
        var length = list.options.length;
        var id;
        for (var i = 0; i < length; i++) {
            var eachTutor = list.options[i].value.toLowerCase();
            if (tut === eachTutor) {
                id = list.options[i].getAttribute('data-id');
            }
        }
    }
</script>

Теперь у меня есть идентификатор репетитора без разделения имени. Я также публикую его на php-странице с ajax, но это не имеет отношения к вопросу.

Еще раз спасибо тем, кто помог.

person Community    schedule 02.04.2015