使用MySQLi Prepared Statement将动态多行输入数据库?

时间:2012-03-30 09:37:26

标签: php mysql database mysqli prepared-statement

我创建了一个HTML表单,用户可以在其中提交姓名,电子邮件和语言技能。由于用户可能会说多种语言,因此用户可以通过单击“添加”按钮生成其他行。

然后提交表格并输入MySQL数据库。我使用两个表来保存接收的数据,而第一个表中的user-id将是auto_incremented:

| (user-id) | name | email|
| user-id | language | proficiency|

现在我正在尝试编写PHP代码,它看起来像这样:

$name = $_POST['name'];
$email = $_POST['email'];

$add_table1 = $mysqli->prepare("INSERT INTO table1 (name, email) VALUES (?, ?)");
$add_table2 = $mysqli->prepare("INSERT INTO table2 (user_id, language, proficiency) VALUES (?, ?, ?)");

$add_table1->bind_param("ss", $name, $email);
$add_table1->execute();
$user-id = $mysqli->insert_id;

foreach($_POST['language'] as $index => $language) {
    $index = intval($index);
    $language = mysql_real_escape_string($language);
    $proficiency = mysql_real_escape_string($_POST['proficiency'][$index]);
    $add_table2->bind_param("iss", $user-id, $language, $proficiency);
    $add_table2->execute();
}
$add_table1->close();
$add_table2->close();
$mysqli->close();

表格应如下所示

| 1 | Mark | mark@me.com |
| 2 | Sue  | sue@me.net |

|1 | English | perfect |
|1 | Spanish | awesome |
|2 | English | great |
|2 | French | ok |
|2 | Korean | fluent |

然而,我的代码表1看起来很好,但表2看起来像这样

| 1 |  |  |
| 2 |  |  |

有人可以帮忙吗?谢谢!

2 个答案:

答案 0 :(得分:2)

我应该指出的一点是,你没有使用mysql_real_escape_string准备好的陈述。

另一件事是$user-id不是有效的变量名。你不能使用连字符。

修改

打开错误报告并在任何失败时输出mysqli / mysqli_stmt::$error是一件好事。大多数问题都可以用这些解决。

答案 1 :(得分:1)

你的php mysqli代码看起来很不错。您确定要正确检索POST值吗?在执行查询之前,在foreach循环中打印$ language和$熟练