Posted on

php中的pdo用法

1.设置DSN(数据源名称)

$host = '127.0.0.1';
$db   = 'test';
$user = 'root';
$pass = '';
$charset = 'utf8';
$dsn = "mysql:host=$host;dbname=$db;charset=$charset";
$opt = [
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::ATTR_EMULATE_PREPARES   => false,
];
$pdo = new PDO($dsn, $user, $pass, $opt);

2.执行queries

$stmt = $pdo->query('SELECT name FROM users');
while ($row = $stmt->fetch())
{
    echo $row['name'] . "\n";
}

3.预防sql注入

2种写法:

$stmt = $pdo->prepare('SELECT * FROM users WHERE email = ? AND status=?');
$stmt->execute([$email, $status]);
$user = $stmt->fetch();
// or
$stmt = $pdo->prepare('SELECT * FROM users WHERE email = :email AND status=:status');
$stmt->execute(['email' => $email, 'status' => $status]);
$user = $stmt->fetch();

 

Posted on

mysql基础

1.关系数据库优点:

比普通文件的数据访问速度快。
更容易查询并提取满足特定条件的数据
有专门的内置机制处理并发访问。
可以提供对数据的随机访问。
具有内置的权限系统。
表格:关系数据库由关系组成,这些关系通常称为表格。
列:表中的每一列都有唯一的名称,包含不同的数据。每一列都有一个数据类型。
行:每一行代表一条记录。
键:标识每一个特定记录的方法。
模式:数据库整套表格的完整设计称为数据库的模式。它是数据库的设计蓝图。
关系:外键表示两个表格数据的关系。
三种基本关系:一对一、一对多、多对多。

2.设计数据库

考虑建模的实际对象:当创建一个数据库时,我们经常为现实世界的实体和关系建立模型,并且存储这些实体对象与关系的信息。
避免保存冗余信息:1.空间浪费。2.导致数据更新不一致
使用原子列值:每一行的每个属性只存储一个数据。
选择有意义的键。
考虑要询问数据库的问题。
避免多个空属性的设计。
表格类型的总结:
1.描述现实世界的简单表。这些表也可能包含其他简单对象的键,他们之间有一对一或一对多的关系。
2.描述两个现实世界对象的多对多关系的关联表。

Posted on

安装laravel

1,安装composer

php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('SHA384', 'composer-setup.php') === '669656bab3166a7aff8a7506b8cb2d1c292f042046c5a994c43155c0be6190fa0355160742ab2e1c88d40d5be660b410') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"

移动到PATH目录:

mv composer.phar /usr/local/bin/composer

2.安装laravel

composer global require "laravel/installer"

设置环境变量:

echo $PATH
export PATH=$PATH:/home/ubuntu/.config/composer

新建一个laravel程序:

laravel new blog

 
 

Posted on

ubuntu 14.04 安装bbr

bbr可以简单理解为tcp加速算法。

1.查看当前内核

uname -r
输出4.4.0-78-generic

2.查看可用内核

dpkg -l|grep linux-image
输出:
ii linux-image-4.4.0-78-generic 4.4.0-78.99~14.04.2 amd64 Linux kernel image for version 4.4.0 on 64 bit x86 SMP
ii linux-image-4.4.0-79-generic 4.4.0-79.100~14.04.1 amd64 Linux kernel image for version 4.4.0 on 64 bit x86 SMP
ii linux-image-extra-4.4.0-78-generic 4.4.0-78.99~14.04.2 amd64 Linux kernel extra modules for version 4.4.0 on 64 bit x86 SMP
ii linux-image-extra-4.4.0-79-generic 4.4.0-79.100~14.04.1 amd64 Linux kernel extra modules for version 4.4.0 on 64 bit x86 SMP
ii linux-image-generic-lts-xenial 4.4.0.79.64 amd64 Generic Linux kernel image

3.下载最新内核

去http://kernel.ubuntu.com/~kernel-ppa/mainline/页面底部下载最新内核:
wget http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.12-rc4/linux-image-4.12.0-041200rc4-generic_4.12.0-041200rc4.201706042031_amd64.deb

