某些字段的 PHP Codeigniter 批量更新失败

Posted

技术标签:

【中文标题】某些字段的 PHP Codeigniter 批量更新失败【英文标题】:PHP Codeigniter batch update on some field failed 【发布时间】:2016-03-07 22:12:17 【问题描述】:

我有一个这样的 html 表格: 查看

<table id="tableReport" class="table table-hover">
<thead>
    <tr>
        <th>NO</th>
        <th>TYPE</th>
        <th>ITEM</th>
        <th>DAMAGE</th>
        <th>REPAIR</th>
        <th>REMARKS</th>
        <th>MANHOUR</th>
        <th>MATERIAL</th>
        <th>A / C</th>
    </tr>
</thead>
<tbody>
    <tr>
        <td>
            <input class="form-control" type="text" value="68" placeholder="68" disabled="" name="name_type">
        </td>
        <td>
            <input class="form-control" type="text" value="Cleaning" placeholder="Cleaning" disabled="" name="name_item">
        </td>
        <td>
            <input class="form-control" type="text" value="Certificate" placeholder="Certificate" disabled="" name="name_item">
        </td>
        <td>
            <input class="form-control" type="text" value="Broken" placeholder="Broken" disabled="" name="name_damage">
        </td>
        <td>
            <input class="form-control" type="text" value="Blast&Paint" placeholder="Blast&Paint" disabled="" name="name_repair">
        </td>
        <td>
            <input class="form-control" type="text" value="AAAAAA" placeholder="AAAAAA" disabled="" name="name_remarks">
        </td>
        <td>
            <input class="form-control" type="text" value="10.00" placeholder="10.00" disabled="" name="name_damage">
        </td>
        <td>
            <input id="material" class="form-control" type="text">
        </td>
        <td>
            <input id="A/C" class="form-control" type="text">
        </td>
    </tr>
    <tr>
        <td>
            <input class="form-control" type="text" value="69" placeholder="69" disabled="" name="name_type">
        </td>
        <td>
            <input class="form-control" type="text" value="Cleaning" placeholder="Cleaning" disabled="" name="name_item">
        </td>
        <td>
            <input class="form-control" type="text" value="Exterior" placeholder="Exterior" disabled="" name="name_item">
        </td>
        <td>
            <input class="form-control" type="text" value="Modified" placeholder="Modified" disabled="" name="name_damage">
        </td>
        <td>
            <input class="form-control" type="text" value="Replace" placeholder="Replace" disabled="" name="name_repair">
        </td>
        <td>
            <input class="form-control" type="text" value="BBBBB" placeholder="BBBBB" disabled="" name="name_remarks">
        </td>
        <td>
            <input class="form-control" type="text" value="10.00" placeholder="10.00" disabled="" name="name_damage">
        </td>
        <td>
            <input id="material" class="form-control" type="text">
        </td>
        <td>
            <input id="A/C" class="form-control" type="text">
        </td>
    </tr>
</tbody>
</table>

JQUERY 我使用这个 jquery 得到了这些表上的所有值:

$('#tableReport').find('tbody').find('tr').each(function () 
        var row_data = [];
        $(':input', this).each(function () 
            row_data.push($(this).val());
        );
        table_data.push(row_data);
 );

结果如下所示:

Array
(
[0] => Array
    (
        [0] => 68
        [1] => Cleaning
        [2] => Certificate
        [3] => Broken
        [4] => Blast&Paint
        [5] => AAAAAA
        [6] => 10.00
        [7] => a
        [8] => b
    )

[1] => Array
    (
        [0] => 69
        [1] => Cleaning
        [2] => Exterior
        [3] => Modified
        [4] => Replace
        [5] => BBBBB
        [6] => 10.00
        [7] => c
        [8] => d
    )

)

这个数组用于更新我的表中的批处理。

mysql> select * from tb_repair_detail;
+-----------+--------------------+------+-----------+-----------+---------+---------+----------+------+
| DETAIL_ID | REPAIR_ESTIMATE_ID | ITEM | DAMAGE_ID | REPAIR_ID | REMARKS | MANHOUR | MATERIAL | AC   |
+-----------+--------------------+------+-----------+-----------+---------+---------+----------+------+
|        68 |                 43 | 01   | 01        | 30        | AAAAAA  |   10.00 |     NULL | NULL |
|        69 |                 43 | 03   | 16        | 45        | BBBBB   |   10.00 |     NULL | NULL |
+-----------+--------------------+------+-----------+-----------+---------+---------+----------+------+
2 rows in set (0.00 sec)

