Я хочу сохранить в базе данных 2 вида значений. Первый столбец - это «предмет», а второй - «учитель». Для одного предмета есть много разных имен учителей. Так, например, как я могу добавить «Джон», «Мэри», «Том», «Лена» к предмету «Математика»?
$pdo = new PDO('mysql:host=localhost;dbname=school', 'root', '');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$name=???
$subject = "Math";
$statement = $pdo->prepare("INSERT INTO teacher (name,subject) VALUES (:name,:subject)");
$statement->bindParam(':name',$name);
$statement->bindParam(':subject',$subject);
$statement->execute();
отдельно вставьте каждого учителя в паре с предметом, используйте можно использовать цикл, просто подготовьтесь один раз
не рекомендуется хранить несколько значений в одной строке для столбца. Здесь вы можете вставить несколько записей с темой и назначенным для нее одним именем. таким образом, если вы хотите получить все имена для объекта, вы можете легко получить его.
обратите внимание, что если вы собираетесь вставить тысячи строк, будет непрактично использовать цикл и выполнять каждую строку, вам лучше создать один подготовленный оператор (хотя это будет немного сложнее, чем то, что у тебя есть прямо сейчас)






Вам необходимо реализовать отношения «один ко многим». У одного предмета может быть много учителей, в то время как учитель может принадлежать ко многим предметам.
Таблица учителей может выглядеть так:
CREATE TABLE teachers (
id int NOT NULL AUTO_INCREMENT,
teacher varchar(255),
subject_id int
)
Пока тематическая таблица будет такой:
CREATE TABLE subjects (
id int NOT NULL AUTO_INCREMENT,
subject varchar(255),
)
Теперь, имея эти отношения, вы можете присоединиться к двум столам, чтобы получить то, что вам нужно.
SELECT * FROM subjects s LEFT JOIN teachers t on s.id = t.subject_id
Этот подход довольно стандартный и в некоторой степени нормализует вашу базу данных.
Я рекомендую вам почитать об отношениях, хотя статьи, которые я рекомендую, в основном относятся к google-d, я уверен, что вы можете найти некоторые более сложные:
https://code.tutsplus.com/articles/sql-for-beginners-part-3-database-relationships--net-8561
http://www.tech-recipes.com/rx/56738/one-to-one-one-to-many-table-relationships-in-sql-server/
Также читайте об атомарности базы данных - https://en.wikipedia.org/wiki/Atomicity_(database_systems)
Если $math - это массив с именами, вы можете вставить их вот так в свою базу данных с помощью foreach.
$pdo = new PDO('mysql:host=localhost;dbname=school', 'root', '');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql = "INSERT INTO teacher (name,subject) VALUES (?,?)";
try {
$stmt = $conn->prepare($sql);
foreach ($subject as $i => $subjects) {
$stmt->execute([$subjects, $math[$i]]);
}
} catch (\PDOException $e)
Нормализация диктует, что каждая строка должна быть именем (или идентификатором) учителя для одного предмета (или идентификатором предмета). Итак, если вы хотите, чтобы Джон преподавал 3 предмета, его нужно ввести в вашу таблицу 3 раза, а если у вас есть 3 учителя, которые преподают математику, все 3 учителя должны иметь отдельные строки.