Cakephp 笔记

1. 自定义 layout

在 cakephp 中 layout 默认指向 /app/views/layouts/default.thtml

如果要自定义 layout,需要在 controller 中定义:

var $layout = 'mydefault';

layout 则指向了 /app/views/layouts/mydefault.thtml

  1. 创建不使用数据库表的 model 或者改变 model 对应的表名

我需要创建一个不使用任何表的model。例如,我想通过 $validate 数组方便底验证输入数据,保持model逻辑的正确性。但创建 model 时对应的表不存在,CakePHP 就会报错。通过在 model 中加入以下代码可以解决这个问题:

var $useTable = false;

你也可以通过这种方法改变model对应的表名。

var $useTable = 'some_table';

  1. 快速创建后台管理

如果你需要创建后台管理程序,并且希望所有管理action都位于某个特定文件夹下,那么打开 config/core.php 并将下面这一行的注释去掉:

define('CAKE_ADMIN', 'admin');

这样所有以"admin_"开头的action都可以通过 /admin/yourcontroller/youraction 来访问。例如,如果在 posts controller 中创建了名为 "admin_add" 的 action,那么可以通过 www.example.com/admin/posts/add 访问这个action。这样就可以方便地为 admin 目录设置密码以避免他人随意访问。

  1. 自定义404页面

如果你需要自定义404页面,只需创建 /app/views/errors/error404.thtml。

  1. 让controller使用其他model

如果你的controller需要调用来自不同model的数据,只要在controller开头使用如下代码:

class yourController extends AppController {
    var $uses = array('Post','User');
}

这样controller就能访问Post和User model了。

2007-11-13 194 cakephp framework php 笔记

PHP 和 Mysql 学习笔记(四)

1. 如何禁用 select 下拉列表中的某一项

<select>
<option  selected>——请选择——</option> 
<optgroup  label="分类一"> 
<option>——子类一</option> 
<option>——子类二</option> 
</optgroup> 
<optgroup  label="分类二"> 
<option>——子类一</option> 
<option>——子类二</option> 
</optgroup> 
</select>

2. EMS SQL Manager中文显示乱码

打开EMS SQL Manager点击那个数据库出现了许多属性

选择database registration info中有一个client charset

选择gb2312简体中文

3. Mysql 乱码

MySQL数据库字符集为utf8

并且网页通过UTF-8编码发送

这时存入数据库的仍然是乱码

需要做以下设置:

@mysql_connect($dbhost,$dbuser,$dbpassword);

加上下面这行

$this->query("SET NAMES 'utf8'");

在每次发送sql查询前设定字符集为utf-8

  1. 正则表达式

Email匹配

if(!preg_match("/\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/",$email))
{
    echo "邮件格式不正确";
}
  1. PHP5中时间相差八小时的解决办法
date_default_timezone_set('Asia/Shanghai');
echo date('Y-m-d H:i:s');
  1. PHP防止SQL注入攻击的简单方法

    1.修改PHP的配置文件 php.ini ,将display_errors的值设为Off,这样保证PHP脚本在出错之后不会在页面中显示错误信息。

    2.在Mysql函数前加错误抑制符 @ ,避免输出mysql错误。

    3.对所有用户输入的数据进行转义并进行类型检查。

  2. 返回GD函数版本号

function gd_version() {
    if (function_exists('gd_info')) {
        $GDArray = gd_info();
        $gd_version_number = $GDArray['GD Version'] ? $GDArray['GD Version'] : 0;
        unset($GDArray);
    } else {
        $gd_version_number = 0;
    }
    return $gd_version_number;
}
  1. 获得用户的真实IP地址
function realip()
{
    static $realip = NULL;
    if ($realip !== NULL)
    {
        return $realip;
    }

    if (isset($_SERVER))
    {
        if (isset($_SERVER['HTTP_X_FORWARDED_FOR']))
        {
            $arr = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
            /* 取X-Forwarded-For中第一个非unknown的有效IP字符串 */
            foreach ($arr AS $ip)
            {
                $ip = trim($ip);
                if ($ip != 'unknown')
                {
                    $realip = $ip;
                    break;
                }
            }
        }
        elseif (isset($_SERVER['HTTP_CLIENT_IP']))
        {
            $realip = $_SERVER['HTTP_CLIENT_IP'];
        }
        else
        {
            if (isset($_SERVER['REMOTE_ADDR']))
            {
                $realip = $_SERVER['REMOTE_ADDR'];
            }
            else
            {
                $realip = '0.0.0.0';
            }
        }
    }
    else
    {
        if (getenv('HTTP_X_FORWARDED_FOR'))
        {
            $realip = getenv('HTTP_X_FORWARDED_FOR');
        }
        elseif (getenv('HTTP_CLIENT_IP'))
        {
            $realip = getenv('HTTP_CLIENT_IP');
        }
        else
        {
            $realip = getenv('REMOTE_ADDR');
        }
    }

    preg_match("/[\d\.]{7,15}/", $realip, $onlineip);
    $realip = !empty($onlineip[0]) ? $onlineip[0] : '0.0.0.0';
    return $realip;
}
  1. 连接多个ID,以便创建像这样的查询: "IN('a','b')";
