【问题标题】:PHP/MYSQL: Only able to insert values into first rowPHP/MYSQL:只能将值插入第一行
【发布时间】:2010-12-03 06:01:22
【问题描述】:

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

/*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";

【问题讨论】:

  • 您是否在 $sql2 变量中分配了第二个查询并检查表中的主键?
  • 你有自动增量ID吗?
  • 小心上述代码中的SQL注入。
  • 感谢您的警告。我知道这个概念并且不关心防止这个项目的 sql 注入,因为我知道它会保持在本地。

标签: php mysql insert row


【解决方案1】:

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

【讨论】:

  • 当我将第二个查询定义为 $sql2 时,它解决了问题,但是“主键重复”是指在两个 INSERT 语句中使用测试(MadWords)吗?这是要避免的事情吗?我想知道,尽管现在有这种重复,但代码仍然有效。
【解决方案2】:

您从未声明过您的 $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);
}

【讨论】:

  • 谢谢。那解决了它。从风格上讲,每次插入后都包含这个 if 语句对我来说并不是那么吸引人。有没有更简洁的方法来达到同样的目的?
  • 您可以使用 $_POST 数组进行 for 循环。编辑:为您的问题在我的原始帖子中添加了一些示例代码。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:
      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)
      

      似乎还可以。

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

      如果每个 MadLibs 故事都有一个表格,则每个单词都应该有一个列。这样一来,整个提交就是一行。应该有一个 ID 列来标识该行;那么您可以仅依靠该 ID 使用 select * from test where id = 12345; 或其他方式获取整个提交的所有数据。

      【讨论】:

      • 我认识你吗?
      • 如果可以的话,我会投票赞成。我很确定我能在星期六之前拥有一个 madlibs 应用程序。
      • 这不太可能,因为我没有物理形态。
      • 哦,不要使用 CamelCase 表名; SQL 不区分大小写。
      猜你喜欢
      • 1970-01-01
      • 2015-05-10
      • 2021-09-07
      • 2013-07-27
      • 2021-05-02
      • 2014-01-19
      • 2019-01-24
      • 2014-07-20
      • 1970-01-01
      相关资源
      最近更新 更多