【问题标题】:Multiple insert in mysql using php使用php在mysql中多次插入
【发布时间】:2013-07-10 15:21:12
【问题描述】:

我制作了一个表格,它需要大约 11 人的出勤率,我需要在数据库中插入每日出勤率。我想使用一个查询一次插入所有员工的出勤率,而不是为每个员工编写 11 个不同的查询。我的表结构是这样的:出勤(日期,开斋节,姓名,出勤) 我为批量插入尝试了以下代码,但没有成功。有什么建议吗??

<?php
    $dbhost = "localhost";
    $dbuser = "root";
    $dbname = "gail";

    $conn = mysql_connect($dbhost, $dbuser,"") or die ('Error connecting to mysql');
    mysql_select_db($dbname);
    $dbh->beginTransaction();

    $stmt = $dbh->prepare("INSERT INTO attendance VALUES (curdate(),'$_POST[eid]','$_POST[ename]','$_POST[pora]')");

    foreach($valuesToInsert as $insertRow)
    {   

        // now loop through each inner array to match binded values
        foreach($insertRow as $column => value)
        {
            $stmt->bindParam(":{$column}", value);
            $stmt->execute();
        }
    }


    $dbh->commit();
?>

我也试过这个:

<?php

    $dbhost = "localhost";
    $dbuser = "root";
    $dbname = "gail";

    $conn = mysql_connect($dbhost, $dbuser,"") or die ('Error connecting to mysql');
    mysql_select_db($dbname);

    $employees=array();

    while($row=mysql_fetch_assoc($result))
    {
        $employees[$row["eid"]]=array("ename"=>$row["ename"]);
        $employees[$row["eid"]][$row["dated"]]=array();
        $employees[$row["eid"]][$row["dated"]][$row["ename"]]=$row["pora"];
        $inserts = array();
        foreach($employees as $v)
        {
            $inserts[] = "(curdate(),'$_POST[eid]','$POST[ename]','$POST[pora]')";

            $query = "INSERT INTO attendance VALUES ". implode(", ", $inserts);

            echo "query = $query"; // for debugging purposes, remove this once it is working
            mysql_query($query) or die(mysql_error());
        }
    }


?>

但这只是在表中多次插入当前日期。请帮忙。提前谢谢:)

我又做了一件事。它在数据库中插入多行,正是你想要的行数,但都是空白的。关于如何处理的任何想法?

html 文件:

光束线 ID 流动

光束线 ID
流动

光束线 ID 流动

光束线 ID 流动

光束线 ID 流动

php:

 <?php
    $dbhost = "localhost";
    $dbuser = "root";
    $dbname = "gail";

    $conn = mysql_connect($dbhost, $dbuser,"") or die ('Error connecting to mysql');
    mysql_select_db($dbname);

    $cnt = count($_POST['bline_id']);
    $cnt2 = count($_POST['flow']);

    if ($cnt > 0 && $cnt == $cnt2) {
        $insertArr = array();
        for ($i=0; $i<$cnt; $i++) {
            $insertArr[] = "('" . mysql_real_escape_string($_POST['bline_id'][$i]) . "', '" .        mysql_real_escape_string($_POST['flow'][$i]) . "')";
        }

        $query = "INSERT INTO bltest (bline_id, flow) VALUES " . implode(", ", $insertArr);
        mysql_query($query) or trigger_error("Insert failed: " . mysql_error());
    }

    echo("<pre>\n");  
    print_r($_POST);
    echo("</pre>\n");
    mysql_close($conn); 
?> 

【问题讨论】:

  • 请在您提出请求之前向我们展示$query 的外观。
  • 你的 sql 语句应该看起来像 "INSERT INTO Attendance VALUES(?,?,?,?),(?,?,?,?),(?,?,?,?)" where您为要插入的每一行重复 ,() 。希望这会有所帮助。
  • @lollercoaster $query = "插入出勤值"。内爆(“,”,$插入);我在某处读到内爆语句存储在这样的变量中,即使在 cho 语句之后也没有任何结果。只是在日期列中插入了大量日期
  • @Boundless 仅解决当前场景..但是每次员工加入公司并且我在数据库中添加他的名字时,我都必须更新代码。我想要一些自动从表员工详细信息中读取值,然后将它们插入到另一个表中以进行考勤
  • @VeronikaMarvolo:不,它返回一个字符串:php.net/manual/en/function.implode.php

标签: php mysql bulkinsert multiple-insert


【解决方案1】:

终于明白了!如果有人需要从只有一个 cide 块的表单中插入多个值,follow 应该会有所帮助!欢呼::)

<?php

$dbhost = "localhost";
$dbuser = "root";
$dbname = "gail";

$conn = mysql_connect($dbhost, $dbuser,"") or die ('Error connecting to mysql');
mysql_select_db($dbname);

$cnt = count($_POST['eid']);
$cnt2 = count($_POST['ename']);
$cnt3 = count($_POST['pora']);

