1

我正在构建一个 CMS,并且正在尝试制作一个版本控制系统。

每次用户发布对现有网页的更新时,我都希望“版本控制”表保留已编辑字段的事件日志......

为此,我运行了一堆循环来检查用户刚刚填写的表单内容是否与点击提交之前网站上的内容不同...

因此,在我进行任何更新之前,我有以下代码(如果格式不正确,请道歉):

$sql = "select * from pages where ID =" .$_POST[id];
$rs = odbc_exec ($db, $sql);
$contents_original = odbc_result($rs,"content");
$title_original = odbc_result($rs,"title");
$pageorder_original = odbc_result($rs,"pageorder");
$parent_original = odbc_result($rs,"parent");
$footer_original = odbc_result($rs,"footer");

$updated_content = trim(stripslashes(strtolower(htmlentities($_POST['content']))));
$original = trim(strtolower($contents_original));

if ($updated_content == $original) {
                $a = 'n';
                } else {
                $a = '<p>Contents changed.';
                }

// 以此类推,从变量 $b - $e ... 然后:

    $update = "$a $b $c $d $e"; 

然后是更新例程(所有这些都可以正常工作),并且在版本更新结束时,我将 $update 的内容插入到“事件”列中的 SQL 中(这也可以正常工作)

然而!假设用户使用原始页面内容加载表单并单击提交...如果表单没有任何更改,则 $a 将 = ' ',因此,不应在“事件”列中输入任何内容。除了它不断输入“内容已更改”,事实上,它对每个字符串都这样做(例如标题字段、页脚字段等)!奇怪的是有 2 个整数输入,它们被事件菜单记录得很好。

如果我打印出 strlen(stripslashes(strtolower(htmlentities($_POST['content'])))) 和 strlen(strtolower($contents_original)) 它表明长度不同......

代码或数据库长度中没有任何内容会导致这种抑制。


输出:stripslashes(strtolower(stripcslashes($thenewcontent)))

章鱼你好!

欢迎来到乔纳森米。爱德华兹的平面设计页面。

无论您需要设计什么——一个商业网站、一个乐队标志,只要你能想到的——我都有能力为您提供创意和专业的产品。

单击下面的缩略图以快速浏览:

要安排报价,或者如果您只是想谈谈想法,请给我发电子邮件至:contact[at]angry-octopus.co.uk 或致电 (0789)694-3379


从条带输出(strtolower(html_entity_decode($contents_original)))

章鱼你好!

欢迎来到乔纳森米。爱德华兹的平面设计页面。

无论您需要设计什么——一个商业网站、一个乐队标志,只要你能想到的——我都有能力为您提供创意和专业的产品。

单击下面的缩略图以快速浏览:

要安排报价,或者如果您只是想谈谈想法,请给我发电子邮件至:contact[at]angry-octopus.co.uk 或致电 (0789)694-3379

^^^^^^^^^^^^^^ 以上所有内容均从记事本 .TXT 复制/粘贴。

4

2 回答 2

0

如果调用htmlentities(),字符串可能会因为字符转换而变长。或者更短,因为您还使用stripslashes(). (谢谢豪尔赫)

于 2012-05-08T20:57:19.757 回答
0

是数据库中的数据多字节,

如果数据是 unicode(多字节),则普通的 strlen 函数无法正常工作,因为它们会将字符串计为单字节

您可以尝试使用该功能:

mb_strlen (strtolower($contents_original)) )

http://www.php.net/manual/en/ref.mbstring.php

于 2012-05-08T21:06:10.687 回答