如何改进PHP代码以将数据插入MySQL?
我是PHP的初学者,想知道我的函数是否写得很好 我正在创建一个测验应用程序,并具有以下表格:用户、课程、测验(存储教授id、课程id和测验名称的位置)、问题、测验问题、答案。请注意,一个问题可以有多个正确答案 所以,我写了一个脚本,接收测验的名称、创建测验的教授的用户名、课程、问题、问题的要点、答案以及答案是否正确等参数 我的问题是我是否正确地实现了它,因为我不确定是否使用外键 首先,我必须从用户表中找到教授的id,然后从课程中找到课程的id,然后从测验中找到测验的id,然后检查表中是否已经存在该问题。根据上一次检查,如果它不存在,我将插入它以及它的答案,但是如果它已经存在,我将选择它的id并在特定表中插入答案如何改进PHP代码以将数据插入MySQL?,php,mysql,mysqli,Php,Mysql,Mysqli,我是PHP的初学者,想知道我的函数是否写得很好 我正在创建一个测验应用程序,并具有以下表格:用户、课程、测验(存储教授id、课程id和测验名称的位置)、问题、测验问题、答案。请注意,一个问题可以有多个正确答案 所以,我写了一个脚本,接收测验的名称、创建测验的教授的用户名、课程、问题、问题的要点、答案以及答案是否正确等参数 我的问题是我是否正确地实现了它,因为我不确定是否使用外键 首先,我必须从用户表中找到教授的id,然后从课程中找到课程的id,然后从测验中找到测验的id,然后检查表中是否已经存在
public function insert_question($quiz_name,$professor,$course,$question,$points,$answer,$is_correct)
{
$query = "select id from users where username ='$professor'";
$result = mysqli_query($this->connection, $query);
if(mysqli_num_rows($result)>0){
$row=mysqli_fetch_array($result);
$professor_id = $row['id'];
}else{
$json['error'] = 'professor not found';
}
$query = "select id from courses where course ='$course'";
$result = mysqli_query($this->connection, $query);
if(mysqli_num_rows($result)>0){
$row=mysqli_fetch_array($result);
$course_id = $row['id'];
}else{
$json['error'] = 'course not found';
}
$query = "select id from quizzes where professor_id ='$professor_id' and course_id = '$course_id'";
$result = mysqli_query($this->connection, $query);
if(mysqli_num_rows($result)>0){
$row=mysqli_fetch_array($result);
$quiz_id = $row['id'];
}else{
$json['error'] = 'quiz not found';
}
$query = "select id from questions where question ='$question'";
$result = mysqli_query($this->connection, $query);
if(mysqli_num_rows($result)>0){
//question already exists so we need to add its answers
$row=mysqli_fetch_array($result);
$question_id = $row['id'];
$query = "insert into answers (question_id, answer, isCorrect) values ('$question_id','$answer','$is_correct')";
$insertedA = mysqli_query($this -> connection, $query);
if($insertedA == 1 ){
$jsonA['success'] = 'answer added';
}
else{
$jsonA['error'] = 'answer couldn\'t be added';
}
}else if(mysqli_num_rows($result)==0){
//insert the actual question
$query = "insert into questions (question, points) values ('$question','$points')";
$insertedQ = mysqli_query($this -> connection, $query);
if($insertedQ == 1 ){
$jsonQ['success'] = 'question added';
$last_question_id = mysqli_insert_id($this -> connection); //id of the question i just inserted
echo $last_question_id;
}
else{
$jsonQ['error'] = 'question couldn\'t be added';
}
//insert into quizzes_questions
$query = "insert into quizzes_questions(quiz_id, question_id) values ('$quiz_id','$last_question_id')";
$insertedQQ = mysqli_query($this -> connection, $query);
if($insertedQQ == 1 ){
$jsonQQ['success'] = 'queestionQuizz added';
}
else{
$jsonQQ['error'] = 'questionQuizz couldn\'t be added';
}
$query = "insert into answers (question_id, answer, isCorrect) values ('$last_question_id','$answer','$is_correct')";
$insertedA = mysqli_query($this -> connection, $query);
if($insertedA == 1 ){
$jsonA['success'] = 'answer added';
}
else{
$jsonA['error'] = 'answer couldn\'t be added';
}
}else{
$json['error'] = 'something wrong';
}
echo json_encode($json);
echo json_encode($jsonA);
echo json_encode($jsonQ);
echo json_encode($jsonQQ);
mysqli_close($this->connection);
}
运行那些select STATAMENT查找ID,然后像那样使用它们,可以吗?有没有更简单的方法可以做到这一点,因为我可能有很多脚本,其中我必须找到教授的id,这意味着我必须在每个文件中复制粘贴此代码
另外,我已经阅读了关于准备好的语句,我是否应该对函数中的每个参数使用它们,因为它们都是用户输入的?首先,使用函数而不是多个if/else块 我将把
mysqli\u fetch\u array
调用放入一个单独的函数中,以及教授、课程和问题的单独方法中
此外,使用语句准备(优化和保护)查询:
您还可以查看当前的查询构建器(如条令)来使用它,或者仅仅从它的结构中得到启发:
看起来是这样的:
function fetch($query, $statements) {
$q = mysqli_prepare($this->connection, $query);
foreach($statements as $ statement) {
mysqli_stmt_bind_param($q, $statement);
}
$res = mysqli_stmt_execute($q);
return mysqli_num_rows($res) > 0 ? $res : null;
}
function getProfessor($professor) {
$res = $this->fetch("select id from users where username = ? LIMIT 1", array($username));
return $res ? mysqli_fetch_array($res)['id'] : null;
}
...
然后在主函数中,您可以测试professor是否为null
$professor = $this->getProfessor($profName);
if (!$professor) {
// errors
} else {
// succeed
}
记住,函数应该只满足一个目的,并且应该最小化if/else,更不用说嵌套的if了
这里有一篇有趣的文章解释了一些关于软件和web开发的指导原则:您可以从阅读有关使用的内容开始。