lamp 相关配置 [Debian]

转载时请标明文章原始出处和作者信息, 作者: lostsnow.
http://www.lsproc.com/blog/configure_lamp/

编译环境

Debian (Ubuntu)

apt-get install build-essential
apt-get install libncurses5-dev
sudo apt-get install libxml2-dev libcurl3-dev libpng-dev libmhash-dev libmcrypt-dev libxslt-dev libpspell-dev

Mysql编译安装参数

CHOST="i686-pc-linux-gnu" CFLAGS="-O3 -msse2 -mmmx -mfpmath=sse -mcpu=pentium4 -march=pentium4 -pipe -fomit-frame-pointer" CXXFLAGS="-O3 -msse2 -mmmx -mfpmath=sse -funroll-loops -mcpu=pentium4 -march=pentium4 -pipe -fomit-frame-pointer" ./configure --prefix=/usr/local/mysql --localstatedir=/var/lib/mysql --with-comment=Source --with-server-suffix=-Community-Server --with-mysqld-user=mysql --without-debug --with-big-tables --with-charset=utf8 --with-collation=utf8_general_ci --with-extra-charsets=all --with-pthread --enable-static --enable-thread-safe-client --with-client-ldflags=-all-static --with-mysqld-ldflags=-all-static --enable-assembler --without-ndb-debug --without-isam --with-unix-socket-path=/usr/local/mysql/tmp/mysql.sock

配置成功会提示:

MySQL has a Web site athttp://www.mysql.com/which carries details on the
latest release, upcoming features, and other information to make your
work or play with MySQL more productive. There you can also find
information about mailing lists for MySQL discussion.

Remember to check the platform. specific part of the reference manual for
hints about installing MySQL on your platform. Also have a look at the
files in the Docs directory.

Thank you for choosing MySQL!

make
make install

groupadd mysql                     //增加mysql组
useradd -g mysql mysql         //增加mysql用户,这个用户属于mysql组
cd /usr/local/mysql
bin/mysql_install_db --user=mysql
chown -R root:mysql . //设置权限,注意后面有一个 "."
chown -R mysql /var/lib/mysql //设置 mysql 目录权限
chgrp -R mysql . //注意后面有一个 "."
cp share/mysql/my-medium.cnf /etc/my.cnf
cp share/mysql/mysql.server /etc/init.d/mysqld //开机自动启动 mysql。
chmod 755 /etc/init.d/mysqld
rcconf    //开启启动服务设置
/etc/init.d/mysqld start //启动 MySQL
bin/mysqladmin -u root password "password_for_root"

查看mysql编译参数
cat /usr/local/mysql/bin/mysqlbug |grep ./configure

把 mysql 加入环境变量
export PATH="$PATH:/usr/local/mysql/bin"

apache 编译

./configure   //配置源代码树
--prefix=/usr/local/apache2  //体系无关文件的顶级安装目录PREFIX ,也就Apache的安装目录。
--enable-module=so   //打开 so 模块,so 模块是用来提 DSO 支持的 apache 核心模块
--enable-deflate=shared   //支持网页压缩
--enable-expires=shared   //支持 HTTP 控制
--enable-rewrite=shared   //支持 URL 重写
--enable-cache  //支持缓存
--enable-file-cache  //支持文件缓存
--enable-mem-cache  //支持记忆缓存
--enable-disk-cache //支持磁盘缓存
--enable-static-support   //支持静态连接(默认为动态连接)
--enable-static-htpasswd   //使用静态连接编译 htpasswd - 管理用于基本认证的用户文件
--enable-static-htdigest  //使用静态连接编译 htdigest - 管理用于摘要认证的用户文件
--enable-static-rotatelogs  //使用静态连接编译 rotatelogs - 滚动 Apache 日志的管道日志程序
--enable-static-logresolve   //使用静态连接编译 logresolve - 解析 Apache 日志中的IP地址为主机名
--enable-static-htdbm   //使用静态连接编译 htdbm - 操作 DBM 密码数据库
--enable-static-ab  //使用静态连接编译 ab - Apache HTTP 服务器性能测试工具
--enable-static-checkgid   //使用静态连接编译 checkgid
--disable-cgid  //禁止用一个外部 CGI 守护进程执行CGI脚本
--disable-cgi   //禁止编译 CGI 版本的 PHP
--disable-userdir  //禁止用户从自己的主目录中提供页面
--with-mpm=worker // 让apache以worker方式运行
--enable-authn-dbm=shared // 对动态数据库进行操作。Rewrite时需要。

make
make install

建立一个符号连接:

ln -s /usr/local/apache2/bin/apachectl /etc/init.d/httpd
rcconf    //加入自动启动

php 编译

CHOST="i686-pc-linux-gnu" CFLAGS="-O3 -msse2 -mmmx -mfpmath=sse -mcpu=pentium4 -march=pentium4 -pipe -fomit-frame-pointer" CXXFLAGS="-O3 -msse2 -mmmx -mfpmath=sse -funroll-loops -mcpu=pentium4 -march=pentium4 -pipe -fomit-frame-pointer" ./configure --prefix=/usr/local/php5 --with-mysql=/usr/local/mysql --with-gd --enable-calendar --with-zlib --with-curl --with-mysqli=/usr/local/mysql/bin/mysql_config --enable-mbstring --with-apxs2=/usr/local/apache2/bin/apxs --with-openssl --enable-zend-multibyte --with-gettext --with-mcrypt --enable-exif --with-png-dir=/usr/local/lib --enable-ftp --with-mhash --with-libxml-dir=/usr/local/lib --with-xsl --with-pspell