function implode_ids($array){
    $ids = $comma = '';
    if (is_array($array) && count($array)){
        foreach($array as $id) {
            $ids .= "$comma'".intval($id)."'";
            $comma = ', ';
        }
    }
    return $ids;
}
2007-09-07 192 mysql php 笔记

PHP 和 Mysql 学习笔记(三)

1. mysql 定界符(反引号`)

当标示符是一个受限的词或包含特殊的字符时使用

select * from `select` where `select`.id >100;
create table orders(`my orders` varchar(100)...);

2. 数据库的大小写

linux下的数据库和表名的大小写是敏感的

其他的数据库对象不区分大小写

3. mysql 分组语句和嵌套子查询

员工表 emp( empno, name, tel, deptno, sal )

部门表 dept( deptno, dname, addr )

显示每个部门收入最高的职工信息

select * from emp
where sal in (
    select max(sal)
    from emp
    group by deptno
);

4. mysql 查询排序 ( SQL Order By )

SELECT "栏位名"

FROM "表格名"

WHERE "条件"

ORDER BY "栏位名" [ASC, DESC]

ASC 代表结果会以由小往大的顺序列出,而 DESC 代表结果会以由大往小的顺序列出,默认值为 ASC。

我们可以照好几个不同的栏位来排顺序。在这个情况下, ORDER BY 子句的语法如下(假设有两个栏位):

ORDER BY "栏位一" [ASC, DESC], "栏位二" [ASC, DESC]

若我们对这两个栏位都选择由小往大的话,那这个子句就会造成结果是依据 "栏位一" 由小往大排。若有好几笔资料 "栏位一" 的值相等,那这几笔资料就依据 "栏位二" 由小往大排。

5. mysql limit 子句

数据表同3,查询薪水最低的5名员工。

select * from emp order by sal limit 0, 5;

返回值从第一行开始(第一行偏移量为0)可简写为:

select * from emp order by sal limit 5;

查询3-7号员工信息:

select * from emp limit 2, 5;

这里的 limit 子句是 mysql 特有的,是大多数其他的关系型数据库所没有的。

6. mysql 数据表关联

双表关联

数据表同3,查询某个部门的职工号,姓名:

select emp.empno, emp.name dept.dname
from emp, dept
where dept.name = '软件部'
and emp.deptno = dept.deptno;

多表关联

举例在线书店数据库

客户表 customers (customerid, name, address, city)

定单表 orders (orderid, customerid, amount, date)

书籍表 books (isbn, author, title, price)

订单与图书关联的表 book_items (orderid, isbn, quantity)

查询至少定购了一本关于 java 的书籍的顾客:

select customers.name
from customers, orders, order_items, books
where customers.customerid = order.customerid
and orders.orderid = order_items.orderid
and order_items.isbn = books.isbn
and books.title like '%java%';

在这里同样可以使用表的别名(alias),以上可改写为:

select c.name
from customers as c, orders as o, order_items as oi, books as b
where c.customerid = o.customerid
and o.orderid = oi.orderid
and oi.isbn = b.isbn
and b.title like '%java%';

查找不匹配行,这里查找没有订购任何商品的顾客:

select customers.customerid, customers.name
from customers left join orders
using (customerid)
where orders.orderid is null

这里使用了一个左关联将 customers 表和 orders 表关联起来,如果右边的表中没有匹配行就在结果中加一行,该行右边的列为 null,在这里关联条件所使用的语法一种是上面的 using,它并不需要指定连接属性所来自的表,所以要使用 using 子句,两个表中的列必须有同样的名称,另外还有一个关联条件的语法是 on,它需要指定连接属性所来自的表:

....

on customers.customerid = orders.customerid

....

A left join(左连接)包含所有的左边表中的记录甚至是右边表中没有和它匹配的记录。

同理,也存在着相同道理的 right join(右连接),即包含所有的右边表中的记录甚至是左边表中没有和它匹配的记录。

而full join(全连接)顾名思义,左右表中所有记录都会选出来。

2007-07-27 186 mysql SQL 笔记