PHP浮点数计算精度问题

$i = 2.3;
echo ($i*100).”<br>”;
$r = intval($i*100, 2);
echo $r;

//输出结构

230
229

原因:浮点数的不精确存储造成的

存储是近似值或者有些近似值=真实值 有些不等于

解决方案,使用 round() 函数

或者 设置
ini_set(“precision”, “12”);
ini_set(“precision”, “4”);

规定浮点数 通用精度为4
这样 所有计算 比如 1.234* 0.511

总是会得到1个4位小数的数值,后面的会四舍五入

如果你的计算 确定了最后的小数点 可以设置PHP支持到最后的一位 剩下的后一位会自动四舍五入

一般来讲 你可以定义到 4位或者 更高的12位 确定下来后 就不会出现 299.9999999 这样的值了

$num = 0.12345600000000000;
//整数部分为0 ,位数为 0 ,小数部分末尾的 0 不计入位数,所以总位数为 6
ini_set(“precision”, “12”);
echo $num; // 0.123456
//未超过精度值,显示的结果为 0.123456
ini_set(“precision”, “3”);
echo $num; // 0.123
//超过精度值,保留3位
ini_set(“precision”, “5”);
echo $num; // 0.12346
//超过精度值,保留5位
这种情况下,精度值等价于小数点后保留几位。
整数部分大于 0 情况
$num = 12.12345600000000000;
//整数部分为12 ,位数为 2 ,小数部分末尾的 0 不计入位数,位数为6,所以总位数为 2 + 6
ini_set(“precision”, “12”);
echo $num; // 12.123456
//未超过精度值,显示的结果为 12.123456

 

计算机存储 浮点数都是这样! 要么确定精度 要么自己用 round 四舍五入
一个是按需 一个是全局

kohana数据库操作

数据库配置

在配置文件夹里新增一个database.php文件

<?php defined(‘SYSPATH’) OR die(‘No direct script access.’);

return array(
‘default’ => array(
‘type’ => ‘MySQLi’,
‘connection’ => array(
‘hostname’ => ‘localhost’,
‘database’ => ‘kohana’,
‘username’ => ‘root’,
‘password’ => ‘password’,
‘persistent’ => FALSE,
‘ssl’ => NULL,
),
‘table_prefix’ => ‘db_’,
‘charset’ => ‘utf8’,
‘caching’ => FALSE,
),
);

 

有两种数据库实例

1.DB数据库实例

2. database数据库实例

其中DB是对database的再次封装

下面描述两个数据库实例的使用

Database

取得方法:

<?php
$database=Database::instance();//可以取得database实例
#例外在模型中,dababase做为模型构造函数的唯一一个传递参数,并在模型中有$this->_db属性
$database=$this->_db;
使用方法:(假设在模型中)
插入数据:

<?php
$sql="INSERT INTO `kohana`.`user` (`name` ,`age` )VALUES ( 'test', '1'), ( 'test2', '2')";
$dat=$this->_db->query(Database::INSERT,$sql,false);
# return 返回的两个值中,第一个是自动增长的ID,如果有的话,第二是影响的行数
更新数据:
<?php
$sql="UPDATE `ko_users` SET `user_name` = 'test111q1'  ";
$dat=$this->_db->query(Database::UPDATE,$sql,false);
#return 返回影响行数

