【问题标题】:Run MySQL INSERT Query multiple times (insert values into multiple tables)多次运行 MySQL INSERT Query(将值插入多个表)
【发布时间】:2011-01-27 19:03:01
【问题描述】:

基本上,我有 3 张桌子;用户和项目,然后我有'users_projects'来允许一对多的形成。当用户添加项目时,我需要存储项目信息,然后将“userid”和“projectid”存储在 usersprojects 表中。听起来很直接,但我认为语法有问题!?

就目前而言,我将其作为我的 INSERT 查询(值进入 2 个不同的表):

$projectid = $_POST['projectid'];
    $pname = $_POST['pname'];
    $pdeadline = $_POST['pdeadline'];
    $pdetails = $_POST['pdetails'];

    $userid = $_POST['userid'];

$sql = "INSERT INTO projects (projectid, pname, pdeadline, pdetails) VALUES
   ('{$projectid}','{$pname}','{$pdeadline}','{$pdetails}')";


$sql =  "INSERT INTO users_projects (userid, projectid) VALUES
   ('{$userid}','{$projectid}')";

$result = mysql_query($sql, $connection)
    or die("MySQL Error: ".mysql_error());
header("Location: frontview.php");
exit();

【问题讨论】:

  • 查询本身(除了 SQL 注入问题)似乎没问题。查看更多源代码以了解查询的执行方式可能会有所帮助。
  • 我已根据要求更新了这个问题,提供了更多信息!
  • 项目 ID 是否正确进入项目表?它不会在两个查询之间发生变化,因此您可能需要检查 usersprojects 表并确保您使用正确的类型定义了第二列。
  • 是的项目 ID 正确进入项目表(作为主键)。在 usersprojects 表中,用户 ID 和项目 ID 都设置为 INT 类型(我使用的是 phpmyadmin)。我仍然不明白为什么会发生这种情况?这与在同一脚本中两次调用项目 ID 的事实有关吗???此外,项目 ID 字段是唯一没有从 html 表单发送的数据,但这显然是因为它的自动递增..
  • 抱歉补充一下,因为我对这个东西很陌生,我在 MySQL 中搜索了一些外键,我使用的是 MyISAM 的表结构,你知道这是否会影响结果?正如我所读到的,InnoDB 是外键插入的最佳类型?但是,唯一的区别在于您不能手动将值插入外键表中,但是我不知道! :(

标签: php sql mysql insert


【解决方案1】:

您只是忘记在每个查询之间执行 sql。添加

 mysql_query($sql, $connection)
    or die("MySQL Error: ".mysql_error());

在每个查询之间,你应该没问题。

b.t.w (1) 在 sql 日志中使用tail -f 打开的控制台进行测试总是有帮助的(在/var/log/mysql/ 下)
b.t.w.(2) 您的代码存在严重的安全问题。
b.t.w (3) 您可能要考虑使用 PDO/Mysqli 而不是旧的 mysql 扩展。 b.t.w (4) 使用某种包装器(一个好的类)来接近数据库而不是直接在代码中的任何地方执行它会使您的生活变得更简单。

【讨论】:

    【解决方案2】:

    是的,我会检查两件事

    1) 是否正在执行查询?就像提到的其他海报一样,您是否在设置 SQL 之间执行 SQL 查询?

    2) 如果您以某种方式打印/调试/显示您正在插入的变量,它们会被填充吗?如果您看到插入了一些东西,但有些数据是空白的,那么在此之前可能发生了一些事情,并且这些变量将是空白的。

    【讨论】:

    • 你能再看一下吗,我已经在帖子中添加了更多信息,我还以为是我没有像你说的那样每次都执行查询...
    • 嗨,你知道我该怎么做吗? (打印或调试)变量?只有项目 ID 没有存储在 usersprojects 表中,所以关闭!!!
    【解决方案3】:

    我可能会误解,但你是把 header("Location: main.php");在你的脚本中间?

    【讨论】:

    • 不抱歉,当我编辑上面的示例代码时,我确实有这个瞬间!那会很尴尬:)
    【解决方案4】:
    $projectid=mysql_insert_id($connection); 
    

    我在第一次查询后调用了它,这将从您的项目表中获取 AutoIncrement 值并将其存储在 $projectid 中,然后第二个查询将使用它。 所以在执行我的第一个查询后,我把上面的代码放在那里,没有改变任何其他东西!!

    【讨论】:

      【解决方案5】:

      您似乎只尝试执行一次mysql_query()。您有两个查询,因此需要使用两次,每次查询一次:

      $sql = "INSERT INTO projects (projectid, projectname, projectdeadline, projectdetails) VALUES
         ('{$projectid}','{$projectname}','{$projectdeadline}','{$projectdetails}')";
      $result = mysql_query($sql, $connection)
          or die("MySQL Error: ".mysql_error());
      
      $sql =  "INSERT INTO usersprojects (userid, projectid) VALUES
         ('{$userid}','{$projectid}')";
      $result = mysql_query($sql, $connection)
          or die("MySQL Error: ".mysql_error());
      

      或者,您可以使用mysqli_multi_query(),但这可能需要对您的代码进行大量重写才能使用mysqli 接口。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-10-26
        • 1970-01-01
        • 1970-01-01
        • 2011-10-17
        • 2015-05-12
        • 1970-01-01
        • 2011-08-06
        • 2016-08-13
        相关资源
        最近更新 更多