我正在尝试将表单数据插入到我的sql表中。表格数据是一份长问卷,有多个问题。这意味着我插入的表有多列,确切地说是30。
有没有办法让我用最少或最有效的代码快速插入一行30列?也许我的表单中的“name”值可以等于my表中的变量名?我的表单是普通文本字段和一些复选框组的混合。
我正在使用php并希望使用mysqli预处理语句。
TLDR:我可以缩短这个吗?:
$query = "INSERT INTO table (a, b, c, d, e , f , g , h ,i j, ........)
VALUES (?,?,?,?,?,?,?,?,?,?,?,?,....)";
mysqli_stmt_bind_param($stmt,'sssiiisiiiiiiiiiisss...', ....);
或者我是否需要蛮力?
答案 0 :(得分:1)
Afaik不,你不能缩短它。
但您可以更改数据库模型,结果记录只包含一个与问题相关的答案以及答案来自的用户。因此,您在测验中有多少问题也是可变的。如果测验只有2个问题,那么你没有超大的28列。
table: user
-----------
id (PK)
username
table: quiz
-----------
id (PK)
title (FK)
table: question
---------------
id (PK)
question
quiz_idfk (FK)
table: answer
-------------
id (PK)
answer
question_id (FK)
user_id (FK)
使用该模型,结果的插入将是(仅伪代码):
foreach($_POST['answer'] as $qid => $ans) {
// sql: INSERT INTO answer SET answer = :ans, question_id = :qid, user_id = :uid
// :ans the answer text ($ans)
// :qid the question id ($qid)
// :uid the currently logged in user
}
答案 1 :(得分:1)
您可以尝试使用mysqli_stmt_bind_param
来调用call_user_func_array
并传入一系列参数:
$sql_link = mysqli_connect('localhost', 'my_user', 'my_password', 'world');
$type = "isssi";
$param = array("5", "File Description", "File Title", "Original Name", time());
$sql = "INSERT INTO file_detail (file_id, file_description, file_title, file_original_name, file_upload_date) VALUES (?, ?, ?, ?, ?)";
$sql_stmt = mysqli_prepare ($sql_link, $sql);
call_user_func_array('mysqli_stmt_bind_param', array_merge (array($sql_stmt, $type), $param);
mysqli_stmt_execute($sql_stmt);