2012-03-30 92 views
-3

我已经创建了一个HTML表单,用户可以在其中提交姓名,电子邮件和语言技能。由于用户可以说多种语言,用户可以通过点击“添加”按钮来生成额外的行。使用MySQLi Prepared Statement将多行数据输入数据库?

然后表单将被提交并输入到MySQL数据库中。我用两个表来保存接收到的数据,而用户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 | [email protected] | 
| 2 | Sue | [email protected] | 

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

然而,我的码表1看起来不错,但表2是这样的

| 1 | | | 
| 2 | | | 

有人可以帮忙吗?谢谢!

+1

为什么在这里使用mysql_real_escape_string? – 2012-03-30 09:39:48

+1

投票结束不是一个真正的问题。要求人们寻求帮助,因为语法错误导致的代码无法工作,这绝对没有意义。 – 2012-03-30 09:43:34

回答

2

我需要指出的一件事是,您不要将mysql_real_escape_string与准备好的语句一起使用。

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

编辑:

它打开错误报告和输出时出现任何故障,mysqli/mysqli_stmt::$error一件好事。大多数问题都可以通过这些解决。

+0

-1究竟是什么? – MichaelRushton 2012-03-30 09:44:55

+0

你认为问题在于mysql_real_escape_string吗?我会拿出来看看它是否有效。是的,$ user-id实际上只是$ userid;我在那里放了一个破折号(这很愚蠢:() – nubicurio 2012-03-30 09:45:16

+1

@nubicurio所以downvote是因为你发布了一个无效名称的变量,你“澄清”而不会这么说,因为你被建议不要使用mysql_real_escape_string MySQLi与准备好的语句结合在一起吗?您实际上对此答案有了一个很好的建议,我建议您听一下。 – 2012-03-30 09:48:28

1

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

+0

我会看看我能想出什么... – nubicurio 2012-03-30 09:53:58