配置完成提示
+--------------------------------------------------------------------+
| License: |
| This software is subject to the PHP License, available in this |
| distribution in the file LICENSE. By continuing this installation |
| process, you are bound by the terms of this license agreement. |
| If you do not agree with the terms of this license, you must abort |
| the installation process at this point. |
+--------------------------------------------------------------------+

Thank you for using PHP.

make
make install

修改/usr/local/apache2/conf/httpd.conf,在AddType部分加入如下内容
AddType application/x-httpd-php .php

-- EOF --

MySQL导出导入命令的用例

转载时请标明文章原始出处和作者信息, 作者: lostsnow.
http://www.lsproc.com/blog/mysql_export_and_import/

1.导出整个数据库
mysqldump -u 用户名 -p 数据库名 > 导出的文件名
mysqldump -u dbuser -p dbname > dbname.sql

2.导出一个表
mysqldump -u 用户名 -p 数据库名 表名> 导出的文件名
mysqldump -u dbuser -p dbname users> dbname_users.sql

3.导出一个数据库结构
mysqldump -u dbuser -p -d --add-drop-table dbname >d:\dbname_db.sql
-d 没有数据 --add-drop-table 在每个create语句之前增加一个drop table

4.导入数据库
常用source 命令
进入mysql数据库控制台,如
mysql -u root -p
mysql>use 数据库

然后使用source命令,后面参数为脚本文件(如这里用到的.sql)
mysql>source d:\dbname.sql

-- EOF --

PHP 和 Mysql 学习笔记(四)

转载时请标明文章原始出处和作者信息, 作者: lostsnow.
http://www.lsproc.com/blog/php_mysql_study_4/

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

4. 正则表达式

Email匹配
if(!preg_match("/\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/",$email))
{
echo "邮件格式不正确";
}

5. PHP5中时间相差八小时的解决办法

<?php
date_default_timezone_set('Asia/Shanghai');
echo date('Y-m-d H:i:s');
?>

6. PHP防止SQL注入攻击的简单方法

1.修改PHP的配置文件 php.ini ,将display_errors的值设为Off,这样保证PHP脚本在出错之后不会在页面中显示错误信息。
2.在Mysql函数前加错误抑制符 @ ,避免输出mysql错误。
3.对所有用户输入的数据进行转义并进行类型检查。

7. 返回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;
}

8. 获得用户的真实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;
}

9. 连接多个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;
}

-- EOF --

PHP 和 Mysql 学习笔记(三)

转载时请标明文章原始出处和作者信息, 作者: lostsnow.
http://www.lsproc.com/blog/php_mysql_study_3/

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(全连接)顾名思义,左右表中所有记录都会选出来。

-- EOF --

PHP 和 Mysql 学习笔记(二)

转载时请标明文章原始出处和作者信息, 作者: lostsnow.
http://www.lsproc.com/blog/php_mysql_study_2/

1. 值参和变参
值参:

<?php
	function swap($a, $b) {
		$temp = $a;
		$a = $b;
		$b = $temp;
	}
	$x = 100;
	$y = 1;
	swap($x, $y);
	echo "x = $x<br />y = $y";
?>

输出结果为:

x = 100
y = 1

这里 $x, $y 只是一个值的拷贝

变参:

<?php
	function swap(&$a, &$b) {
		$temp = $a;
		$a = $b;
		$b = $temp;
	}
	$x = 100;
	$y = 1;
	swap($x, $y);
	echo "x = $x<br />y = $y";
?>

输出结果为:

x = 1
y = 100

2. 连接 mysql
格式: mysql -h主机地址 -u用户名 -p用户密码

mysql -uroot -p
mysql -h100.100.100.100 -uroot -p

-h -u和后面都没有空格
选定数据库mysql
use mysql;

3. mysql 指令
显示数据库列表
show databases;
显示数据库中的表
show tables;
显示数据表的结构
describe 表名
简写为
desc 表名

4. SQL(Structured Query Language,结构查询语言)

SQL功能强大,但是概括起来,它可以分成以下几组:

DML(Data Manipulation Language,数据操作语言):用于检索或者修改数据;

SELECT:用于检索数据;
INSERT:用于增加数据到数据库;
UPDATE:用于从数据库中修改现存的数据
DELETE:用于从数据库中删除数据。

DDL(Data Definition Language,数据定义语言): 用于定义数据的结构,比如 创建、修改或者删除数据库对象;

CREATE TABLE
ALTER TABLE
DROP TABLE
CREATE INDEX
DROP INDEX

DCL(Data Control Language,数据控制语言):用于定义数据库用户的权限。DCL命令用于创建关系用户访问以及授权的对象。下面是几个DCL命令:

ALTER PASSWORD
GRANT
REVOKE
CREATE SYNONYM

举例:

create database school;	--建立数据库
drop database school;	/* 删除数据库 */
drop database if exists school;	#如果存在数据库school则删除

这里3种注释方式 "--","#"和"/* ... */"

统计记录数:
select count(*) from table;

-- EOF --