Я ссылаюсь на вопрос здесь: Могу ли я объединить несколько строк MySQL в одно поле?
В этом вопросе несколько строк столбца перечислены и разделены ",", используя функцию GROUP_CONCAT
. Я хочу добиться чего-то наоборот, объединив несколько пользовательских входов в одну запись базы данных. Что-то вроде этого:
<form action="server.php" method="POST">
<div>
<input type="text" name="value1">
<input type="text" name="value2">
<input type="text" name="value3">
<button type="submit" name="submit">submit</button>
</div>
</form>
и php:
<?php
if (isset($_POST['submit'])) {
$value1 = mysqli_real_escape_string($conn, $_POST['value1']);
$value2 = mysqli_real_escape_string($conn, $_POST['value2']);
$value3 = mysqli_real_escape_string($conn, $_POST['value3']);
$sql = "INSERT INTO database (col1)
VALUES GROUP_CONCAT('$value1', '$value2', '$value3');";
mysqli_query($conn, $sql);
header("Location: ../web_page/client_database_page.php?add_client=success");
}
?>
Я знаю, что некоторые из вас скажут, что это не будет хорошей практикой, и я должен иметь отдельный столбец для каждого входа пользователя, однако есть причина не делать этого таким образом. Входы пользователя добавляются на основе количества переменных из другой базы данных. В этой базе данных пользователь может вставлять дополнительные пользовательские входы с веб-сайта, но он не будет автоматически добавлять столбец во входную базу данных. Таким образом, одна строка столбцов должна содержать все пользовательские входы и позже разделяться для интерпретации при вызове из базы данных.
У кого-нибудь есть идеи?
Как насчет группировки ваших входных значений в виде массива, а затем использования функции implode()
в PHP перед вставкой в БД, например:
<form action="server.php" method="POST">
<div>
<input type="text" name="values[]">
<input type="text" name="values[]">
<input type="text" name="values[]">
<button type="submit" name="submit">submit</button>
</div>
</form>
Затем в PHP:
if (isset($_POST['submit'])) {
$values = $_POST['values'];
$escaped_values = array_map([$conn, 'mysqli_real_escape_string'], $values);
$concat_values = implode(",", $escaped_values);
$sql = "INSERT INTO database (col1) VALUES ('$concat_values');";
mysqli_query($conn, $sql);
header("Location: ../web_page/client_database_page.php?add_client=success");
}
Здесь я использовал запятую ,
как разделитель для каждого значения. Просто измените его по своему усмотрению.
РЕДАКТИРОВАТЬ:
Другим решением было бы использовать JSON для этого, чтобы вы могли легко получить доступ к данным при их извлечении. В зависимости от вашей версии MySQL вы можете использовать тип данных JSON для столбца/поля col1
.
ALTER TABLE 'table_name' CHANGE COLUMN 'col1' 'col1' JSON;
Затем измените код на:
$json = json_encode($_POST['values']);
$sql = "INSERT INTO database (col1) VALUES ('$json');";
А потом, когда вы извлекаете данные, вы можете сделать что-то вроде:
$values = json_decode($row['col1'], true);
Затем вы можете перебирать несколько тегов <input>
со значениями, взятыми из db.
Вы можете просто вводить значения с помощью PHP. Для этого не нужно использовать GROUP_CONCAT
. Попробуйте код, как показано ниже:
$sql = "INSERT INTO database (col1) VALUES ('$value1 $value2 $value3');";
Примечание: Значения могут быть разделены запятой ,
или любой другой разделитель вместо пространства.
name="value"
, а пользовательский ввод 2 name="value"
и т. Д. Количество входов зависит от того, сколько записей содержится в справочной базе данных и систематически добавляются на страницу в виде копий. Все с таким образом имеют одну переменную, например, $value
для нескольких пользовательских вводов.