Magento错误 - Notice: Undefined index:***app\code\core\Mage\Core\Model\Mysql4\Config.php on line 92的解决办法

今天拷站架Magento
站,又碰到了这种错:

a:4:{i:0;s:116:"Notice: Undefined index
:  0  in ***\app\code\core\Mage\Core\Model\Mysql4\Config.php on line 92
";i:1;s:681:"#0 ***\app\code\core\Mage\Core\Model\Mysql4\Config.php(92): mageCoreErrorHandler(8, 'Undefined index...', 'D:\chen\www\mym...', 92, Array)
#1 ***\app\code\core\Mage\Core\Model\Config.php(344): Mage_Core_Model_Mysql4_Config->loadToXml(Object(Mage_Core_Model_Config))

好吧,抽时间总结一下。。

问题原因

Mysql使用工具
(如PhpMyAdmin / MySQL-Front / Navicat for MySQL / SQLyogEnt等)重载转储文件(也就是重导.sql文件)的时候,默认在执行过程中遇到0值一般会生成新的序列号。

Magento的core_store表的admin的store_id为0;core_store_group表的Default的group_id也为0。

在导入.sql文件的时候,原本的0变成了新的序列号,破坏了Magento原有的数据。

解决办法

1,

执行一遍下面语句。
SET FOREIGN_KEY_CHECKS=0;
update `core_store` set store_id = 0 where code='admin';
update `core_store_group` set group_id = 0 where name='Default';
update `core_website` set website_id = 0 where code='admin';
update `customer_group` set customer_group_id = 0 where customer_group_code='NOT LOGGED IN';
SET FOREIGN_KEY_CHECKS=1;

2,

在导的.sql文件最前面加入:SET SQL_MODE = NO_AUTO_VALUE_ON_ZERO;

补充,

Mysql的模式:NO_AUTO_VALUE_ON_ZERO
这个项影响
AUTO_INCREMENT
列的处理。
正常情况下,当我们向
AUTO_INCREMENT
列插入0或NULL的时候,会产生下一个序列号。
而mode = NO_AUTO_VALUE_ON_ZERO的时候,只有NULL才产生新的序列号,屏蔽了0。

如此,像遇到Magento报错 - Notice: Undefined index :  \app\code\core\Mage\Core\Model\Mysql4\Config.php on line 92
这种问题就解决了。

Magento错误 - 缓存不足的解决方法

在货品处或者其他部分页面出现了一下几种错误提示:

Fatal error: Allowed memory size of 33554432 bytes exhausted (tried to allocate 30720 bytes) in /home/XXXXX/public_html/lib/Varien/Io/File.php on line 361

Fatal error: Allowed memory size of 33554432 bytes exhausted (tried to allocate 72897 bytes) in /home/XXXXX/public_html/lib/Varien/Image/Adapter/Gd2.php on line 155

Fatal error: Allowed memory size of 33554432 bytes exhausted (tried to allocate 122880 bytes) in /home/XXXXX/public_html/lib/Varien/Image/Adapter/Gd2.php on line 332

这些报错乃是缓存不足导致,只要将缓存设置大一点就ok啦。

修改根目录下的,php.ini
.htaccess
文件里的memory_limit = 64M项,改为memory_limit = 128M.保存后上传覆盖。

到这个步骤后看看问题是否解决。

如是Magento系统如问题依旧。到Magento后台的缓存设置里勾选缓存选项下的:

【设置,布局,区块 HTML 输出,翻译,集合(Collections)数据,EAV 类型与属性以及,网络服务配置选项。】

到此问题就应该解决了。

如果你的问题非常的顽固。有的模版还会在页面的最底部出现报错信息。

甚至有网页打开报错,或是直接是空白。找到根目录下的 index.php 修改如下:

require_once $mageFilename;

#Varien_Profiler::enable();

#Mage::setIsDeveloperMode(true);

#ini_set(’display_errors’, 1);

ini_set(“memory_limit”,”128M”); <——————————————— 在此加入这一行。

umask(0);

Mage::run();

至此问题99%解决。

解决magento1.4.0.1使用gspay接口用ie8浏览器报错不能跳转的问题

目前公司站群magentog使用spay支付接口有两大大问题还未解决:

1. 初次注册用户下单不能采集用户信息到支付页面

2. 用ie8或ie系列浏览器使用gspay支付接口下单的时候,在跳转页面会报错:Notice: Undefined index:  HTTP_REFERER  in /app/code/local/Mage/Gspay/Block/Standard/Redirect.php on line 97

第一个问题尚在研究,第二个问题在下午闲下来的时候给解决了

起因:magento1.4.0.1 在下单页面选择gspay付款方式的时候,在跳转页面/Gspay/standard/redirect/
如果使用的是ie系列浏览器,会出现notice级别的错误:Notice: Undefined index:  HTTP_REFERER  in /app/code/local/Mage/Gspay/Block/Standard/Redirect.php on line 97

跟踪代码发现在app/code/local/Mage/Gspay/Block/Standard/Redirect.php 第97行gspay获取url并解析是采用:$host=parse_url($_SERVER['HTTP_REFERER']);这样的方式,这样在火狐完全可以正常,但用ie8的时候就取不到HTTP_REFERER
的值了(貌似是bug),最后动手完善代码,经测试正常可用!

把第97行的$host=parse_url($_SERVER['HTTP_REFERER']);替换成如下代码:

$http    = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') ? 'https' : 'http';
if( empty($_SERVER['HTTP_REFERER']) ){
    $host    = array(
            'scheme'    => $http,
            'host'        => $_SERVER['HTTP_HOST']
        );
}else{
    $host    = parse_url($_SERVER['HTTP_REFERER']);
}

留此帮助其他遇到相同情况的朋友,嘿嘿·~

mysql数据库解除外键

magento的数据库导入导出要处理外键的问题。

经过测试,只要加上这段话便可顺利解除外键。

头部
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;


尾巴
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

mysql数据库解除外键
方法二

强制关闭相关的数据库关键字关系:

SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT;
SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS;
SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION;
SET NAMES utf8;
SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO';
SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0;

恢复相关的数据库关键字关系:
SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT;
SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS;
SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION;
SET SQL_NOTES=@OLD_SQL_NOTES;

mysql数据库解除外键这两种方法都OK。

值得学习的一些习惯

 

1.长期的任务,要尽早开始

一般来说,长期任务总是比较烦人,也有难度,而人心里总有逃避困难的趋势,最后的结果或者是最后干脆放弃,或者是剩下一点点时间手忙脚乱地赶工;我自己之前也有这样的教训,自欺欺人地说“要轻松生活,抛开烦扰”,到最后几天才着急办理,搞得狼狈不堪。
后来,我发现这做法其实是事与愿违的,如果调整好心理状态,尽早了解情况并不必然带来的心理压力,反而因为时间充裕,有信心把握进度,即便中间遇到突发的问题,也留有时间解决;更重要的是,尽早着手,可以充分利用边角余料的时间:比如说,接到一份文档,需要在三天后给出意见,我一定会在当天大致浏览一遍,下面的三天里,就能在坐车、走路等等零碎的时间来思考,而且效果不错,如果没有尽早了解,这些时间就浪费了,什么有意义的事情也没干(阿基米德若不是之前遇到了问题,在澡盆里泡一万年也想不出办法检测皇冠的真伪)。
电子邮件的情况也是如此,我常看到有人讨论电子邮件是马上回好还是过一段再回好,我的经验是,收了电子邮件要尽快看,至少了解邮件里说了什么,如果不是着急的,等想清楚了再回。

2.时常想清楚自己正在做的事情

一般来说,我们做的工作总是有一个目的和意义的,但工作的形式又是非常具体的,忙起来往往就钻到死胡同里,忘记了真正的目的和意义,“想不清楚”自己真正要做什么了。前几天,我需要搭建一个演示环境,手上有两套方案A和B,方案A估计要半小时,方案B估计要一小时,于是我选择了方案A,可是动手之后才发现服务器缺乏一个必要的组件,于是先费劲添加好这个组件,再编译自己需要用到的软件,又发现在64位环境下会编译出错(以前我只在32位机器上编译过),上网查发现需要打一个补丁,于是又四处去寻找这个补丁……此时已经用掉一个多小时了,下面还不知道会有多少问题;我忽然想到,自己真正要做的无非是演示程序,解决打补丁、找软件之类的问题虽然很有意思,但其实从任务的角度考虑,是浪费时间,于是果断选择方案B,一小时后就顺利解决了。
据我观察,很多技术人员都热衷解决纯技术问题,温伯格称之为“hacking (神游)”;神游很好玩,容易上瘾,但我们都不是不食人间烟火的神人,要想真正做点事情,就不能放任神游。
关于这一条,还要补充一点:哪怕忙得昏天黑地,也不能没有头绪。工作的压力很大,忙得焦头烂额是常有的事情,许多人就在这种忙碌中失去了方向,往往忙了整天,下班了都不知道自己今天到底干了什么,有什么意义。我的经验是,越是这种时候,越要打起精神想想(虽然这样很难):自己究竟要干什么,目前的安排是不是可以做些调整……持续的思考,才会产生感悟,才能有改观,否则,有可能一直陷入“瞎忙”的境地而不能自拔。

 

3.给自己设定明确的时间点

我承认自己也喜欢玩,没事的时候上Twitter、看看论坛、聊聊天,确实很有意思,信息不断更新,总有自己感兴趣的东西冒出来,可是这样守在电脑前,大量的时间就浪费了,什么有意义的事情也没有做,即便做了,效率也很低——专注才能保证效率。摸索反思之后,我觉得比较合适的做法就是,给自己设定明确的时间点:比如现在八点二十,我可以告诉自己,上网玩二十分钟,八点四十开始学英语。因为有了明确的时间界限,反而会想在这二十分钟之内,尽可能高效地把自己感兴趣的内容都看了,而不会慢慢“浏览”;到设定的时间点,一定要令行禁止,专注地做之前决定的事情。
更重要的是,从小事开始给自己设定明确的时间点,对培养执行力很有好处——如果许多小事都能做到“说做就做”,慢慢的,复杂一些大一些的任务,也能够“说做就做”了,有惯性、也有信心去完成。

4.写日记

正规一点的网站,都有详细的访问日志(记录),即便不做数据挖掘,一旦网站的访问出现异常波动,就会在日志上体现出来,而且检查日志,可以发现问题所在;网站是这样,人也是这样。我从08年翻译温伯格的《技术领导之路》开始,也开始每天记日记,发现日记和网站的访问日志有相同的功能:比如我一般到公司都在8:35左右,前后误差不超过5分钟,但上周有几天都在9:00左右,检查日记,就可以发现这种变化,而且可以找出变化的原因——是早上做事的顺序改变了。而且,根据日记,我还可以观察评估这种变化的影响,是好是坏。
日记也可以不断提醒鞭策自己,有段时间我发现自己时常处于无事可干的状态,如果没有日记,我多半只觉得“这段时间总是无事可干”,但日记里会写下“今天是感觉无事可干的第八天了”,这样,对自己督促压力会大很多,动力也会强得多。
关于日记还要多说一点,我以前总不理解,记了多年日记的人,日记为什么那么简单?只记录哪天做了什么,附加一点简单评论,而没有太多抒情。我从翻译《技术领导之路》开始到现在记了一年多的日记,逐渐明白了,持续的日记就需要这样记录:当天的主要行为,加上一点评论和反思。日记不太适合作为抒情的载体,更合适的功能是真实记录生活的痕迹,用以分析、反思,然后自己才有可能提高。

5.培养预见能力

古话说“凡事,预则立,不预则废”,这是很对的。拿软件项目来说,尽管项目的开发时间很难预测,但有经验的技术人员往往能进行更准确的判断,这就是因为他们具有预见能力:能预见到开发中会遇到的问题,这样做出的安排,时间上更充裕(也就能保证效率),心理上也更有准备。
另一方面,我也亲眼见到许多技术人员,只管完成手上本阶段的任务就万事大吉,从来不去预见这些问题:自己的程序能够负载多大的规模和压力,超出这个负载能力,会出现怎样的问题,应该怎样解决,这个问题,照目前的发展速度,大概多久会出现……结果就是,等到问题真正出现了,手忙脚乱焦头烂额,“迭代开发”就成了“拆迁开发”——到某个时间点就要推倒全部重来过一次,质量无法保证不说,自己也累得苦不堪言。
软件行业有本名著叫《重构》,这本书的核心思想是,软件需要不停地重构,要不就会僵化(decay),如果仅仅满足于眼下没有问题,持续的重构也无从说起。

6.树立大局观

前些天有个朋友与我讨论跳槽的事情,眼下有两个选择,很难决定;我听了他的详细描述说,这样吧,你暂时不看薪水、职位这些,你这样想:十年,或者五年之后,你希望自己是个怎样的人,是怎样的生活状态?拿着这个答案来衡量你现在的两个选择,看看会怎样。结果,过会儿他就很痛快地做了决定。我想,这就是大局观的作用。
我自己也会遇到许多取舍、抉择的问题,比如我总觉得自己关于计算机的基础还不够扎实,我的英语还不够好,书也读得太少,我的照片拍的还不够好……于是想去补习基础、去学英语、去读书、去看大师的照片……做其中的任何一件,都会给人成就感,但人的时间和精力都是有限的,不可能兼顾;在需要做出选择的很多时候,我都会努力摆脱一本书、一门知识、一件事的局限,跳出来想一想,宏观看来自己现在究竟在怎样的状态,重要的任务是什么,将来希望做一个怎样的人……清楚了最迫切的需求,才可以从容抉择,即便放弃了一些看来还不错的机会也不可惜——况且,正如李笑来老师说的,诱惑许多时候是伪装成机会出现的,拿着大局观的照妖镜,许多诱惑才会显出原形。
大局观不仅对个人成长有用,对工作也有用:无论手头的事情多么细小、琐碎,思维总可以跳出工作的限制,尝试从更广的角度来看待自己所做的事情,到底有怎样的价值,应该如何改进;这样,自己的工作能够做得更好,与同事的配合也会更加默契。

7.在生活中细心观察

我每个周末要去麦德龙买购物一次,最开始的几周,我会选择不同的时间点去:早上八点,上午十一点,下午一点,下午四点……这样就能大概地知道,什么时候购物最省时间。这一点,光靠想是很难判断准确的,因为人多的时候有可能结帐窗口也多,人少的时候结帐窗口也少。有了这点了解,就可以妥善安排,尽量减少购物时排队的时间。此外,还可以知道停车场在不同时段的状况,下雨天,也可以选择合适的时段去购物,把车停在有遮挡的车位。
再比如,从家到公司的路不止一条,开始的时候我会尝试每一条路,看看是否拥堵,是否平坦,大概要花多少时间;如此,遇到各种情况,都可以迅速地选择相对来说最合适的路径;如果只走一条路,或者不留意观察,就不会了解这些情况,遇到情况也就没有这么多选择。

8.培养分寸感

分析事物,除了定性之外,还有定量,而且定量分析往往更有意义——世界上非此即彼、非黑即白的问题太少了。可惜,许多时候我们却不自觉地在用定性的思维看待世界,往往丧失了很多机会。
举个例子吧,《把时间当作朋友》里提到了一本传记《奇特的一生》,作者详细描述了苏联科学家柳比歇夫管理时间的做法——柳比歇夫每天对时间的把握可以精确到分钟,他每天认真记录自己花多少时间做多少事情:写作35分钟,读书50分钟…虽然“精确到像一座钟”,但传记作者也承认,自认为“还充实”的生活比起柳比歇夫,确实差了太多。我读《奇特的一生》感触很深,我也深知自己虽然无法做到柳比歇夫那么精确,但至少可以偷学一招半式,让自己的生活更有条理,效率更高。但是给一些朋友推荐时,我遇到的第一反应就是:生活那么精确,都成机器人了,多可怕!潜台词就是根本不想了解,不愿意了解。但我想说的是,认真了解柳比歇夫的生活,并不要求我们都像他那样做到极致,而只是提供一个机会借鉴他人的经验和生活习惯(如果不知道,连借鉴都无从说起),至于借鉴几分,这个分寸是可以也需要自己把握的。

我深以为,分寸感是非常重要的,它让我们淡定看待各种情况:看到不好的,提醒自己保持距离,看到好的,告诉自己努力借鉴,至少不要被拉大差距。这样才能坦然面对生活,找到自己所处的坐标。化用我喜欢的科学哲学家卡尔·波普的说法,我们的自我感觉良好,必须是建立在比较和判断的基础上的——越是了解这个世界,看得越多,知道的越多(当然也要把握、自我克制的越多),这种感觉才真正越“良好”(关起门来固步自封的“良好”,其实很脆弱很黯淡)。哲学家维特根斯坦在临终前说的话:“多幸福啊,我度过了美好的一生”。他说那句话,是有底气的。