我正在我的应用程序中创建一个UI,该UI将允许用户确定接收到的内容的状态,包括更新内容。 CI如何处理?
我尝试了文档的查询构建器部分中提供的不同更新方法,包括replace
和update
,我将数据从视图传递到控制器,再传递给模型数组的形式。但是,当我尝试使用它时,它将创建一个具有该单个值的新行,而所有其他列均为空。
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对行进行更新。相反,它将使用该单个值创建一个全新的行。它不会返回任何错误消息。
答案 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的表单验证类。进入这里的时间太长了...
因此,当您进行此操作时,可以添加/删除调试以测试正在发生的事情,并按照我希望的方式进行调试。
如果不清楚,请问。我确定我可能遗漏了一些东西。