Добрый день. Новичок здесь. Хотелось бы попросить помощи, если это сработает? Я хочу избегать вставки одинаковых имен в справочные таблицы (студенты, лекции), а вместо этого просто вставить существующий идентификатор в таблицу соединений (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>
Мне удалось заставить его работать. Вот новые коды:
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.
Вы можете создать 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();
LAST_INSERT_ID()
. Как правило, это лучший способ получить значения автоинкрементных идентификаторов. Пожалуйста, прочитайте об этом. dev.mysql.com/doc/refman/5.7/en/...
<form>
action=""
/ PHP$_SERVER["PHP_SELF"]
. 2) Ваша форма небезопасна и уязвима для внедрения SQL. Пожалуйста, убедитесь, что вы используете подготовленные заявления, чтобы предотвратить это :)