MAC OS X环境下配置APACHE+PHP+MYSQL+PHPMYADMIN

本文为记录MAC OS X环境下配置APACHE+PHP+MYSQL+PHPMYADMIN的教程。飘易手里的mac系统是os x 10.9.5 ,由于需要在mac系统下配置php开发环境,特此记录下配置要点,留作备用,如果对您的配置也有帮助,那敢情是好的。    MAC OS X 10.9.5系统里已经自带了 apache  和 php ,只是默认没有启用,我们将他们启用即可。
APACHE的默认版本是 Apache/2.2.26 (Unix),php版本是PHP 5.4.30。    一、启用apache
在终端(Terminal)中输入 sudo apachectl start 即可启动apache。    apache常用命令:

启动 Apache: sudo apachectl start
关闭 Apache: sudo apachectl stop
重启 Apache:sudo apachectl restart
查看 Apache 版本:httpd -v  或者 apachectl -v

启动apache后,在浏览器中访问 http://localhost 或 http://127.0.0.1,如果出现“It works!”就表示运行正常。    OS X 中默认有两个目录可以直接运行你的 Web 程序,一个是系统级的 Web 根目录,一个是用户级的根目录。
注:以下 piaoyi 为用户名,需要按实际修改。
Apache系统级的根目录及对应网址是:
/Library/WebServer/Documents/   —-  http://localhost
用户级的根目录及对应网址是:
~/Sites  —–  http://localhost/~piaoyi/
~/Sites 也就是你用户目录下面的”站点”目录,在 OS X 中,这个目录可能没有,所以你需要手动建立一个同名目录。
建立方式很简单,直接在终端中运行:
sudo mkdir ~/Sites
比如我就把网站根目录放在我的用户根目录下的 php文件夹里:

MAC OS X环境下配置APACHE+PHP+MYSQL+PHPMYADMIN

使用系统自带的目录 /Library/WebServer/Documents/ 很不方便,因此可以修改为我们的用户目录,比如我的 php 文件夹,修改apache的配置文件  httpd.conf  (如果放在其他目录就需要配置复杂的权限,建议大家放在用户级的根目录里):
把 DocumentRoot “/Library/WebServer/Documents”
修改成:DocumentRoot “/Users/CCMAC/php”把 <Directory “/Library/WebServer/Documents”>
改成:<Directory “/Users/CCMAC/php”>然后再解决“You don’t have permission to access on this server“错误,查找:

<Directory />
Options FollowSymLinks
AllowOverride None
Order deny,allow
allow from all
</Directory>

改成:

<Directory />
Options FollowSymLinks
AllowOverride None
#Order deny,allow
#allow from all
</Directory>

  启用 虚拟主机配置文件
找到 #Include /private/etc/apache2/extra/httpd-vhosts.conf
删掉前面的注释符号 #
然后打开”/private/etc/apache2/extra/httpd-vhosts.conf“,把里面的2段示例代码 注释掉,添加我们自己的虚拟主机配置即可。    二、启用php    php为系统自带,我们只要手动打开即可:修改apache配置文件,用vim命令或编辑器都可以,打开:
/etc/apache2/httpd.conf
查找里面的的这行:#LoadModule php5_module libexec/apache2/libphp5.so
把前面的注释符号  #  删掉,保存文件并重启apache,此时php就已经启用了。    三、安装mysql
mysql MAX系统没有自带,需要自己安装。
你可以点击 http://dev.mysql.com/downloads/mysql/ 去官网下载 MySQL 的安装包。
国内用户从国外服务器下载mysql可能太慢,可以使用sohu提供的国内镜像点下载:http://mirrors.sohu.com/mysql/ 。
请下载 Mac OS X 10.9 (x86, 64-bit), DMG Archive  (如有更新版本,可下载)。飘易下载的时候,最新版是:(mysql-5.6.22-osx10.9-x86_64.dmg)。下载完DMG之后,双击安装后,mysql会随系统启动而自启动,进入「系统偏好设置」,在面板的最下面你会看到一个 MySQL 的设置项,点击它之后就可以管理MySQL的启动和停止。把mysqlmysqladmin这2个命令建立软链接到系统默认执行目录里/usr/bin 或 /bin 或 /usr/sbin 或 /sbin 里面

