2015-11-21 3 views
1

У меня есть форма, которая принимает дату, время в и тайм-аут всех сотрудников сразу и представить его в таблицу базы данных называется посещаемость. имена сотрудников выбираются из таблицы базы данных, и каждый сотрудник имеет уникальный идентификатор. here is my form table Вопрос теперь в том, как я могу отформатировать запрос, который может сразу вставить данные в базу данных. это мой php-код.вставив несколько значений против нескольких идентификаторов в таблице базы данных

<?php 
$servername = "localhost"; 
$username = "root"; 
$password = ""; 
$dbname = "employee_record"; 

// Create connection 
$conn = mysqli_connect($servername, $username, $password, $dbname); 
// Check connection 
if (!$conn) { 
die("Connection failed: " . mysqli_connect_error()); 
} 
$output=""; 
    $query= "SELECT * "; 
    $query.= "FROM employe "; 
    $result=mysqli_query($conn,$query); 
     if(!$result){ 
      echo ("Database query failed. ".mysqli_connect_error()); 
     } 
    <form action="test.php" method="POST" > 
     <table border="1" style="margin-top: 20px"> 
      <thead> 
       <th>Employee Name</th> 
       <th>Date</th> 
       <th>Time In</th> 
       <th>Time Out</th> 
      </thead> 
      <tbody> 
     <?php 
     $id=array(); 
     $date=array(); 
     $timein=array(); 
     $timeout=array(); 
     while($employe = mysqli_fetch_assoc($result)){ 
       echo "<tr><td>"; 
        echo "<input type=\"hidden\" name=\"id[]\" value=\""; 
        echo $employe['id']; 
        echo "\"/>"; 
        echo $employe['firstname']." ".$employe['lastname']."</td>"; 
        echo "<td><input type=\"date\" name=\"date[]\" value=\"\"/></td>"; 
        echo "<td><input type=\"datetime-local\" name=\"timein[]\" value=\"\"/></td>"; 
        echo "<td><input type=\"datetime-local\" name=\"timeout[]\" value=\"\"/></td>"; 
       echo "</tr>"; 
     } 
    ?> 
    </tbody> 
    </table> 
    <input type="submit" name="submit" value="Submit" /> 
    </form> 
?> 

Теперь у меня есть данные, как .. идентификатору (1,2,3), даты (date1, date2, date3), timeIn (TIME1, TIME2, time3), TIMEOUT (TIME1 , time2, time3). количество данных зависит от того, откуда вы взяли идентификаторы из таблицы данных, где число сотрудников может быть больше или меньше. теперь я просто зациклился на том, как я могу вставить эти данные против идентификаторов в базе данных. любая помощь будет оценена ..

+0

Похоже, что все даты будет такой же?!? Но в любом случае, есть учебники для такого рода вещей. – Strawberry

+0

Сколько строк может быть для одной формы. Я прошу, потому что вставка одной строки во время будет проста для кода. Если вы используете подготовленные запросы и транзакции, это будет достаточно быстро. Приблизительный подсчет строк - это все, что нужно - десятки, сотни, тысячи записей? –

ответ

0

ЕСЛИ Я правильно понял вопрос, возможно, что-то вроде этого может помочь. Это, конечно, непроверено с вашими данными, но я думаю, что идея должна работать.

/* 
    ------------------------------ 
    To process the form submission 
    ------------------------------ 
*/ 

$update=false;/* change this if the final output sql looks correct..*/ 
$keys=array_keys($_POST); 
$length=count($_POST[ $keys[ 0 ] ]); 

for($i=0; $i < $length; $i++){ 

    $params=array(); 

    foreach($keys as $field) { 
     $value=$_POST[ $field ][ $i ]; 

     if($field!=='id') $params[]="`{$field}`=\"".str_replace('"',"'",$value)."\""; 
     else $where=" where `id`='".$value."';"; 
    } 

    $sql="update `employee` set ".implode(', ',$params) . $where; 
    if($update) $result=mysqli_query($conn, $sql); 
    else echo $sql.'<br />'; 
} 
+0

заработал с некоторыми изменениями в вашем методе. спасибо :) –

2

Чтобы вставить несколько (M) строк с N столбцов, которые можно использовать следующий синтаксис:

INSERT INTO tablename 
    (colname1, colname2, .. , colnameN) 
VALUES 
    (valueRow1Colname1, valueRow1Colname2, .. , valueRow1ColnameN), 
    (valueRow2Colname1, valueRow2Colname2, .. , valueRow2ColnameN), 
    .. 
    (valueRowMColname1, valueRowMColname2, .. , valueRowMColnameN); 

Вы можете создать этот запрос с помощью функции PHP присоединиться или Implode.

$ids  = array(); 
$dates = array(); 
$timeIns = array(); 
$timeOuts = array(); 

// validate $_POST data and put into arrays above 

$numInserts = count($ids); 
if ($numInserts > 0) { 
    $values = array(); 
    for ($i = 0; $i < $numInserts; $i++) { 
     $values[] = "({$ids[$i]}, '{$dates[$i]}', '{$timeIns[$i]}', '{$timeOuts[$i]}')"; 
    } 
    $valuesJoined = join(',', $values); 

    $query = " 
     INSERT INTO attendance (user_id, date, tiemeIn, timeOut) 
     VALUES {$valuesJoined} 
     ON DUPLICATE KEY UPDATE 
      date = VALUES(date), 
      tiemeIn = VALUES(tiemeIn), 
      timeOut = VALUES(timeOut) 
    "; 
    $result=mysqli_query($conn,$query); 
} 
+0

Мне кажется полезным, но я хочу сделать что-то вроде {"INSERT INTO attendance (date, tiemeIn, timeOut) VALUES {$ valuesJoined} WHERE user_id = {multiple ids ..}"}. ТАК, какой будет запрос тогда? –

+0

тоже работал. thanks :) –

+0

Это не сработает так, как вы написали. Вы можете написать 'INSERT ... WHERE user_id IN (1, 5, 6)', но вы вставляете одинаковые значения для каждого пользователя. Но если 'user_id' является уникальным или первичным ключом, вы можете использовать' ON DUPLICATE KEY UPDATE' для пользователей, у которых уже есть запись. –

Смежные вопросы