Многократная вставка в 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. Вам нужно завершить каждый пункт, прежде чем перейти к текстовому:
- Прежде всего, база данных должна быть разработана для хранения ваших данных.
- После того, как вы покончили с этим, вам нужно решить, какой запрос будет использоваться для вставки.
- затем напишите этот запрос вручную и убедитесь, что он работает в консоли
- Следующим шагом будет определить, какие данные вам нужны для этого запроса
- Затем вы должны проверить данные, которые у вас есть, и определить, подходит ли они для (4)
- если нет - вам нужно отформатировать существующие данные, чтобы они соответствовали требованиям (4)
- Как только вы это сделаете, вы можете начать писать программу на PHP, которая будет динамически создавать ваш запрос с использованием конкатенации строк и выводить результаты.
- тогда вы должны протестировать этот динамически построенный запрос в консоли, как в (3)
- если это работает - замените переменные в запросе заполнителями и продолжите выполнение этого запроса, используя подготовленные операторы mysqli, с одним единственным набором данных. Обратите внимание, что при использовании собственных подготовленных операторов заполнитель может представлять только один литерал данных.
- покончив с этим, вы, наконец, можете начать исследование проблемы заполнения готового утверждения несколькими значениями.