Php 为什么CI创建新行而不是更新?
我正在我的应用程序中创建一个UI,它允许用户决定接收内容的状态,包括更新内容。CI如何处理这个问题 我尝试了文档中查询生成器部分提供的不同更新方法,包括Php 为什么CI创建新行而不是更新?,php,codeigniter,sql-update,Php,Codeigniter,Sql Update,我正在我的应用程序中创建一个UI,它允许用户决定接收内容的状态,包括更新内容。CI如何处理这个问题 我尝试了文档中查询生成器部分提供的不同更新方法,包括replace和update,我将数据从视图传递到控制器,以数组的形式传递到模型。然而,当我尝试它时,它创建了一个新行,其中只有一个值,而所有其他列都为空 view.php model.php 正如我所说,我希望根据提供的行id更新行。相反,它创建了一个具有该单个值的全新行。但是它不会返回任何错误消息。这里有许多错误 所以到目前为止,我们已经确定
replace
和update
,我将数据从视图传递到控制器,以数组的形式传递到模型。然而,当我尝试它时,它创建了一个新行,其中只有一个值,而所有其他列都为空
view.php
model.php
正如我所说,我希望根据提供的行id更新行。相反,它创建了一个具有该单个值的全新行。但是它不会返回任何错误消息。这里有许多错误 所以到目前为止,我们已经确定在控制器中执行var_转储会导致所有“POST”值为NULL 为了简单起见,我假设如下 控制器名称为:Program.php(应用程序不是允许的控制器名称,因为它是foldername) 模型名为:Mdl_update.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>
视图为: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>
问题#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>
因此,您的控制器正在查找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'));
}
}
在你的模型中你有
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,并在控制器中添加一些“验证”
public function index() {
$this->load->helper('url');
$data['row'] = array('id' => 2);
$data = $this->load->view('update_view', $data, TRUE);
echo $data;
}
第3期:无表单验证
CodeIgniter有一个表单验证类,我建议您阅读。这太长了,不能在这里讨论
因此,当您完成这个过程时,您可以添加/删除调试来测试正在发生的事情,并按照我希望的方式进行
如果有什么不清楚的地方,就问吧。我肯定我可能遗漏了什么。这没有任何意义。查询生成器只是一个助手,它不会改变sql的工作方式。如果更新的id不存在,它就不会更新,它不会以某种方式插入新行…我知道,我指的是文档,我从那里获取的,不管是文档还是sql都不允许通过update语句创建新行。什么意思?空白页?错误?提神?重定向?所以这不是你实际使用的代码。。。通过回答,没有问题。仅供参考“如果出现问题,它将返回FALSE(如果数据库调试被禁用-了解一些新内容)”,如果查询失败,它也将返回FALSE。当db_debug关闭时,这是让用户知道查询失败的好方法。如果它打开,应用程序将抛出该错误,看起来会很难看。因此,如果您正确处理它的返回,您可以发出一条很好的错误消息。@TimBrownlaw谢谢,现在它可以识别输入值了
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__);