sudo ln -s /usr/local/mysql/bin/mysql /usr/bin/mysql
sudo ln -s /usr/local/mysql/bin/mysqladmin /usr/bin/mysqladmin

这样就可以在终端中比较简单地通过命令进行相应的操作,比如安装完毕之后MySQL的root默认密码为空,如果要设置密码可以在终端运行“mysqladmin -u root password “mysqlpassword””来设置,其中mysqlpassword即root的密码。    注意:这个时候在php程序里使用 127.0.0.1 连接mysql是可以正常使用的,但是如果我们使用 localhost 主机名来连接mysql,会出现无法连接mysql服务器的错误信息,需要我们手动修复下。    错误原因:
PHP默认连接mysql的路径是 : /var/mysql/mysql.sock ,但是mac下这个路径是不存在的,mac把mysql.sock 放在了 /tmp/mysql.sock ,解决方法有2个:方法1、修改php.ini文件(/etc/php.ini)
查找 mysql.default_socket、mysqli.default_socket、pdo_mysql.default_socket 把他们的值都改为 /tmp/mysql.sock

mysql.default_socket = /tmp/mysql.sock
mysqli.default_socket = /tmp/mysql.sock
pdo_mysql.default_socket = /tmp/mysql.sock

方法2、使用 ln -s 命令创建软连接(推荐)

sudo mkdir /var/mysql
sudo ln -s /tmp/mysql.sock /var/mysql/mysql.sock

原理是把 /tmp/mysql.sock 映射到 /var/mysql/mysql.sock,这样,php默认读取的mysql.sock文件路径就存在了。    四、安装 phpmyadmin     可以在 phpMyAdmin官网下载安装包:http://www.phpmyadmin.net/home_page/downloads.php,可以下载 all-languages.tar.gz 使用中文版,解压之后,将解压出来的文件夹改名为”phpmyadmin”,并放到上面建立的”站点”目录下。
配置:复制 phpmyadmin/libraries/config.default.php  到并改名 phpmyadmin/config.inc.php,然后修改 config.inc.php文件:
$cfg[‘blowfish_secret’] = ‘piaoyi’;
这个密钥是用作cookie加密用的。到这里就算完成了,接下来你就可以访问 http://localhost/phpmyadmin/ 来通过 phpmysql 管理你的数据库了。     五、如有必要,可以安装 Zend Guard Loader 
mac 10.9.5 自带的 PHP 5.4.30 内部核心 zend 引擎版本是 Zend Engine v2.4.0,但是这个可不是 zend guard loader(php5.2及之前的版本名字是 Zend Optimizer),不要搞混哦。在调试某些程序(比如 ecstore 2.3)的时候,就需要 Zend Optimizer 2.5.7 及以上。     MAC下的安装步骤(参考):
1、下载 Zend Guard Loader 6.0.0 (for PHP 5.3 or 5.4) ,网址: http://www.zend.com/en/products/guard/downloads
文件是:Zend Guard Loader (Runtime for PHP 5.4) 6.0.0,类型:DMG。
Mac下载地址:http://downloads.zend.com/guard/6.0.0/ZendGuardLoader-70429-PHP-5.4-darwin10.7-x86_64.tar.gz
2、从压缩包里提取 ZendGuardLoader.so (Linux) or ZendLoader.dll (Windows) ;
mac下的ZendGuardLoader.so,只有3.3版本的。
3、编辑php配置文件  ‘php.ini’ :

zend_extension = /usr/local/lib/php/ZendGuardLoader.so ##路径根据实际情况而定
zend_loader.enable=1
zend_loader.disable_licensing=0
zend_loader.obfuscation_level_support=3
zend_loader.license_path=