删除数据:
<?php $sql="DELETE FROM `kohana`.`user` WHERE `user`.`id` = 1"; $dat=$this->_db->query(Database::DELETE,$sql,false); #return 返回影响行数
查询数据:
<?php
$sql="select * from ko_com_var";
$res=$this->_db->query(Database::SELECT,$sql,false);
#得到所有查询数据
$res->as_array();
#得到一条查询结果
$res->offsetGet(0);
#取得特定记录的指定字段值
$res->get("name");
#移动指针并取得指定字段
$res->next()->get("name");
$res->prev()->get("name");
#计算取得结果总数
$res->count();
#还有其他方法不在一一罗列,请查看手册
其他常用帮助函数:
<?php
#过滤字符串用,不知道为什么放到这个单例中,该是公用才对~,或许是每中数据库的过滤的东西有差别吧
$str=$this->_db->escape("ddddd  ddd");
#表前缀,这个常用~
$str=$this->_db->table_prefix();
#还有其他查看帮助,不介绍咯
DB实例使用(以下演示在Kohana环境即可)
有两种方式:
第一种:
以下的execute(); 有一个数据库适配器参数,当有多个数据连接的时候指定操作那个数据库,就是配置文件的那个KEY值
插入数据:
<?php
$sql="INSERT INTO `kohana`.`user` (`name` ,`age` )VALUES ( 'test', '1'), ( 'test2', '2')";
#其实也可以用Database::UPDATE,结果只返回影响行数,不过还是按规范好.呵呵~,上述Database也可以
$dat=DB::query(Database::INSERT,$sql);
$row=$dat->execute();
#返回的两个值中,第一个是自动增长的ID,如果有的话,第二是影响的行数
Kohana::debug($row);
数据更新:
<?php
$sql="UPDATE `user` SET `name` = 'test2' WHERE `user`.`id` =1 ";
$dat=DB::query(Database::UPDATE,$sql);
$row=$dat->execute();
#返回影响行数
echo Kohana::debug($row);
数据删除:
<?php
$sql="DELETE FROM `kohana`.`user` WHERE `user`.`id` = 1";
$dat=DB::query(Database::DELETE,$sql);
$row=$dat->execute();
#返回影响行数
echo Kohana::debug($row);

数据查询:

<?php
$sql="select * from user";
$dat=DB::query(Database::SELECT,$sql);
#指定数据库取数据
$row=$dat->execute($database)->offsetGet(0);
#默认数据库取数据,和上面的Database一样,都是返回Database_Result_Cached对象,实现了迭代器模式
$rus=$dat->execute();
#取得部分结果
$row=$rus->offsetGet(0);
#取得所有结果
$allrow=$rus->as_array();
#取得特定记录的指定字段值
$no1name=$rus->get("name");
#移动数组指针,并取指定字段值
$no2name=$rus->next()->get("name");
#当前指针
echo $rus->key();
#移动数组指针,并取指定字段值
echo $no1name=$rus->prev()->get('name');
#取行数
echo $rus->count();
第二种:(官网文档称之为查询器模式,不好用,呵呵,简单的可以用下)
插入数据:
<?php
$query = DB::insert('user', array('user', 'age'))
		->values(array('test1', '11'));
$query->execute();
#返回和上面一样

 

更新数据:
<?php
$query = DB::update('user')
		->set(array('age' => '100'))
		->where('user', '=', 'test1');
$query->execute();
#返回和上面一样

删除数据:

<?php
$query = DB::delete('user')
		->where('age', 'IN', array('100', '11'));
$query->execute();
#返回和上面一样

查询数据:

<?php
$query = DB::select()->from('user')->where("id","=","1");
$res=$query->execute();
#和上面一样,$res是Database_Result_Cached对象
$res->as_array();
#其他方法不演示了~

 

附注:
数据绑定,抄官方实例一个,该很简单,比较容易看懂
<?php
$query = DB::query(Database::INSERT, 'INSERT INTO users (username, password) VALUES (:user, :pass)')      
->bind(':user', $username)    
->bind(':pass', $password);  
foreach ($new_users as $username => $password){    
	$query->execute();
}

如何生成网站Url–kohana3

Url::site()方法允许你为你的网站生成一个完全合格的url.

用法

echo Url::site(‘controller/action’);

/kohana/index.php/controller/action

如果你需要使用一个完全合格的域名,那么设置第二个参数是TRUE

echo url::site(‘controller/action’, TRUE)

http://kerkness.ca/kohana/index.php/controller/action

如果你要定义你的url的协议,你可以设置第二个属性为这个协议的字符串

echo Url::site(‘controller/action’, ‘ftp’);

ftp://kerkness.ca/kohana/index.php/controller/action

上面的示例假定你在application/bootstrap.php中使用了下列这样设置

Kohana::init(array(

‘base_url’   => ‘/kohana/’,

‘index_file’ => ‘index.php’,

));

