PHP/MYSQL:只能在第一行中插入值

PHP/MYSQL:只能在第一行中插入值,php,mysql,insert,row,Php,Mysql,Insert,Row,我想知道这是否需要一个数组和/或循环,以及有什么解决方案可以解决这个问题。 作为学习练习,我尝试将五个变量中的两个插入到SQL中的两个连续行中。 我在SQL中设置了一个简单的表,其中有一列名为test。我的第一个“插入表值('$Word1')”;语句成功地将值插入第一行。与$Word2类似/几乎相同的后续代码不会向SQL添加值。我在想象我必须以某种方式前进到下一排,但我完全不知道如何做到这一点。我搜遍了论坛、我的PHP书和学校,但都是徒劳 /*retrieve user input from s

我想知道这是否需要一个数组和/或循环,以及有什么解决方案可以解决这个问题。 作为学习练习,我尝试将五个变量中的两个插入到SQL中的两个连续行中。 我在SQL中设置了一个简单的表,其中有一列名为test。我的第一个“插入表值('$Word1')”;语句成功地将值插入第一行。与$Word2类似/几乎相同的后续代码不会向SQL添加值。我在想象我必须以某种方式前进到下一排,但我完全不知道如何做到这一点。我搜遍了论坛、我的PHP书和学校,但都是徒劳

/*retrieve user input from separate HTML input form */
/* and initializes variables */  
$Word1 = $_POST["Word1"];
$Word2 = $_POST["Word2"];
$Word3 = $_POST["Word3"];
$Word4 = $_POST["Word4"];
$Word5 = $_POST["Word5"];

//select db
mysql_select_db("madlibs", $con);  

//insert user input for word 1 into SQL
$sql = "INSERT INTO test (MadWords)
VALUES
('$Word1')";
if (!mysql_query($sql,$con))
{
  die('Error: ' . mysql_error());
}

//word 2      
/* ***THIS CODE AND MANY VARIATIONS OF IT FAIL TO ENTER $WORD2 INTO SQL*/
"INSERT INTO test (MadWords)
VALUES
('$Word2')";

if (!mysql_query($sql2,$con))    
  /*I've cut this if statement in other debugging runs with the same result*/
{
  die('Error: ' . mysql_error());
}  

echo "1 record added";

可能是主键的重复导致无法在表中插入第二个值。

您的问题在于主键
如果您创建一个列作为id,它是primery key,则此查询工作正常

假设您在两次迭代中使用相同的查询,则第二次查询失败的最可能原因是
MadWords
字段是您的主键,否则不允许重复

  • Word1和Word2字段的值是否相同
  • 在MySQL中运行
    EXPLAIN test
    时会得到什么

您从未声明过$sql2变量。它正在执行一个空查询,而不是您希望它执行的查询

//word 2      
/* ***THIS CODE AND MANY VARIATIONS OF IT FAIL TO ENTER $WORD2 INTO SQL*/
$sql2 = "INSERT INTO test (MadWords)
VALUES
('$Word2')";

if (!mysql_query($sql2,$con))    
  /*I've cut this if statement in other debugging runs with the same result*/
{
  die('Error: ' . mysql_error());
} 
这应该是修复方法,除非有你没有发布的相关代码

要回答您的评论,您可以执行以下操作:

foreach ($_POST as $value) {
  $sql = "Insert into test (madwords) values('$value')";
  mysql_query($sql,$con);
}
看起来不错

您的输入可能会出错。在提供的示例中,您实际上没有设置$sql2变量。通过命令行或PHPMyAdmin,尝试直接在数据库上使用查询,而不涉及PHP。如果您的数据库遇到问题,并且不确定它是在应用程序层还是数据库层,请逐字打印所有数据库查询。也就是说,不要使用mysql\u查询,而是回显您要运行的查询。它看起来像你期望的那样吗?试着自己运行数据库中的查询


如果每个MadLibs故事都有一个表,那么每个单词都应该有一列。这样,整个提交就是一行。应该有一个ID列来标识该行;然后,您可以仅依靠该ID,通过
select*fromtest(ID=12345)获取整个提交的所有数据或其他。

是否在$sql2变量中分配了第二个查询,并检查了表中的主键?是否有自动增量id?请注意上述代码中的SQL注入。谢谢您的警告。我知道这个概念,也不关心如何阻止这个项目的sql注入,因为我知道它仍然是本地的。当我将第二个查询定义为$sql2时,它解决了这个问题,但是“主键的复制”是指在两个INSERT语句中使用test(MadWords)吗?这是应该避免的吗?我想知道的是,尽管现在重复了,代码仍然可以工作。谢谢。这就解决了问题。在风格上,每次插入后都包含这个if语句对我来说不是很有吸引力。有没有更干净的方法来达到相同的目的?您可以使用$\u POST数组进行for循环。编辑:为你的问题在我的原始帖子中添加了一些示例代码。我在什么地方认识你吗?如果可以的话,我会投赞成票。我很确定我能在周六之前拥有一个madlibs应用程序。这是最不可能的,因为我没有物理形式。哦,不要使用CamelCase表名;SQL不区分大小写。
mysql> create database madlibs;
Query OK, 1 row affected (0.03 sec)

mysql> use madlibs;
Database changed

mysql> create table test(MadWords varchar(200));
Query OK, 0 rows affected (0.01 sec)        

mysql> select * from test;
Empty set (0.00 sec)

mysql> insert into test(MadWords) values ('foo');
Query OK, 1 row affected (0.00 sec)

mysql> select * from test;
+----------+
| MadWords |
+----------+
| foo      |   
+----------+
1 row in set (0.00 sec)

mysql> insert into test(MadWords) values ('bar');
Query OK, 1 row affected (0.00 sec)

mysql> select * from test;
+----------+
| MadWords |
+----------+
| foo      |   
| bar      |   
+----------+
2 rows in set (0.00 sec)