4、如果你同时使用 Zend debugger,请确保在 Zend Guard Loader 加载之后加载.
5、如果你使用 ioncube loader,请确保在 Zend Guard Loader 加载之前加载.
6、重启 Web server.    安装完毕后,用 phpinfo() 函数查看,有这类描述:“ with Zend Guard Loader v3.3”,出现下图即为成功:

MAC OS X环境下配置APACHE+PHP+MYSQL+PHPMYADMIN

注意:MAC os x目前已经没有了32位的版本,新出的都是64位。因此,在MAC下安装了php5.3之后,再到zend官网去找 ZendGuardLoader.so,你会发现zend根本就没有出 64位版本的 ZendGuardLoader.so,只有32位的,这个时候,如果你强行引用32位的 ZendGuardLoader.so for mac php5.3,就会出现下列错误:

Failed loading /usr/local/lib/php/php53/ZendGuardLoader.so:  dlopen(/usr/local/lib/php/php53/ZendGuardLoader.so, 9): no suitable image found.  Did find:
/usr/local/lib/php/php53/ZendGuardLoader.so: mach-o, but wrong architecture

这个错误,官方回复说无解,此路不通。

At present we only support 32 bit on the Mac for backward compatibility. In the next major version we will probably move to 64 bit only. . You’re simplest solution might be to download Zend Server CE for the Mac and get a complete 32 bit stack.

参考链接:
1、ZendGuardLoader on php 5.3.8:http://forums.zend.com/viewtopic.php?f=57&t=43093
2、Zend Guard Loader on MacOX Snow Leopard:http://forums.zend.com/viewtopic.php?f=57&t=79708
3、installing Zend Guard Loader on Mac os with PHP 5.3:http://forums.zend.com/viewtopic.php?f=57&t=21538

php 生成图片,给图片加水印

用php生成一张图片,并给图片添加水印的方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
    $path 'p1.jpg';
    $path1 'p2.png';
    $img = imagecreatefromstring(file_get_contents($path)); //获取图片
    $img1 = imagecreatefromstring(file_get_contents($path1));
    
    //将水印图片复制到目标图片上,最后个参数50是设置透明度,这里实现半透明效果
    imagecopymerge($img$img1, 10, 10, 0, 0, 100, 100, 50);
    //如果水印图片本身带透明色,则使用imagecopy方法
    imagecopy($img$img1, 100, 100, 0, 0,97,206);
    
    $fontcolor1 = imagecolorallocate($img,255,255,255); //定义颜色
    imagettftext($img,20,90,100,600,$fontcolor1,'035-CAI978.ttf','字体大小');  //设置字体
    
    $fontcolor = imagecolorallocate($img,0,0,0);
    imagestring($img, 3, 2, 3, "Hello world!"$fontcolor);  //写入文字
    imagestring($img, 10, 10, 10, "Hello world!222222222"$fontcolor);  //继续写入文字 
    
    header('Content-Type: image/jpeg');
    imagejpeg($img);
    imagedestroy($img);
?>

PHP 图片处理类(图片加水印,图片加文字,图片缩略处理,获取图片信息等)

PHP 图片处理类(图片加水印,图片加文字,图片缩略处理,获取图片信息等)

 