4.安装

sudo dpkg -i linux-image-4.12.0-041200rc4-generic_4.12.0-041200rc4.201706042031_amd64.deb
安装最后输出:
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-4.12.0-041200rc4-generic
Found initrd image: /boot/initrd.img-4.12.0-041200rc4-generic
Found linux image: /boot/vmlinuz-4.4.0-79-generic
Found initrd image: /boot/initrd.img-4.4.0-79-generic
Found linux image: /boot/vmlinuz-4.4.0-78-generic
Found initrd image: /boot/initrd.img-4.4.0-78-generic
done
可以看到,已经更新了引导文件,并把我们新安装的内核排到了第一位,所以并不用卸载旧内核了。
再查看一次内核:
dpkg -l|grep linux-image
输出:
ii linux-image-4.12.0-041200rc4-generic 4.12.0-041200rc4.201706042031 amd64 Linux kernel image for version 4.12.0 on 64 bit x86 SMP
ii linux-image-4.4.0-78-generic 4.4.0-78.99~14.04.2 amd64 Linux kernel image for version 4.4.0 on 64 bit x86 SMP
ii linux-image-4.4.0-79-generic 4.4.0-79.100~14.04.1 amd64 Linux kernel image for version 4.4.0 on 64 bit x86 SMP
ii linux-image-extra-4.4.0-78-generic 4.4.0-78.99~14.04.2 amd64 Linux kernel extra modules for version 4.4.0 on 64 bit x86 SMP
ii linux-image-extra-4.4.0-79-generic 4.4.0-79.100~14.04.1 amd64 Linux kernel extra modules for version 4.4.0 on 64 bit x86 SMP
ii linux-image-generic-lts-xenial 4.4.0.79.64 amd64 Generic Linux kernel image
重启:sudo reboot

5.重连服务器

查看当前内核:uname -r
输出:4.12.0-041200rc4-generic 
已经成功

6.开启bbr

修改系统配置:
sudo bash -c 'echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf'
sudo bash -c 'echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf'
保存:
sudo sysctl -p

7.测试

sysctl net.ipv4.tcp_available_congestion_control
sysctl net.ipv4.tcp_congestion_control

如果结果都有bbr代表成功。
lsmod | grep bbr
也应该有bbr。

8.实测

原来的速度:

开启bbr以后的速度:

速度竟然降了,怎么回事呢?

-end-

Posted on

php实现面向对象

对象可以用于表示所有实物或概念。面向对象软件由一系列具有属性和操作的自包含对象组成,这些对象之间能够交互,从而达到我们的要求。

1.类和对象

对象的属性是与对象相关的特性或变量。对象的操作是对象可以执行的、用来改变其自身或对外部产生影响的方法、行为或函数。
封装也叫做数据隐藏。从本质上说,访问一个对象中的数据只能通过对象的操作来实现,对象的操作也就是对象的接口。
对象是一个被保存数据和操作这些数据的操作方法的唯一、可标识的集合。
对象可以按类进行分类。类是表示彼此之间可能互不相同,但是必须具有一些共同特点的对象集合。

2.多态

面向对象的编程语言必须支持多态性,多态性的意思是指不同的类对同一操作可以有不同的行为。

3.继承

继承允许我们使用子类在类之间创建层次关系。子类将从它的超类继承属性和操作。

4.创建类、属性和操作

一个最小的类:

class classname { }

包含属性的类:

class classname
{
public $att1;
public $att2;
}

包含操作的类:

class classname
{
  function operation1() {}
  function operation2($param1, $param2) {}
}

构造函数:

大多数类都有一种称为构造函数的特殊操作。当创建一个对象时,它将调用构造函数,通常将执行一些有用的初始化任务:列如,设置属性的初始值或者创建该对象需要的其他对象。
构造函数的名称是__construct().
有构造函数的类:
class classname 
{
  function __construct($param)
{echo "constructor called with parameter".$param."<br />";}
}

析构函数:

