为什么CI要创建新行而不是进行更新?

时间:2019-06-14 21:59:21

标签: php codeigniter sql-update

我正在我的应用程序中创建一个UI,该UI将允许用户确定接收到的内容的状态,包括更新内容。 CI如何处理?

我尝试了文档的查询构建器部分中提供的不同更新方法,包括replaceupdate,我将数据从视图传递到控制器,再传递给模型数组的形式。但是,当我尝试使用它时,它将创建一个具有该单个值的新行,而所有其他列均为空。

  

view.php

<form action="Application/Update" method="get">
<input type="hidden" name="mar-id" value="<?php echo $row['id']; ?>">
<input type="hidden" name="mar-read" value="New-value">
<?php echo anchor('http://localhost/dir/dir/dir/index.php/Application/Update', 'update'); ?>
</form>
  

controller.php

public function Update() {

  $this->load->helper('url');
  $this->load->model('Main');

  $id = $this->input->post('mar-id');
  $value = $this->input->post('mar-read');

  $mar = $this->Main->Update($id, $value);

  if ($mar == TRUE) {
    redirect('http://localhost/dir/dir/dir/index.php/Application/Otherpage', 'refresh');
  }
  else {
    redirect('http://localhost/dir/dir/dir/index.php/Application/Otherpage');
  }
}
  

model.php

public function Update($id, $value) {

  $data = array(
    'status' => $value
  );
  $this->db->where('id', $id);
  $update = $this->db->update('table', $data);

}

正如我所说,我希望根据提供的行ID对行进行更新。相反,它将使用该单个值创建一个全新的行。它不会返回任何错误消息。

1 个答案:

答案 0 :(得分:2)

这里有很多错误。

到目前为止,我们已经确定在控制器中执行var_dumps会导致所有“ POST”值都为NULL。

为简单起见,我假设以下内容。

控制器名称为:Program.php (应用程序不是允许的控制器名称,因为它是文件夹名称)

型号名称为:Mdl_update.php

视图为:update_view.php

问题1: 您的表单存在一个问题,即您使用的只是一个链接的锚标记。在提交表单中的任何数据时,它什么都不做。

因此,我们必须删除锚标记并将其替换为表单提交。您必须提交表单才能获得发送表单数据的任何机会。

为了测试您的GET和POST,我添加了两种不同的形式。 在update_view.php

<!-- Set the Method to GET -->
<form action="program/update" method="get">
    <input type="hidden" name="mar-id" value="<?php echo $row['id']; ?>">
    <input type="hidden" name="mar-read" value="New-value">
    <input type = "submit" name="update" value="Update with GET">
</form>

<!-- Set the Method to POST as this is what the Controller is Expecting -->
<form action="program/update" method="post">
    <input type="hidden" name="mar-id" value="<?php echo $row['id']; ?>">
    <input type="hidden" name="mar-read" value="New-value">
    <input type = "submit" name="update" value="Update with POST">
</form>

我以前通过在程序控制器中调用程序/索引来在控制器中显示窗体的方式。

public function index() {
    $this->load->helper('url');
    $data['row'] = array('id' => 2);
    $data = $this->load->view('update_view', $data, TRUE);
    echo $data;
}

因此,您的控制器正在寻找POST而不是GET。可以通过稍微调高控制器进行调试来证明这一点。

public function update() {
    $this->load->helper('url');
    $this->load->model('mdl_update');

    $id = $this->input->post('mar-id');
    $value = $this->input->post('mar-read');

    echo '<h2>POST Values</h2>';
    var_dump($id);
    var_dump($value);

    // ****************************
    // These are added in for debugging/Demonstration to show values for the form using the GET method.
    $id_get = $this->input->get('mar-id');
    $value_get = $this->input->get('mar-read');

    echo '<h2>GET Values</h2>';
    var_dump($id_get);
    var_dump($value_get);
    // ****************************

    exit('Stopped for Debugging: Method '. __METHOD__.' at Line: '.__LINE__); // Added for Debug

    $mar = $this->mdl_update->Update($id, $value);

    if ($mar == TRUE) {
        redirect(base_url('program/otherpage'), 'refresh');
    } else {
        redirect(base_url('program/otherpage'));
    }
}

因此,当您的表单方法设置为GET时,您正在寻找POST数据。请注意您的设置。它们必须匹配。

如果要使用GET,则需要使用$this->input->get() 上面的代码可让您同时进行测试。

因此,您现在拥有一个POST和GET表单,并且已设置控制器来演示两种不同的类型。选择GET或POST!。这取决于您选择哪一个。

问题2:不返回任何内容时,需要从模型返回值。

在Controller中,您有一行...

$mar = $this->mdl_update->Update($id, $value);

在模型中,您拥有...

public function update ($id,$value) {
    $data = array(
        'status' => $value
    );
    $this->db->where('id', $id);
    $this->db->update('db_table', $data);
}

您的模型方法未返回任何内容。 您应该始终查找返回值是什么。我希望您的意图是返回更新的值。查看CI代码本身,看来如果出现问题,它将返回FALSE(如果禁用了数据库调试-了解了一些新知识)

我添加了一些调试信息,以帮助查看此处发生的情况。

public function update($id, $value) {
    $data = array(
        'status' => $value
    );
    $this->db->where('id', $id);
    $update_result = $this->db->update('db_table', $data);

    echo $this->db->last_query(); // Added for DEBUG

    return $update_result;
}

现在,我无法按照您的要求获取您的代码来创建新行。 使用此代码不可能添加新行。 因此,这是由于您没有向我们展示的东西而发生的,但在这里并不重要。

如果我们更改控制器以查看模型等(我仅显示更改),我们将更改

exit('Stopped for Debugging: Method '. __METHOD__.' at Line: '.__LINE__);

$mar = $this->mdl_update->Update($id, $value);

对此

$mar = $this->mdl_update->Update($id, $value);
var_dump($mar);
exit('Stopped for Debugging: Method '. __METHOD__.' at Line: '.__LINE__);

如果运行此命令并提交GET(结果为NULL)或POST,则更新将始终返回TRUE。因此,您的重定向等需要考虑如何决定一个或另一个。

我认为您应该将表列设置为不允许它们为NULL,并在控制器中添加一些“ Validation”。

问题3:无表单验证 我建议您阅读CodeIgniter的表单验证类。进入这里的时间太长了...

因此,当您进行此操作时,可以添加/删除调试以测试正在发生的事情,并按照我希望的方式进行调试。

如果不清楚,请问。我确定我可能遗漏了一些东西。