addFieldToFilter 与 addAttributeToFilter使用总结

magento初学者在开发过程中,对addFieldToFilter和addAttributeToFilter的使用会比较迷惑,例如你在一个自定 义模块中,在引用自己的table时,假如使用了addAttributeToFilter这个function,可能就会报错。
简单分析下原因:
我们在自定义模块里的collection类,因为没有涉及到EAV模型,一般都是继承 Mage_Core_Model_Mysql4_Collection_Abstract这个类,而在 Mage_Core_Model_Mysql4_Collection_Abstract(继承自Varien_Data_Collection_Db包 含很多常用function)和它的父类里,是没有addAttributeToFilter这个function的,如果一定要使用 addAttributeToFilter可以在collection加上如下function(或者改变collection的继承关系):
   

    public function addAttributeToFilter($attribute, $condition = null)
    {
        $this->addFieldToFilter($this->_attributeToField($attribute), $condition);
        return $this;
    }

    /**
     * Check if $attribute is Mage_Eav_Model_Entity_Attribute and convert to string field name
     *
     * @param string|Mage_Eav_Model_Entity_Attribute $attribute
     * @return string
     */
    protected function _attributeToField($attribute)
    {
        $field = false;
        if (is_string($attribute)) {
            $field = $attribute;
        } elseif ($attribute instanceof Mage_Eav_Model_Entity_Attribute) {
            $field = $attribute->getAttributeCode();
        }
        if (!$field) {
            Mage::throwException(Mage::helper('yourmode')->__('Cannot determine the field name.'));
        }
        return $field;
    }

magento自带的模块涉及到EAV模型的collection最终都是继承自 Mage_Eav_Model_Entity_Collection_Abstract,如catalog,customer模块等,这个类定义了很多有 用的function,包括addAttributeToFilter等,读者可自行去深入了解。
总结:addFieldToFilter基本上是addAttributeToFilter的别名,很多时候能通用;对用自定义的模块,一般使用 addFieldToFilter就能满足需求。对于EAV模型,大多都是系统自带模块,addAttributeToFilter就显得很有用。

Linux下查看mysql、apache是否安装,并卸载。

指令 ps -ef|grep mysql 得出结果

    root     17659     1  0  2011 ?        00:00:00 /bin/sh /usr/bin/mysqld_safe –datadir=/var/lib/mysql –socket=/var/lib/mysql/mysql.sock –log-error=/var/log/mysqld.log –pid-file=/var/run/mysqld/mysqld.pid   
    mysql    17719 17659  0  2011 ?        03:14:57 /usr/libexec/mysqld –basedir=/usr –datadir=/var/lib/mysql –user=mysql –pid-file=/var/run/mysqld/mysqld.pid –skip-external-locking –socket=/var/lib/mysql/mysql.sock  

usr/bin/mysql 是指:mysql的运行路径
var/lib/mysql 是指:mysql数据库文件的存放路径
usr/lib/mysql 是指:mysql的安装路径

1,mysql 的守护进程是mysqld

如果已经安装则:

[root@localhost ~]# service mysqld start
启动 MySQL:                                               [确定]

如果没有安装则:

[root@localhost ~]# service mysqld start
mysqld:未被识别的服务

你可以看看你的服务是否已经添加到linux上

[root@localhost ~]# chkconfig –list mysqld
mysqld          0:关闭  1:关闭  2:关闭  3:关闭  4:关闭  5:启用  6:关闭

没有安装则:
[root@localhost ~]# chkconfig –list mysqld
在mysqld服务中读取信息时出错,没有那个文件或目录

一旦你启动了服务,可以这样检查服务器是否在运行

[root@localhost ~]# ps -el | grep mysqld
4 S     0  1796     1  0  85   0 –  1513 wait   ?        00:00:00 mysqld_safe
4 S    27  1856  1796  0  78   0 – 34055 –      ?        00:00:00 mysqld
[root@localhost ~]#
如果你看到有,就说明服务器安装起来了~~

linux下查看apache是否安装及版本

如通是通过rpm包安装的话直接用下面的命令:
rpm -q httpd

也可以使用如下两种方法:
httpd   -v

apachectl   -v

linux下卸载mysql方法

a. 查找已安装的myslq 版本:
#rpm  -qa | grep  mysql (注意大小写,如果mysql 不行就换MySQL)

显示:
[root@localhost ~]# rpm  -qa | grep  mysql
mysql-5.0.77-4.el5_4.2
mysql-server-5.0.77-4.el5_4.2
php-mysql-5.2.13-1.el5.art
复制代码
在屏幕上将显示已安装的mysql包名如:mysql-5.0.77-4.el5_4.2 ;

将搜索出的包名卸载:

#rpm -e  –nodeps mysql-5.0.77-4.el5_4.2  (nodeps表示强制删除)

提示
error: package –nodeps is not installed
error: package mysql-.0.77-4.e15_.2 is not installed