与构造函数相对,析构函数允许在销毁一个类之前执行一些操作或完成一些功能。
析构函数名称是__destruct()。

5.类的实例化

 

Posted on

php中session的用法

1.http是无状态的协议

用session可以追踪用户。

2.sessionID

sessionID是一个加密的随机数字,由php生成,可保存在cookie中,也可通过url传递。
session函数自动设置cookie。

3.实现session

session_start();  //检查是否有一个sessionID存在,如果不存在,就创建一个。必须在脚本开始部分调用。
$_SESSION['myvar'] = 5;   //注册session变量。
unset($_SESSION['myvar']);  //注销变量
session_destroy(); //销毁session。

4.用session实现身份验证。

authmain.php

<?php
session_start();
if (isset($_POST['userid']) && isset($_POST['password']) )
{
//if the user has just tried to log in
$userid = $_POST['userid'];
$password = $_POST['password'];
 
$db_conn = new mysqli('localhost', 'web', 'web', 'auth');
 
if (mysqli_connect_errno()){
echo 'connection failed';
exit();
}
$query = 'select * from authorized_users'."where name='$userid'"."and password=sha1('$password')";
$result = $db_conn->query($query);
if ($result->num_rows)
{
$_SESSION['valid_user'] = $userid;
}
$db_conn->close();
}
?>
<html>
<body>
<h1>home page</h1>
<?php
if (isset($_SESSION['valid_user']))
{
echo 'you are logged in as:'.$_SESSION['valid_user'].'<br />';
echo '<a href="logout.php">log out</a><br />';
}
else
{
if (isset($userid))
{echo 'could not log you in.<br />';}
else
{
echo 'you are not loged in.<br />';
}
echo '<form method="post" action="authmain.php">';
...//完成表单
}
?>
</body></html>

members_only.php

<?php
session_start();
echo '<h1>members only</h1>';
if (isset($_SESSION['valid_user']))
{
echo '<p>you are logged in as '.$_SESSION['valid_user'].'</p>';
}
else
{
echo '<p>you are not logged in.</p>';
}
?>

logout.php

<?php
session_start();
$old_user = $_SESSION['valid_user'];
unset($_SESSION['valid_user']);
session_destroy();
?>
<html>
<body>
<h1>log out</h1>
<?php
if (!empty($old_user))
{
echo 'logged out.<br />';
}
else
{
echo 'you were not logged in,and so have not been logged out.<br />';
}
?>
</body></html>

-end-

Posted on

php数组

在计算机科学中,数组数据结构英语:array data structure),简称数组英语:Array),是由相同类型的元素(element)的集合所组成的数据结构,分配一块连续的内存来存储。利用元素的索引(index)可以计算出该元素对应的储存地址。

1.一个数组就是一个用来存储一系列变量值的命名区域。

存储在数组中的值称为数组元素,每个数组元素有一个相关的索引,它可以用来访问元素。php允许间隔性地使用数字或字符串作为数组的索引。

2.数字索引数组

数字索引的默认值是从0开始的。
$products = array(‘p1′,’p2′,’p3’);//手工初始化
$numbers = range(1,10);//创建一个1~10的数字数组
如果信息保存在磁盘文件中,可以从这个文件直接载入到数组中。
如果信息保存在数据库中,可以从这个数据库中直接载入到数组中。
还可以使用不同函数提取数组中的一部分数据,或对数组进行重新排序。
访问数组:$products[0], 0元素是数组的第一个元素。
循环访问数组:for ($i = 0; $i<3; $i++ ) {echo $products[$i]." "; }

3.关联数组

初始化:$prices = array('p1' =>100, 'p2'=>10, 'p3'=>4);
访问数组:$prices['p1']
循环访问:foreach ($prices as $key => $valus){echo $key." - ".$value."<br />";}

4.多维数组

二位数组是一个矩阵,或者表格。
三维数组是一堆这样的表格。

5.数组排序

按升序排序:sort($products);
对关联数组排序:
按元素值:asort($prices);  按关键字排序:ksort($prices);
反向排序:以上三个函数的对应的反向函数是rsort();  arsort();  krsort();
随机排序:shuffle();
反向排序:array_reverse();

-end-

Posted on

lemp+phpmyadmin+wp+whmcs安装的坑

操作系统选择ubuntu14.04。

系统常用命令:

sudo service nginx restart
sudo service php5-fpm restart
sudo service php7.0-fpm restart
sudo tar xzvf xxx.tar.gz -C /dir
sudo ln -s /usr/share/phpmyadmin /usr/share/nginx/html
sudo chmod -R 777 /dir
sudo chown -R www-data:www-data /usr/share/nginx/html/
sudo rm -rf /dir
sudo mkdir -p /var/www/html

首先开心的用apt包管理器安装好nginx、mysql和php:

sudo apt-get update
sudo apt-get install nginx
sudo apt-get install mysql-server
sudo mysql_install_db                              //generate the directory structure it needs to store its databases and information.
sudo mysql_secure_installation          //security script
sudo apt-get install php5-fpm php5-mysql
设置nginx server blocks:

server {
    listen 80 default_server;
    listen [::]:80 default_server ipv6only=on;
    root /usr/share/nginx/html;
    index index.php index.html index.htm;
    server_name server_domain_name_or_IP;
    location / {
        try_files $uri $uri/ =404;
    }
    error_page 404 /404.html;
    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
        root /usr/share/nginx/html;
    }
    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

安装phpmyadmin:

sudo apt-get install phpmyadmin
在选择apache和httpd时按tab键跳过
sudo ln -s /usr/share/phpmyadmin /usr/share/nginx/html //把phpmyadmin目录链接到公开的web目录

安装wordpress:

把wp的执行用户设置为与nginx相同的www-data
sudo chgrp -R www-data /usr/share/nginx/html/
sudo chown -R www-data:www-data /usr/share/nginx/html/
建立wp的server blocks:

server {
        listen 80 default_server;
        listen [::]:80 default_server ipv6only=on;
        root /var/www/html;
        index index.php index.html index.htm;
        server_name your_domain.com;
        location / {
                # try_files $uri $uri/ =404;
                try_files $uri $uri/ /index.php?q=$uri&$args;
        }
        error_page 404 /404.html;
        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
                root /usr/share/nginx/html;
        }
        location ~ \.php$ {
                try_files $uri =404;
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                fastcgi_pass unix:/var/run/php5-fpm.sock;
                fastcgi_index index.php;
                include fastcgi_params;
        }
}

做一个软链接:
sudo ln -s /etc/nginx/sites-available/wordpress /etc/nginx/sites-enabled/
重启nginx和php

安装whmcs

安装php7.0
增加源
sudo add-apt-repository ppa:ondrej/php
sudo apt-get update
安装
sudo apt-get install php7.0-fpm
sudo apt-get install php7.0-mysql
在nginx配置中更新sock路径

  • PHP 5:/var/run/php5-fpm.sock
  • PHP 7:/var/run/php/php7.0-fpm.sock

配置文件目录

  • php5:/etc/php5/
  • php7:/etc/php/7.0

安装ioncube
sudo wget http://downloads3.ioncube.com/loader_downloads/ioncube_loaders_lin_x86-64.tar.gz
tar xzvf ioncube_loaders_lin_x86-64.tar.gz -C /usr/ioncube/
修改php配置文件
sudo nano /etc/php/7.0/php.ini
加入一行
zend_extension = /usr/ioncube/ioncube/ioncube_loader_lin_7.0.so
安装破解文件,拷贝License.php到whmcs/vendor/whmcs/whmcs-foundation/lib

-end-

Posted on

php基础语法

虽说一门语言的基础语法并不是编程最需要关系的事情,因为算法、编程范式和设计模式的重要性远在其之上,但是它太基础,又不得不详细学习。此笔记为以后时常查询之用。

1.php是服务端脚本,最常用的功能之一是处理html表单。

在html中用<form action="script.php" method="post">来设置处理表单的服务端程序。
action属性是用户点击submit按钮时载入的url,输入的数据安装method属性指定的方法发送到这个url,该方法可以是get(附加在url结尾)或post(以单独消息形式发送)。
每个表单域的名称(name属性值)可以直接在php脚本中使用。

2.可以直接在html文件中嵌入php代码,浏览器显示的是php脚本在php解释器运行后的结果。

php标记以<? php为开始, ?>为结束。
关于空格,换行(回车)、空格和tab都认为是空格,无论是html还是php都会忽略这些空格字符。
注释,包含在/*与*/之间,或者在一行的//之后,或者#之后。

3.date()函数的调用,date('H:i, jS F Y');

4.访问表单变量。

$_POST['name']$_GET['name']访问各自提交方法的表单变量,$_REQUEST['name']可以访问get和post的变量。这些被称为超全局变量。
使用点号.连接字符串。可以将简单类型的变量写入到由双引号引起来的字符串中,会正常输出变量内容。而在单引号中不行。

5.类型转换,在希望进行转换的变量前的圆括号中插入数据类型即可:$a = (int)$b;

6.定义常量:define ('AMOUNT', 100); ,常量名称都是大写字母,引用常量时前面没有$.

7.操作符

复合赋值操作符:$a += $b 等价于 $a = $a + $b , $a .= $b 等价于 $a = $a . $b
前置第增减和后置递增减运算符:echo ++$a;是将变量加1后再赋值给原变量,echo $a++;是先返回$a的值,然后$a再加1。
引用操作符:$a=5;$b=&$5;$a=7;现在$a和$b都是7。
比较操作符:==是等于,!=是不等。
逻辑操作符:&&为与,||为或。
其他操作符:逗号”,“用来分隔函数参数和其他列表项。new用来初始化类的实例,->用来访问类的成员。=>用来给关联数组赋值。@是错误抑制操作符。``是执行操作符,用来执行服务端命令,位于键盘上~相同的位置。[]用来访问数组元素。

8.控制结构

if第一种:
if (sthhappens) blabla;
if第二种:
if (sthhappens) {
blabla;
}
else{
blabla;
}
if第4种:
if (sthhappens) {
blabla;
}
else{
if () blabla;
if () blabla;
}
if第5种:
if (sthhappens) {
blabla;
}
elseif(){
blabla;
}
elseif(){
blabla;
}
switch:
switch($var){
case "a" :
echo  "blabla";
break;
case "b":
echo  "blabla";
break;
}
while循环:while (condition) expression;在每一次迭代开始,都将对条件进行测试,如果条件为false语句就不会被执行,循环结束。
for循环:for (expression1;condition;expression2) expression3; 表达式1是初始值,只在开始执行一次。在每一次循环开始之前条件会被测试,如果返回false,循环结束。表达式2在每次循环结束执行,通常可以调整计数器的值。表达式3在每次循环执行一次。
从控制结构或脚本中跳出:break语句终止一个循环,continue语句跳到下一次循环,exit结束整个PHP脚本的运行。
 

-end-

Posted on

whmcs微信支付接口(免签约)

whmcs支持2种支付方式:

  1. 第三方网关 – 消费者离开网站支付,支付完成后返回。
  2. 商家网关 – 消费者直接输入cc信息. 支付在后台处理.

首先下载官方的示例接口:https://github.com/WHMCS/sample-gateway-module/
把gatewaymodule.php和callback/gatewaymodule.php改名为weichat.php。打开weichat.php,修改gatewaymodule_为weichat_。删除_refund和_cancelSubscription这2个函数。
设置weichat_config函数,用来在激活网关时在后台设置一些选项。
设置link函数,用来把用户带到支付网关,这个函数输出的是html代码,一般是<form>表单里用一个post方法提交。
修改callback代码,callback用来接收支付网关的返回,并把支付结果通知到whmcs。
那么免签如何实现呢?就是模拟一个支付宝接口,收到支付请求后首先取出事先生成好的二维码,在一个终端设备监控支付工具的收款记录,如果有匹配,通知到服务器,客户端浏览器在接到支付成功的信息后,重定向到callback函数。

-end-