Вставка на многие для многих настройки отношений

0

Добрый день. Новичок здесь. Хотелось бы попросить помощи, если это сработает? Я хочу избегать вставки одинаковых имен в справочные таблицы (студенты, лекции), а вместо этого просто вставить существующий идентификатор в таблицу соединений (student_lecture).

Вот php:

if($_SERVER['REQUEST_METHOD'] == 'POST'){
$student = $_POST['student'];
$lecture = $_POST['lecture'];

$addStudent = mysqli_query($con,"INSERT IGNORE INTO students (student) VALUES ('$student')");
$studentID = mysqli_insert_id($con);

$addLecture = mysqli_query($con,"INSERT IGNORE INTO lectures (lecture) VALUES ('$lecture')");
$lectureID = mysqli_insert_id($con);

$addClass = mysqli_query($con,"INSERT INTO student_lecture (student_id,lecture_id) VALUES ('$studentID','$lectureID')");

}

Вот html:

<html>
<title>Add Class</title>
<body>
<form name="Add Class" method="post" action="<?php echo 
htmlspecialchars($_SERVER["PHP_SELF"]);?>">
Student: <input type="text" name="student">
</br></br>
Lecture: <input type="text" name="lecture">
</br></br>
<input type="submit" value="Add Class">
</form>
</body>
</html>

student_lecture

ученики

лекции

  • 1
    Несколько замечаний: 1) Вы можете использовать разные кавычки для своего <form> action="" / PHP $_SERVER["PHP_SELF"] . 2) Ваша форма небезопасна и уязвима для внедрения SQL. Пожалуйста, убедитесь, что вы используете подготовленные заявления, чтобы предотвратить это :)
  • 0
    Вы можете избежать вставки дубликатов, используя уникальные ключи в столбцах и используя операторы INSERT ... ON DUPLICATE UPDATE. Также я повторяю комментарий @ObsidianAge об использовании готовых операторов.
Показать ещё 1 комментарий
Теги:
many-to-many
insert

2 ответа

0

Мне удалось заставить его работать. Вот новые коды:

if($_SERVER['REQUEST_METHOD'] == 'POST'){

    $student = $_POST['student'];   
    $lecture = $_POST['lecture'];

    /* first I have selected the entries from students and lectures table */
    $students = mysqli_query($con,"SELECT * FROM students WHERE student='$student'");
    $lectures = mysqli_query($con,"SELECT * FROM lectures WHERE lecture='$lecture'");

    /* then fetch every rows */
    $student_row = mysqli_fetch_array($students);
    $lecture_row = mysqli_fetch_array($lectures);

    /* here we check if student name exists */
    if($student == $student_row['student']) {
    /* if it exists then just update it */
    $updateStudent = mysqli_query($con,"UPDATE students SET student='$student' WHERE student='$student'");
    }else{
    /* if it doesn't exist then add as new entry */
    $addStudent = mysqli_query($con,"INSERT IGNORE INTO students (student) VALUES ('$student')");
    };

    /* here we check if student id exists */
    if($student == $student_row['student']) {
    /* if it exists then just use existing id */
    $studentID = $student_row['student_id'];
    }else{
    /* if it doesn't exist then use a new id */
    $studentID = mysqli_insert_id($con);
    };

    /* here we check if lecture title exists */
    if($lecture == $lecture_row['lecture']) {
    /* if it exists then just update it */
    $updateLecture = mysqli_query($con,"UPDATE lectures SET lecture='$lecture' WHERE lecture='$lecture'");
    }else{
    /* if it doesn't exist then add as new entry */
    $addLecture = mysqli_query($con,"INSERT IGNORE INTO lectures (lecture) VALUES ('$lecture')");
    };

    /* here we check if lecture id exists */
    if($lecture == $lecture_row['lecture']) {
    /* if it exists then just use existing id */
    $lectureID = $lecture_row['lecture_id'];
    }else{
    /* if it doesn't exist then use a new id */
    $lectureID = mysqli_insert_id($con);
    };

    /* then we execute on adding entries on junction table */
    $addClass = mysqli_query($con,"INSERT INTO student_lecture (student_id,lecture_id) VALUES ('$studentID','$lectureID')");

}

Спасибо за весь ответ. Мне удалось получить некоторые идеи. Специально для @MadddinTribleD. Хорошо быть здесь на StackOverFlow.

0

Вы можете создать sql-функцию, которая вставляет вам:

DELIMITER $$
CREATE FUNCTION INSERT_SUDENT_LECTURE(student_title TEXT, lecture_name TEXT)
BEGIN
  SET @m_student_id = -1;
  SET @m_lecture_id = -1;

  /* get student id if exist */
  SELECT s.student_id
    INTO @m_student_id
    FROM student s
   WHERE s.student = student_title;

  /* if not insert */
  IF @m_student_id < 0 THEN
    INSERT IGNORE INTO students (student) VALUES (student_title);

    SELECT LAST_INSERT_ID()
    INTO @m_student_id;
  END IF;

  /* get lecture id if exist */
  SELECT l.lecture_id
    INTO @m_lecture_id
    FROM lecture l
   WHERE l.lecture = lecture_name;

  /* if not insert */
  IF @m_lecture_id < 0 THEN
    INSERT IGNORE INTO lectures (lecture) VALUES (lecture_name);

    SELECT LAST_INSERT_ID()
    INTO @m_lecture_id;
  END IF;

  /* check if all went ok */
  IF @m_lecture_id > 0 && @m_student_id > 0 THEN
    /* insert new values in student_lecture */
    INSERT INTO student_lecture (student_id,lecture_id) VALUES (@m_student_id,@m_lecture_id)
  END IF;
END $$
DELIMITER ;

А затем вызовите функцию что-то вроде этого:

mysqli_query($con, "INSERT_SUDENT_LECTURE ('$studentID','$lectureID');");

И вы действительно должны думать об использовании подготовленных заявлений, как упоминалось @ObsidianAge.
Вот, например, вызов с подготовленным выражением:

$SQL_CONN = mysqli ("host",
                    "user",
                    "password",
                    "dbname",
                    "port");

$stm = $SQL_CONN->prepare("INSERT_SUDENT_LECTURE (?,?);");
$stm->bind_param ("ss", $studentID, $lectureID);

$sqlStm->execute();

$stm->free_result();
$stm->close();
  • 0
    Спасибо за ответ @MadddinTribleD. Я бы определенно попробовал эти методы, которые вы упомянули. Я рассмотрю использование подготовленных заявлений, как упомянуто ObsidiaAge. Поскольку это ново для меня, я отнесусь к этому слегка. Еще раз спасибо.
  • 0
    Ключевой частью этого предложения является LAST_INSERT_ID() . Как правило, это лучший способ получить значения автоинкрементных идентификаторов. Пожалуйста, прочитайте об этом. dev.mysql.com/doc/refman/5.7/en/...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню