【问题标题】:Comparing Data Before and After Form Submission比较表格提交前后的数据
【发布时间】:2015-11-14 04:41:37
【问题描述】:

我有一个表单页面,其中许多元素保存到我的数据库中的不同表和不同行中。为了尽量减少数据库调用,我想比较表单提交前后的数据,然后我可以编写一个只更新已更改数据的函数。为此,我将用于构建表单的数组保存在会话文件中:

$this->session->set_tempdata('form_values_'.$item['id'],json_encode($item), 86400);

在提交表单时,我检索此数据并将其与 $_POST 进行比较:

$pre_post = json_decode($_SESSION['form_values_'.$_POST['id']], true);

除了少数有“。”的文本区域外,一切都很好。在我的测试数据中。出于某种原因,即使我没有更改数据,这些字段也会返回不相等。

这绝对是导致问题的时期,当我删除它时它工作正常。另一方面,还有其他文本区域的句点不会引起问题。

我认为这可能是 codeigniter 的 XSS 过滤,但我删除了它,它没有任何区别。

最初我使用序列化来对数组进行编码以进行存储,但我切换到 json_encode 并再次没有任何区别。

这是我用来比较值的代码:

$pre_post = json_decode($_SESSION['form_values_'.$_POST['id']], true);
$post = $this->security->xss_clean($_POST);
foreach ($post as $key => $value) {
    if( !isset($pre_post[$key]) || trim($value)!=trim($pre_post[$key]) ){
        $post_post[$key] = $value; 
    }
}

有什么想法吗?

【问题讨论】:

  • 您将数据与什么进行比较?你在会话中保存的 pre_post 和 $post 有什么区别?
  • 对不起,我认为我的问题很清楚。 pre_post 是我用来使用数据库中的原始数据构建表单的数组。我将它与 $_POST 进行比较,即表单返回的内容。现在我只是在测试它并没有改变任何东西,所以一切都应该平等。然而,正如我所说,一些文本字段返回不相等。
  • 好的,如果你不介意的话。您可以发布数据库中的数据和数据发布表单提交吗?这将有助于找出问题。
  • [note/154] => 650. 75, 38
  • 很抱歉还没有添加该评论的意思,但这是给我带来问题的字段之一的示例。那是在表单提交之前从数组中复制的,下面是从 $_POST 复制的,[note/154] => 650. 75, 38

标签: php forms codeigniter serialization


【解决方案1】:

试试这个代码可能对你有帮助

$select = "SELECT * FROM ".$table_name." WHERE ".$field_name ." = '".$value."'";
        $result_latest = mysql_query($select) or trigger_error(mysql_error()); 
        	while($row = mysql_fetch_array($result_latest,MYSQL_ASSOC))
            {
                $data_new = array_intersect_key($row,$data);
    			foreach($data_new as $k=>$v)
                {
                    if(strcmp($row[$k],$data[$k]) != 0)
                    {
    					$string .= '`'.$k.'` = "'.$data[$k].'" ,';
                    }
                }
            }
    	$string = rtrim($string, ",");
        if($string != NULL){
    	   $update_sql = "UPDATE ".$table_name." SET ".$string." WHERE ".$field_name." = "."'".$value."'";
           $query = $CI->db->query($update_sql);
        }

【讨论】:

  • 在上面的代码中,它将比较表单的新旧数据,任何字段数据被更改,它只会更新。
  • 感谢您的帮助,但问题不在于如何编写函数。问题是为什么以下两个字符串不相等:“650.75,38”,“650.75,38”一个是从数据库中提取并存储在序列化文件中,另一个是从表单返回跨度>
  • 试试if(strcmp($data1,$data2) != 0),它会比较字符串并在比较之前使用修剪。我已经测试过了。
  • 谢谢,但它不起作用,我使用 if( strcmp(trim($pre_post_value),trim($post_value)) == 0 ) 得到的结果与使用 if( trim($pre_post_value) == trim($post_value) ) 得到的结果相同,顺便说一下 strcmp 不会为你调整值
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-14
  • 1970-01-01
  • 2021-07-21
  • 1970-01-01
  • 2013-11-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多