Я работаю над существующей HTML-формой, используемой для сбора данных о проекте, а затем вставляю эту запись проекта в базу данных MySQL с помощью PHP.
Внутри формы есть поле ввода с именем «staff []». Это поле является элементом множественного выбора, который позволяет пользователям выбирать более одного члена команды для управления проектом.
<form action="" method="post">
<select multiple name="staff[]">
<option value="1">Mary</option>
<option value="2">Tyrone</option>
<option value="3">Rod</option>
<option value="4">Marcus</option>
<option value="5">David</option>
</select>
</form>
Например, пользователь выбирает Тайрона, Рода и Дэвида для этого конкретного проекта. Если мы вставим запись в этот момент, в базе данных будет храниться только первое значение записи, которое будет идентификатором Тайрона, равным 2. Общая практика — хранить каждый экземпляр в отдельной таблице, однако это не наша система и из-за ограничения 4 члена для каждого проекта, руководство предпочло бы для удобства вставить массив с запятыми в столбец персонала каждого проекта.
Чтобы решить эту проблему, мы создали цикл foreach, который перебирает выбранные значения из выпадающего меню, в то же время гарантируя отсутствие запятой:
// Add array into one variable
$staff_count = count($_POST['project_staff']);
$i = 0;
foreach($_POST['project_staff'] as $staff) {
if (++$i === $staff_count) {
$member_variable .= $staff;
} else {
$member_variable .= $staff . ", ";
}
}
После нажатия кнопки отправки запускается вышеприведенный скрипт (который выдает значение массива (2, 3, 5)), и запись без проблем добавляется в таблицу проектов.
ЗДЕСЬ ПРОБЛЕМА.
Наконец, у нас есть страница просмотра, где мы будем вызывать всех сотрудников, назначенных проекту, на основе параметра запроса, который будет идентификатором проекта. Например, если предыдущий идентификатор проекта был 6, будет использоваться следующий URL:
site.com/project/view/?project=6
На этой странице я могу сохранить список сотрудников, используя следующие переменные назначения:
$project = "SELECT * FROM projects WHERE project = 6";
$employee_chosen = $project['project_employee']
Если в столбце «персонал» принят только один сотрудник (например, только одно значение 4), переменная будет иметь значение одного числа:
$project['project_employee'] (4)
Затем я смог бы выполнить дополнительный запрос для сотрудников как таковой:
$employee_chosen = $project['project_employee']; (4)
query2 = "SELECT * FROM employees WHERE employee_ID = $employee_chosen";
Это очень легко вернуло бы одного сотрудника, который был введен в колонку «персонал». Однако мы имеем дело с массивом в этом значении столбца (2, 3, 5), и поэтому я запросил следующее утверждение:
$employee_list = $project['project_staff']; (2,3,5)
$query_employees = "SELECT * FROM employees WHERE employee_id IN ($employee_list)";
Когда я выполняю этот запрос, я получаю только первый результат от идентификатора сотрудника 2 (как первоначально указано в форме HTML).
Однако, если я использую phpMyAdmin, чтобы напрямую ввести три числа в виде строки:
$query_employees = "SELECT * FROM employees WHERE employee_id IN (2,3,5)";
Я получаю все три записи сотрудников.
Просто чтобы убедиться, что столбец ARRAY действительно ведет себя как STRING, я инициировал var_dump для значения:
echo var_dump($project['project_staff']);
После чего я получил следующую информацию:
string(7) "4, 5, 6"
У кого-нибудь есть какие-либо идеи?
Меня устраивает идея, что я могу запросить значение, так как раньше я получил несколько ошибок, не связанных с объектами и массивами.
Заранее благодарим за любую помощь, которую вы можете оказать.
Я почти уверен, что вы говорите, что храните строку $employee_list
это может быть «2,3,4». Тогда ваш IN ($employee_list)
действительно IN ('2,3,4')
но то, что вы действительно хотите, это IN (2,3,4)
, Есть разные способы добраться туда, но вы могли бы сделать
$employee_list = implode(','(explode(',', $employee_list));
Других решений пока нет …