Многократная вставка в MySQL с использованием PHP

Я сделал форму, которая посещает около 11 человек, и мне нужно добавить ежедневную посещаемость в базу данных. Я хочу использовать один-единственный запрос, чтобы вставить посещаемость всех сотрудников одновременно вместо того, чтобы писать 11 разных запросов для каждого из них. моя структура таблицы выглядит следующим образом: посещаемость (дата,eid,ename, посещаемость) Я пробовал следующий код для моей массовой вставки, но он не работал. какие-либо предложения??

<?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 лучевой линии

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); 
?> 

3 ответа

Понял наконец! Если кому-то нужно вставить несколько значений из формы только с одним блоком, следуйте, должно помочь! ура:)

<?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);
?>

Вы на правильном пути со своим 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 данные с правильным расположением данных.

Недавно мне удалось создать контрольный список для всех, кто начал изучать динамические SQL-запросы на PHP. Вам нужно завершить каждый пункт, прежде чем перейти к текстовому:

  1. Прежде всего, база данных должна быть разработана для хранения ваших данных.
  2. После того, как вы покончили с этим, вам нужно решить, какой запрос будет использоваться для вставки.
  3. затем напишите этот запрос вручную и убедитесь, что он работает в консоли
  4. Следующим шагом будет определить, какие данные вам нужны для этого запроса
  5. Затем вы должны проверить данные, которые у вас есть, и определить, подходит ли они для (4)
  6. если нет - вам нужно отформатировать существующие данные, чтобы они соответствовали требованиям (4)
  7. Как только вы это сделаете, вы можете начать писать программу на PHP, которая будет динамически создавать ваш запрос с использованием конкатенации строк и выводить результаты.
  8. тогда вы должны протестировать этот динамически построенный запрос в консоли, как в (3)
  9. если это работает - замените переменные в запросе заполнителями и продолжите выполнение этого запроса, используя подготовленные операторы mysqli, с одним единственным набором данных. Обратите внимание, что при использовании собственных подготовленных операторов заполнитель может представлять только один литерал данных.
  10. покончив с этим, вы, наконец, можете начать исследование проблемы заполнения готового утверждения несколькими значениями.
Другие вопросы по тегам