Использование explode, split или preg_split для хранения и получения нескольких записей базы данных - PullRequest
0 голосов
/ 25 марта 2011

Я пытаюсь выяснить, как и что лучше всего хранить и получать несколько записей в базу данных и из нее.Либо используя explode , split , либо preg_split .Мне нужно, чтобы пользователь использовал текстовое поле в форме для отправки нескольких сообщений разным пользователям или для обмена данными с несколькими пользователями, введя их идентификаторы, такие как «101,102,103» и код PHP, чтобы быть достаточно умным, чтобы захватить каждый идентификатор свыбирая их каждый после ",".Я знаю, что это требует много, но мне нужна помощь от людей, более опытных в этой области.Мне нужно знать, как сделать PHP-код захватывать идентификаторы и уметь использовать функции с ними.Как захват «101,102,103» из ячейки базы данных и захват различной хранимой информации в базе данных с использованием идентификаторов, извлеченных из этой одной строки.

Как мне этого добиться?Пример будет очень полезным.

Спасибо

Ответы [ 3 ]

1 голос
/ 25 марта 2011

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

Я предполагаю, что вы хотите выполнить запрос SELECT, чтобы получить пользователей, чьи идентификаторы были введены, верно? Вы хотите использовать оператор типа SELECT ... WHERE IN ..., например:

// Get the ids the user submitted
$ids = $_POST['ids'];
// perform some sanitizing of $ids here to make sure 
// you're not vulnerable to an SQL injection
$sql = "SELECT * FROM users WHERE ID IN ($ids)";
// execute your SQL statement

В качестве альтернативы, вы можете использовать explode для создания массива каждого отдельного идентификатора, а затем выполнить цикл, чтобы можно было проверить некоторые значения, чтобы убедиться в их правильности, прежде чем использовать implode, чтобы объединить их обратно в строка, которую вы можете использовать в своем выражении SELECT ... WHERE IN ....

Редактировать: Извините, забыл добавить: с точки зрения сохранения списка идентификаторов пользователей в базе данных, вы можете рассмотреть возможность хранения списка с разделителями-запятыми в виде строки с идентификатором сообщения, но это имеет недостатки (сложно сделать JOINS на других столах, если нужно). В качестве альтернативы, лучшим вариантом будет создание таблицы типов поиска, которая в основном состоит из двух столбцов: messageid, userid. Затем вы можете сохранить каждого индивидуума userid против messageid, например

messageid | userid
1 | 1
1 | 3
1 | 5

Преимущество этого подхода заключается в том, что вы можете использовать эту таблицу для объединения других таблиц (возможно, у вас есть отдельная таблица message, в которой хранятся сведения о самом сообщении).

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

Надеюсь, что это имеет смысл!

0 голосов
/ 25 марта 2011

Я думаю, что ваша проблема больше связана с SQL, чем с PHP.

Технически вы можете хранить идентификаторы в одном поле MySQL, в поле 'set' и запрашивать его, используя IN или FIND_IN_SET в ваших условиях.Поиски на самом деле очень быстрые, но это не считается наилучшей практикой и создает ненормализованную базу данных.

Что является практикой гнезд и нормализовано, так это создание отдельных таблиц отношений.Таким образом, используя ваш пример сообщений, вы, вероятно, имели бы таблицу 'users', таблицу 'messages' и таблицу 'users_messages' для связи сообщений между пользователями.Таблица 'messages' будет содержать информацию о сообщении и, возможно, поле 'user_id' для исходного отправителя (поскольку он может быть только один), а таблица 'users_messages' будет просто содержать поля 'user_id' и 'message_id', содержащиестроки, связывающие сообщения с различными пользователями, которым они принадлежат.Тогда вам просто нужно использовать запросы JOIN для извлечения данных, поэтому, если вы извлекаете входящие сообщения пользователя, запрос будет выглядеть примерно так:

SELECT
    messages.*
FROM
    messages
    LEFT JOIN users_messages ON users_messages.message_id = messages.message_id
WHERE
    users_messages.user_id = '(some user id)'
0 голосов
/ 25 марта 2011

Ну, учитывая три предложенные вами функции:

  • explode() будет работать нормально, если у вас есть простой шаблон , который всегда одинаков.
    • Например, всегда ', ', но никогда ','
  • split() использует регулярное выражение POSIX - которое устарело - и больше не должно использоваться .
  • preg_split() использует регулярное выражение в качестве шаблона ; и, таким образом, примет больше ситуаций, чем explode().


Затем: не храните несколько значений в одном столбце базы данных : с этим невозможно будет выполнить какую-либо полезную работу!

Создайте другую таблицу для хранения этих данных, с одним значением на строку - с несколькими строками, соответствующими одной строке в первой таблице.

...