SO,AJAX 获取调用控制器执行此操作:

$.ajax(
        url: "<?php echo base_url('admin/c_admin/update_json_detail'); ?>",
        type: "POST",
        data: 
            POST_ARRAY: table_data
        ,
        dataType: 'json',
        success: function (obj) 
            console.log(obj);
        
    );
return false;

控制器

public function update_json_detail()
   $execute = $this->input->post("POST_ARRAY");
   /*CODE TO INSERT BATCH*/
   $callback = $this->m_admin->update_eir_to_cost($execute, execute_first_index[0]);

这是模型

public function update_eir_to_cost($data, $id) 
    $this->db->trans_start();
    $this->db->update_batch('tb_repair_detail', $data, $id); 
    $this->db->trans_complete();

    if ($this->db->trans_status() === FALSE) 
        // generate an error... or use the log_message() function to log your error
        echo "Error Updating";
    

我的大问题是,我想使用更新批处理。但是,我只想更新工时和交流字段。我真的坚持了好几天,任何帮助都非常感谢

更新 非常感谢苏丹先生。 现在,我的代码看起来像这样:

public function update_json_detail() 
    $post_data = $this->input->post("POST_ARRAY");
    $execute = array();
    foreach ($post_data as $data) 
        $execute[] = array(
            'ID'=> $data['0'],
            'MATERIAL' => $data['7'],
            'AC' => $data['8']
        );
    

    /* CODE TO INSERT BATCH */
    $callback = $this->m_admin->update_eir_to_cost($execute);

我的模型出了点问题,因为我需要三个参数来 update_batch

public function update_eir_to_cost($id, $material, $ac) 
    $data = array(
        "MATERIAL" => $material,
        "AC" => $ac
    );

    $this->db->trans_start();
    $this->db->where($id);
    $this->db->update_batch('tb_repair_detail', $data);
    $this->db->trans_complete();

    if ($this->db->trans_status() === FALSE) 
        // generate an error... or use the log_message() function to log your error
        echo "Error Updating";
    

感谢您的解决方案

【问题讨论】:

这和batch-file有什么关系? 【参考方案1】:

在你的控制器中,用这个替换你的函数:

public function update_json_detail()
   $post_data = $this->input->post("POST_ARRAY");
   $execute = array();
   foreach($post_data as $data)
   $execute[] = array(
    'MANHOUR' => $data['6'],
    'AC' => $data['8']
   ); 
   
   /*CODE TO INSERT BATCH*/
   $callback = $this->m_admin->update_eir_to_cost($execute, execute_first_index[0]);

【讨论】:

【参考方案2】:

有几种方法可以解决一个问题,但我们只能选择最聪明的方法。

您只需要选择所需的元素,而不是推入数组并发布它们。 请为输入元素提供名称属性,并在视图 (html) 和 jQuery 中进行检查以选择所需的元素。不要更改模型和控制器中的任何内容。

第 1 步 输入元素应具有名称属性。

<input class="form-control" type="text" value="10.00" placeholder="10.00" disabled="" name="MANHOUR"> <input id="A/C" name="A/C" class="form-control" type="text" value="11111">

第 2 步 JQUERY -- 你在哪里获得值的地方是下面的代码而不是这个row_data.push($(this).val());

if($(this).attr("name")==='name_type' || $(this).attr("name")==='MANHOUR' || $(this).attr("name")==='A/C')
row_data.push($(this).val());

【讨论】:

以上是关于某些字段的 PHP Codeigniter 批量更新失败的主要内容,如果未能解决你的问题,请参考以下文章

在 PHP,Codeigniter 中提交带有空字段的表单时出现一些错误

Codeigniter 服务器超时 - 在 for 循环中运行批量数据库查询

如何在 Codeigniter 中插入动态数据?

CodeIgniter 仅在某些页面使用 CSRF 保护

怎样批量去掉文件名称的某些字段

php/Codeigniter——如何通过排除时间来仅比较日期