<?php
header('content-type:text/html;charset=utf-8');
class Imgs
{
    /**
     * 取得图片宽
     * @param string $src 图片相对路径或绝对路径
     */
    public static function get_width($src)
    {
        return imagesx($src);
    }
    /**
     * 取得图片高
     * @param string $src 图片相对路径或绝对路径
     */
    public static function get_height($src)
    {
        return imagesy($src);
    }
    /** 
     * 图片缩放函数   
     * @param string $src 图片相对路径或绝对路径 
     * @param int $w 缩略图宽
     * @param int $h 缩略图高
     * @return array code:状态。msg:提示信息
     **/
    public static function thumb($src,$w=null,$h=null)     
    {   
        if(empty($src)) return array('code'=>false , 'msg'=>'请指定$src');
        $temp pathinfo($src);
        #  文件名
        $name $temp["basename"];
        #  文件所在的文件夹
        $dir $temp["dirname"];
        #  文件扩展名
        $extension $temp["extension"];
        #  缩略图保存路径,新的文件名为*.thumb.jpg
        $savepath "{$dir}/thumb_{$name}";
        
        #  获取图片的基本信息
        $info getimagesize($src);
        #  获取图片宽度
        $width $info[0];
        #  获取图片高度
        $height $info[1];
        if(!empty($w)){
            $temp_w=$w;                         #  计算原图缩放后的宽度
            $temp_h=intval($height*($w/$width));#  计算原图缩放后的高度
        }else{
            $temp_w=intval($width*($h/$height));#  计算原图缩放后的宽度
            $temp_h=$h;                         #  计算原图缩放后的高度
        }
        #  创建画布
        $temp_img=imagecreatetruecolor($temp_w,$temp_h);
        switch ($info[2])     
        {     
            case 1:     
                $im=imagecreatefromgif($src);   
                imagecopyresampled($temp_img,$im,0,0,0,0,$temp_w,$temp_h,$width,$height); 
                imagegif($temp_img,$savepath, 100);   
                break;     
            case 2:     
                $im=imagecreatefromjpeg($src);   
                imagecopyresampled($temp_img,$im,0,0,0,0,$temp_w,$temp_h,$width,$height);     
                imagejpeg($temp_img,$savepath, 100);      
                break;     
            case 3:     
                $im=imagecreatefrompng($src);  
                imagecopyresampled($temp_img,$im,0,0,0,0,$temp_w,$temp_h,$width,$height); 
                imagepng($temp_img,$savepath, 100);    
                break;     
        }        
        imagedestroy($im); 
        return $savepath;
    
    /** 
     * 图片添加水印   
     * @param string $src  1、图片相对路径或绝对路径  2、以逗号隔开的宽高值('800,600')
     * @param array  属性值:
     *                    res:水印资源(1、图片相对路径或绝对路径,2、字符串)
     *                 pos:图片水印添加的位置,取值范围:0~9
     *                         0:随机位置,在1~8之间随机选取一个位置
    *                         1:顶部居左 2:顶部居中 
     *                         3:顶部居右 4:左边居中
     *                         5:图片中心 6:右边居中 
     *                         7:底部居左 8:底部居中 
     *                         9:底部居右
     *                 font:    字体库(相对路径或绝对路径)
     *                 fontSize:文字大小
     *                 color:   水印文字的字体颜色(255,255,255)
     *                 name:    图片保存名称
     * @return array    code:状态、 msg:提示信息、 url:图片地址
     **/
    public static function setWater($src$arr=array())
    {  
        if(empty($src)) return array('code'=>false , 'msg'=>'请指定$src');
        $def array(
            'res'       => '小川编程',
            'pos'       => 7,
            'font'      => './1.ttf',
            'fontSize'  => 24,
            'color'     => '255,255,255',
            'name'      => null
        );
        $def array_merge($def,$arr);
        /**
            判断$src是不是图片,不是就创建画布
        */
        if(!file_exists($src)){
            if(empty($def['name'])) return array('code'=>false , 'msg'=>'请指定图片名称');
            # 计算画布宽高
            $obj explode(','$src);
            if(count($obj)!=2) return array('code'=>false , 
                'msg'=>'请给正确的宽高,或你给的不是一个有效的地址!');
            $srcImg_w is_numeric($obj[0]) ? $obj[0] : 400 ;
            $srcImg_h is_numeric($obj[1]) ? $obj[1] : 300 ;
            # 创建画布
            $dst_img = @imagecreatetruecolor($srcImg_w,$srcImg_h);
        }else{
            #  获取图片信息
            $srcInfo = @getimagesize($src);
            $srcImg_w $srcInfo[0];
            $srcImg_h $srcInfo[1];
            if(empty($def['name'])) $def['name'] = $src;
            #  动态的把图片导入内存中
            switch ($srcInfo[2]){ 
                case 1: 
                    $dst_img = imagecreatefromgif($src); 
                break
                case 2: 
                    $dst_img = imagecreatefromjpeg($src); 
                break
                case 3: 
                    $dst_img = imagecreatefrompng($src); 
                break
                default
                    return array('code'=>false , 'msg'=>'目标图片类型错误');
                exit
            }
        }
        /**
            计算出水印宽高
        */
        if(!file_exists($def['res'])){
            if(!file_exists($def['font']))
                return array('code'=>false , 'msg'=>'字体库不存在');
            $box = @imagettfbbox($def['fontSize'], 0, $def['font'], $def['res']);
            $logow = max($box[2], $box[4]) - min($box[0], $box[6]);
            $logoh = max($box[1], $box[3]) - min($box[5], $box[7]);  
        }else{
            $resInfo = @getimagesize($def['res']);
            $res_w $resInfo[0];
            $res_h $resInfo[1];
            if($srcImg_w $res_w || $srcImg_h $res_h)
                return array('code'=>false , 'msg'=>'水印图片过大');
            #  动态的把图片导入内存中
            switch ($resInfo[2]){ 
                case 1: 
                    $markim = imagecreatefromgif($def['res']); 
                break
                case 2: 
                    $markim = imagecreatefromjpeg($def['res']); 
                break
                case 3: 
                    $markim = imagecreatefrompng($def['res']); 
                break
                default
                    return array('code'=>false , 'msg'=>'水印图片类型错误');
                exit
            }
            $logow $res_w;
            $logoh $res_h;
        }
        /**
            计算水印显示位置
        */
        if($def['pos'] == 0) $def['pos'] = rand(1, 9);
        switch($def['pos'])
        {
            case 1:
                $x = +10;
                $y = +10+$def['fontSize'];
            break;
            case 2:
                $x = ($srcImg_w $logow) / 2;
                $y = +10+$def['fontSize'];
            break;
            case 3:
                $x $srcImg_w $logow - 10;
                $y = +10+$def['fontSize'];
            break;
            case 4:
                $x = +10;
                $y = ($srcImg_h $logoh) / 2 + $def['fontSize'];
            break;
            case 5:
                $x = ($srcImg_w $logow) / 2;
                $y = ($srcImg_h $logoh) / 2 + $def['fontSize'];
            break;
            case 6:
                $x $srcImg_w $logow - 10;
                $y = ($srcImg_h $logoh) / 2 + $def['fontSize'];
            break;
            case 7:
                $x = +10;
                $y $srcImg_h $logoh $def['fontSize'] - 10;
            break;
            case 8:
                $x = ($srcImg_w $logow) / 2;
                $y $srcImg_h $logoh $def['fontSize'] - 10;
            break;
            case 9:
                $x $srcImg_w $logow - 10;
                $y $srcImg_h $logoh $def['fontSize'] - 10;
            break;
            default
                return array('code'=>false , 'msg'=>'水印位置不支持');
            exit;
        }
        /**
            把图片水印或文字水印,加到目标图片中
        */
        if(file_exists($def['res'])){
            imagecopy($dst_img$markim$x$y, 0, 0, $logow$logoh);
            imagedestroy($markim);
        }else{
            $rgb explode(','$def['color']);
            if(count($rgb)!=3) return array('code'=>false , 'msg'=>'请给正确的字体颜色');
            if(!is_numeric($rgb[0]) || !is_numeric($rgb[1]) || !is_numeric($rgb[2])) 
                return array('code'=>false , 'msg'=>'请给正确的字体颜色');
            if($rgb[0]>255 || $rgb[1]>255 || $rgb[2]>255) 
                return array('code'=>false , 'msg'=>'请给正确的字体颜色');
            $def['color'] = imagecolorallocate($dst_img$rgb[0], $rgb[1], $rgb[2]);
            imagettftext($dst_img$def['fontSize'], 0, $x
                $y$def['color'], $def['font'],$def['res']);
        }
        /**
            保存处理过的图片(有水印了的图片)
        */
        $name explode('.'$def['name']);
        switch (strtolower($name[2])) {
            case 'jpeg':
                    imagejpeg($dst_img$def['name']);
                break;
            case 'jpg':
                    imagejpeg($dst_img$def['name']);
                break;
            case 'png':
                    imagepng($dst_img$def['name']);
                break;
            case 'gif':
                    imagegif($dst_img$def['name']);
                break;
            default:
                    return array('code'=>false , 'msg'=>'保存图片类型有误');
                break;
        }
        #  销毁图片内存资源
        imagedestroy($dst_img);
        return array('code'=>true , 'msg'=>'添加水印成功''url'=>$def['name']);
    }
}
/*
    创建一个800*600的图再加logo.jpg图片作为水印.
    1、另存为new_thumb.jpeg
    2、水印在中间显示
*/
#  参数:
$arr = [
    #  水印图片路径(如果不存在将会被当成是字符串水印)
    'res'  => './logo.jpg',
    #  水印显示位置
    'pos'  => 5,
    #  不指定name(会覆盖原图,也就是保存成thumb.jpeg)
    'name' => './800x600.jpeg',  
];
$res = Imgs::setWater('800,600'$arr);
print_r($res);
/*
    给图片thumb.jpeg加:小川编程,作为水印
    1、另存为new_thumb.jpeg
    2、水印顶部居右显示
    3、字体大小为:30
*/
#  参数:
$arr = [
    #  水印图片路径(如果不存在将会被当成是字符串水印)
    'res'  => '小川编程',
    #  水印显示位置
    'pos'  => 3,
    #  不指定name(会覆盖原图,也就是保存成thumb.jpeg)
    'name' => './new1.jpg',  
    #  字体大小
    'fontSize'=>30,
    #  字体颜色
    'color'=>'255,255,0',
]; 
$res = Imgs::setWater('./1.jpg'$arr);
print_r($res);
?>

PHP+Mysql防止SQL注入的3种方法!

PHP+Mysql防止SQL注入的3种方法:

方法一:

mysql_real_escape_string — 转义 SQL 语句中使用的字符串中的特殊字符,并考虑到连接的当前字符集 !

使用方法如下:

1
2
3
$sql = "select count(*) as ctr from users where username
='".mysql_real_escape_string($username)."' and 
password='". mysql_real_escape_string($pw)."' limit 1";

使用  mysql_real_escape_string() 作为用户输入的包装器,就可以避免用户输入中的任何恶意 SQL 注入。

方法二:

打开magic_quotes_gpc来防止SQL注入

php.ini中有一个设置:magic_quotes_gpc = Off
这个默认是关闭的,如果它打开后将自动把用户提交对sql的查询进行转换,
比如把 ‘ 转为 \’等,对于防止sql注射有重大作用。

如果magic_quotes_gpc=Off,则使用addslashes()函数

方法三:

自定义函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
/**
* 防止sql注入自定义方法一
* author: xiaochuan
* @param: mixed $value 参数值
*/
function check_param($value=null) { 
        #  select|insert|update|delete|\'|\/\*|\*|\.\.\/|\.\/|union|into|load_file|outfile
    $str 'select|insert|and|or|update|delete|\'|\/\*|\*|\.\.\/|\.\/|union|into|load_file|outfile';
    if(!$value) {
        exit('没有参数!'); 
    }elseif(eregi($str$value)) { 
        exit('参数非法!');
    }
    return true; 
 
/**
* 防止sql注入自定义方法二
* author: xiaochuan
* @param: mixed $value 参数值
*/
function str_check( $value ) { 
    if(!get_magic_quotes_gpc()) { 
        // 进行过滤 
        $value addslashes($value); 
    
    $value str_replace("_""\_"$value); 
    $value str_replace("%""\%"$value); 
     
   return $value
 
/**
* 防止sql注入自定义方法三
* author: xiaochuan
* @param: mixed $value 参数值
*/
function post_check($value) { 
    if(!get_magic_quotes_gpc()) {
        // 进行过滤  
        $value addslashes($value);
    
    $value str_replace("_""\_"$value); 
    $value str_replace("%""\%"$value); 
    $value nl2br($value); 
    $value = htmlspecialchars($value); 
    return $value
}