kohana引导

Bootstrap

bootstrap的位置在application/bootstrap.php。它负责建立Kohana的环境和执行的主响应。它是被index.php包含进去的。

建立环境

bootstrap首先设置时区和语言环境,然后增加Kohana的autoloader使级联文件系统工作。你可以在这里添加你的应用程序需要的所有设置。

// Sample excerpt from bootstrap.php with comments trimmed down

// Set the default time zone.
date_default_timezone_set(‘America/Chicago’);

// Set the default locale.
setlocale(LC_ALL, ‘en_US.utf-8’);

// Enable the Kohana auto-loader.
spl_autoload_register(array(‘Kohana’, ‘auto_load’));

// Enable the Kohana auto-loader for unserialization.
ini_set(‘unserialize_callback_func’, ‘spl_autoload_call’);

Initialization and Configuration(初始化和配置)

kohana调用Kohana::init来初始化,并启用日志和配置读写器。

// Sample excerpt from bootstrap.php with comments trimmed down

Kohana::init(array(‘
base_url’ => ‘/kohana/’,
index_file => false,
));

// Attach the file writer to logging. Multiple writers are supported.
Kohana::$log->attach(new Kohana_Log_File(APPPATH.’logs’));

// Attach a file reader to config. Multiple readers are supported.
Kohana::$config->attach(new Kohana_Config_File);

您可以添加条件语句,使引导具有基于某些设置不同的值。例如,我们发现无论是现场检查$_ SERVER[‘HTTP_HOST’],并设置缓存,分析,等等。因此。这仅仅是一个例子,也有许多不同的方式来完成同样的事情。
// Excerpt from http://github.com/isaiahdw/kohanaphp.com/blob/f2afe8e28b/application/bootstrap.php
… [trimmed]

/**
* Set the environment status by the domain.
*/
if (strpos($_SERVER[‘HTTP_HOST’], ‘kohanaframework.org’) !== FALSE)
{
// We are live!
Kohana::$environment = Kohana::PRODUCTION;

// Turn off notices and strict errors
error_reporting(E_ALL ^ E_NOTICE ^ E_STRICT);
}

/**
* Initialize Kohana, setting the default options.
… [trimmed]
*/
Kohana::init(array(
‘base_url’ => Kohana::$environment === Kohana::PRODUCTION ? ‘/’ : ‘/kohanaframework.org/’,
‘caching’ => Kohana::$environment === Kohana::PRODUCTION,
‘profile’ => Kohana::$environment !== Kohana::PRODUCTION,
‘index_file’ => FALSE,
));

… [trimmed]

Modules(模块)

模块使用Kohana::modules()加载进来的。包含模块是可选的。阵列中的每个键应该是模块的名称,并且该值是所述路径模块,相对或绝对的。

// Example excerpt from bootstrap.php

Kohana::modules(array(
‘database’ => MODPATH.’database’,
‘orm’ => MODPATH.’orm’,
‘userguide’ => MODPATH.’userguide’,
));

Routes(路由)

路由是由Route::set() 定义的

// The default route that comes with Kohana 3
Route::set(‘default’, ‘(<controller>(/<action>(/<id>)))’)
->defaults(array(
‘controller’ => ‘Welcome’,
‘action’ => ‘index’,
));

kohana-messages

Kohana中有一个强大的基于密钥查询系统,让您可以定义系统消息。
使用Kohana::message()来获取信息的键值:
Kohana::message(‘forms’, ‘foobar’);
这个将会取到messages/forms.php文件的foobar键值
<?php
return array(
‘foobar’ => ‘Hello, world!’,
);

你也可以拿到子目录和子键值:
Kohana::message(‘forms/contact’, ‘foobar.bar’);
这个将会拿到messages/forms/contact.php 下的[foobar][bar]的键值
<?php
return array(
‘foobar’ => array(
‘bar’ => ‘Hello, world!’,
),
);

kohana工作流

1.项目从index.php入口开始

1.设置应用,模块和系统的路径(APPPATH,MODPATH,SYSPATH)
2.设置报错等级
3.如果存在install.php,将被加载
4.包含APPPATH/bootstrap.php