Linux查看mysql 安装路径

一、查看文件安装路径

由于软件安装的地方不止一个地方,所有先说查看文件安装的所有路径(地址)。

这里以mysql为例。比如说我安装了mysql,但是不知道文件都安装在哪些地方、放在哪些文件夹里,可以用下面的命令查看所有的文件路径
在终端输入:

whereis mysql

回车,如果你安装好了mysql,就会显示文件安装的地址,例如我的显示(安装地址可能会不同)

[root@localhost ~]# whereis mysql
mysql: /usr/bin/mysql /usr/lib/mysql /usr/share/mysql /usr/share/man/man1/mysql.1.gz

二、查询运行文件所在路径(文件夹地址)

如果你只要查询文件的运行文件所在地址,直接用下面的命令就可以了(还是以mysql为例):

which mysql

终端显示:

[root@localhost ~]# which mysql
/usr/bin/mysql

零宽断言详解

零宽断言的意思是(匹配宽度为零,满足一定的条件/断言) 我也不知道这个词语是那个王八蛋发明的,简直是太拗口了。

零宽断言用于查找在某些内容(但并不包括这些内容)之前或之后的东西,也就是说它们像 \b ^ $ \< \> 这样的锚定作用,用于指定一个位置,这个位置应该满足一定的条件(即断言),因此它们也被称为零宽断言。 断言用来声明一个应该为真的事实。正则表达式中只有当断言为真时才会继续进行匹配。

其中零宽断言又分四种:
1)
先行断言   也叫零宽度正预测先行断言(?=exp)   —  表示匹配表达式前面的位置

例如 [a-z]*(?=ing) 可以匹配 cooking 和 singing 中的 cook 与 sing 。

注意:先行断言的执行步骤是这样的先从要匹配的字符串中的最右端找到第一个 ing (也就是先行断言中的表达式)然后 再匹配其前面的表达式,若无法匹配则继续查找第二个 ing 再匹配第二个 ing 前面的字符串,若能匹配则匹配,符合正则的贪婪性。

例如: .*(?=ing) 可以匹配 "cooking singing" 中的 "cooking sing" 而不是 cook

2)
后发断言   也叫零宽度正回顾后发断言(?<=exp)  —  表示匹配表达式后面的位置

例如(?<=abc).* 可以匹配 abcdefg 中的 defg

注意:后发断言跟先行断言恰恰相反 它的执行步骤是这样的:先从要匹配的字符串中的最左端找到第一个abc(也就是先行断言中的表达式)然后 再匹配其后面的表达式,若无法匹配则继续查找第二个 abc 再匹配第二个 abc 后面的字符串,若能匹配则匹配。

例如(?<=abc).* 可以匹配 abcdefgabc 中的 defgabc 而不是 abcdefg

3)
负向零宽断言

负向零宽断言 (?!exp) 也是匹配一个零宽度的位置,不过这个位置的“断言”取表达式的反值,例如 (?!exp) 表示 "exp" 前面的位置,如果 "exp" 不成立 ,匹配这个位置;如果 "exp" 成立,则不匹配。同样,负向零宽断言也有“先行”和“后发”两种,负向零宽后发断言为 (?<!exp)

负向零宽后发断言(?<!exp)

负向零宽先行断言 (?!exp)

负向零宽断言要注意的跟正向的一样。

常用分组语法
分类 代码/语法 说明
捕获 (exp) 匹配exp,并捕获文本到自动命名的组里
(?<name>exp) 匹配exp,并捕获文本到名称为name的组里,也可以写成(?'name'exp)
(?:exp) 匹配exp,不捕获匹配的文本,也不给此分组分配组号
零宽断言 (?=exp) 匹配exp前面的位置
(?<=exp) 匹配exp后面的位置
(?!exp) 匹配后面跟的不是exp的位置
(?<!exp) 匹配前面不是exp的位置
注释 (?#comment) 这种类型的分组不对正则表达式的处理产生任何影响,用于提供注释让人阅读

例子:

cat file
aaa bbb CD="123" fd

要取出CD后面的值:

    grep -oP '(?<=CD=")\d+' file

[解析]
以 CD=" 为后发断言,匹配它后面的多个数字。

cat file
Rx Optical Power: -5.01dBm, Tx Optical Power: -2.41dBm

要取出那几个分贝的值:
-5.01
-2.41

    grep -oP '(?<=: ).*?(?=d)' file

[解析]
后发断言 ”: “ 后面的字符串,直到 d 字符前面的字符串,? 号的作用是避免贪婪匹配。

cat file
["check_ssh",ok],["check_eth",ok],["check_disk",ok],["check_swap",ok],["check_mem",ok],["check_hardware",false],["check_filesystem",false],["check_port",ok],["check_redis-server",ok],["check_login",ok]
取出[ ]中含 false 字样的内容:
check_hardware
check_filesystem

    grep -Po '[^"]+(?=",false)'  file