if ($cnt2 > 0 ) {
$insertArr = array();
for ($i=0; $i<$cnt2; $i++) {
    $insertArr[] = "(curdate(),'" . mysql_real_escape_string($_POST['eid'][$i]) . " ','" . mysql_real_escape_string($_POST['ename'][$i]) . " ','" .   mysql_real_escape_string($_POST['pora'][$i]) . "')";
      }

 $query = "INSERT INTO attendance (dated,eid,ename,pora) VALUES " . implode(", ",     $insertArr);
 mysql_query($query) or trigger_error("Insert failed: " . mysql_error());
 }

echo("<pre>\n");
print_r($_POST);
echo("</pre>\n");

mysql_close($conn);
?>

【讨论】:

    【解决方案2】:

    您的foreach() 循环走在正确的轨道上。主要有两点需要改变。由于我们要构建单个查询(而不是针对每个员工的查询,因此在循环之前开始查询:

    $query = "INSERT INTO `attendance` (`field1`, `field2`, `field3`) VALUES ";
    foreach ($employees as $v)
    

    接下来,在循环的每次迭代中将特定于员工的字段添加到查询中。请注意,您需要转义您的输入以避免 MySQL 注入。 mysql_real_escape_string() 是执行此操作的一种方法,但您应该考虑实施更强大的解决方案,也许通过 PDO 参数化查询。

    foreach($employees as $v)
    {
        $inserts[] = "(curdate(), '"
            . mysql_real_escape_string($_POST['eid'])
            . "', '" . mysql_real_escape_string($_POST['ename'])
            . "', '" . mysql_real_escape_string($_POST['pora']) . "')";
    }
    

    然后将单个插入添加到查询中:

    $query .= implode(",", $inserts);
    

    这将产生以下格式的查询:

    INSERT INTO `attendance` (`field1`, `field2`, `field3`) VALUES 
        (curdate(), 'id1', 'ename1', 'pora1'),
        (curdate(), 'id2', 'ename2', 'pora2'),
        (curdate(), 'id3', 'ename3', 'pora3')
    

    最后,关于您是从$_POST 还是从数据库查询中提取数据,您的代码中存在一些混淆。如果数据来自查询,请将对$_POST数据的引用替换为数据的正确位置。

    【讨论】:

    • 哇..这是我见过的最容易理解的解决方案。谢谢乔治..我想这应该可以。但是一个快速的问题,我的日期来自一个名为 dates 的表,该表每天更新日期,eid 和 ename 来自一个名为 employees 的表。 pora(用于标记出勤)来自表格。但是,我将日期 eid 和 ename 的值放在 d 形式以及 对于所有 3 中。所以我对所有人使用 $_POST。对吗?
    • @VeronikaMarvolo 如果所有员工的值都已插入到表单中,它将从$_POST 中提取数据。但是,如果您要从数据库中提取一些值,而从表单中提取一些值,则需要稍微修改代码以找到它们存在的任何值。
    • 不,我正在从表单中提取 evrythng ..thnks fr 虽然 :)
    • 嘿 o 实现了你的代码,它插入了日期和 pora 列,但它没有插入 eid 和 ename..
    • 未定义索引:第 217 行 C:\wamp\www\gail\att.php 中的 eid 出现此错误
    【解决方案3】:

    最近,我设法为开始使用 PHP 学习动态 SQL 查询的每个人创建了一个清单。您需要完成每一项才能转到正文:

    1. 首先,必须设计一个数据库来存储您的数据。
    2. 一旦你完成了它,你需要考虑一下什么样的查询可以满足插入的目的。
    3. 然后手动编写此查询并确保它在控制台中有效
    4. 下一步是确定此查询需要哪些数据
    5. 那么您必须验证您拥有的数据并确定它是否适合 (4)
    6. 如果不是 - 您需要格式化现有数据以使其符合 (4) 中的要求
    7. 一旦你有了它,你就可以开始编写一个 PHP 程序来动态地创建你的查询,使用字符串连接,并回显结果。
    8. 那么您必须像在 (3) 中一样在控制台中测试这个动态构建的查询
    9. 如果有效 - 用占位符替换查询中的变量,然后使用 mysqli 准备好的语句和一组数据继续运行此查询。请注意,在使用原生预处理语句时,占位符只能代表一个单独的数据字面量。
    10. 完成后,您终于可以开始研究为准备好的语句提供多个值的问题了。

    【讨论】:

    • 非常感谢您提供这些提示。实现我的目标..我非常感激
    • 必须运行代码,而不是看它。我没有你的 $_POST,没有你的服务器,没有你的数据,没有你的环境。只有你拥有它。你为什么不检查你的查询,你的变量是否包含你需要的数据?你有,但我没有。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-14
    • 2014-02-25
    • 2012-01-04
    • 1970-01-01
    • 2016-08-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多