2.当我们在bootstrap.php中:

1.加载kohana类
2.用于设置error handling,caching(缓存)和logging日志的Kohana::init被调用
3.连接Kohana_Config readers 和 Kohana_Log writers
4.Kohana::modules 激活被请求的模块
模块路径被添加到级联文件系统
包含存在的每个模块的init.php文件
init.php可以执行额外的环境设置,包括添加路由。
5.多次调用Route::set 来定义 应用路由
6.调用Request::factory 开始请求进程
1.检查每个设置的路由直到找到匹配的为止
2.实例化Controller并传递请求给它
3.调用Controller::before 方法
4.调用生成请求响应的控制器方法
5.调用Controller::after 方法
当使用HMVC子请求时,上面的五步将多次重复

3.应用流程回到index.php

1.显示出主请求响应。

centos7编译安装php时: error: mcrypt.h not found. Please reinstall libmcrypt

这种情况一般是没有安装 libmcrypt-devel

centos7默认yum源没有libmcrypt-devel这个包,所以只能借助第三方源或者编译安装,这里用的是第三方源

下载并安装EPEL

# wget http://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
# rpm -ivh epel-release-latest-7.noarch.rpm
# yum repolist ##检查是否已添加至源列表

安装好第三方yum源后,

yum install libmcrypt-devel

使用pecl install 命令安装扩展库报错:bash: pecl: command not found

出现这个问题是因为没有安装php的扩展开发导致的,建议将php以及apache的开发都安装上,使用如下的命令。

yum install php-devel php-pear httpd-devel

如果还不行的话,执行:yum install php-pear php5-dev

pecl install channel://pecl.php.net/libevent-0.1.0 提示libevent installation [autodetect]: 时按回车

如果报错:ERROR: `/var/tmp/libevent/configure –with-libevent’ failed

执行:yum install libevent-devel

在centos7上搭建Apache+mariadb+php7

  • 安装mariadb

# yum install mariadb-server mariadb

啟動及設定開機自動執行 MariaDB:

# systemctl start mariadb
# systemctl enable mariadb

安装Apache

# yum install httpd

跟著回答 “y” 後便會完成安裝, 然後輸入以下指令啟動及設定 Apache 開機自動執行:

# systemctl start httpd
# systemctl enable httpd

安裝 PHP 7

下载php7包到/usr/local/src/ 目录并解压

安装扩展包

# yum install gcc libxml2-devel pkgconfig openssl-devel bzip2-devel libpng-devel libpng-devel libjpeg-devel libXpm-devel freetype-devel gmp-devel libmcrypt-devel mariadb-devel aspell-devel recode-devel httpd-devel

进入php7解压包

# ./configure \
–prefix=/usr/local/php7/usr \
–with-config-file-path=/usr/local/php7/usr/etc \
–enable-mbstring \
–enable-zip \
–enable-bcmath \
–enable-pcntl \
–enable-ftp \
–enable-exif \
–enable-calendar \
–enable-sysvmsg \
–enable-sysvsem \
–enable-sysvshm \
–enable-wddx \
–with-curl \
–with-mcrypt \
–with-iconv \
–with-gmp \
–with-pspell \
–with-gd \
–with-jpeg-dir=/usr \
–with-png-dir=/usr \
–with-zlib-dir=/usr \
–with-xpm-dir=/usr \
–with-freetype-dir=/usr \
–enable-gd-native-ttf \
–enable-gd-jis-conv \
–with-openssl \
–with-pdo-mysql=/usr \
–with-gettext=/usr \
–with-zlib=/usr \
–with-bz2=/usr \
–with-recode=/usr \
–with-mysqli=/usr/bin/mysql_config \
–with-apxs2

然后

#make

#make test

#make install

复制 php.ini-development 文件到 /usr/local/lib 保存为 php.ini

编辑Apache配置文件 /etc/httpd/conf/httpd.conf  加入以下内容

LoadModule php7_module /usr/lib64/httpd/modules/libphp7.so
<FilesMatch \.php$>
SetHandler application/x-httpd-php
</FilesMatch>

保存后重启Apache