thinkphp u函数解析出现.php路径

原文:http://www.linuxde.net/2014/12/15635.html

thinkphp在Nginx没有pathinfo的情况出现.PHP的文件,这个让人很是纠结。在服务器是Linux,web服务器是nginx, CGI接口是FASTCGI,就会出现这个问题。

问题原因:ThinkPHP/common/runtime.php中定义IS_CGI常量的定义有问题;错误代码:

thinkphp在nginx没有pathinfo的情况出现.php的URL的解决方法
在fpm下,PHP_SAPI的值是fpm-fcgi,所以判断IS_CGI为0。导致在定义_PHP_FILE_常量时错误,进而导致 ThinkPHP/Lib/Core/Dispatcher.class.php中定义__APP__常量值错误。而ThinkPHP/Common /functions.php中U()方法定义用到__APP__,导致U()创建的URL错误;U()部分代码:

thinkphp在nginx没有pathinfo的情况出现.php的URL的解决方法
简单来说,当cgi.fix_pathinfo=0时,_PHP_FILE_获取的值是.php,导致U函数生成URL不正确,改为1后,_PHP_FILE_获取的值是index.php。

但是cgi.fix_pathinfo=1时会有安全隐患,目前暂时先把代码改成如下了:

if (IS_CGI) {
//CGI/FASTCGI模式下
//$_temp = explode(‘.php’,$_SERVER[‘PHP_SELF’]);
//define(‘_PHP_FILE_’, rtrim(str_replace($_SERVER[‘HTTP_HOST’],”,
//$_temp[0].’.php’),’/’));
define(‘_PHP_FILE_’, rtrim($_SERVER[‘SCRIPT_NAME’], ‘/’));
} else {
define(‘_PHP_FILE_’, rtrim($_SERVER[‘SCRIPT_NAME’], ‘/’));
}

thinkphp5中遇到的一些问题

thinkphp5中遇到的一些问题:

在控制器中查询一个表的数据,例如查询user表的用户列表
\think\Db::name(‘user’)->where(‘status’,1)->select();
上面这句是可以执行的,因为加了\think\命名空间,而官方文档中写的是下面,可能导致看文档的人误解
Db::name(‘user’)->where(‘status’,1)->select();

也可以在控制器中直接用助手函数,这种方式最为方便简单。
db(‘user’)->where(‘status’,1)->select();

另外,如果你在model/user.php这个模型是存在的,那么也可以在控制器中用如下方法
$user = new User();
$user->where(‘status’,1)->select();

————————————————-
另外,如果数据库配置文件里面
// 数据集返回类型
‘resultset_type’ => ‘collection’,
那么,上面的那些返回就是一个集合对象,而不是一个数组,但是可以和数组无差别使用
具体collection包含的方法,请参考
https://www.kancloud.cn/manual/thinkphp5/150164

附:
thinkphp5.x之Collection(集合)解析 php集合
http://blog.csdn.net/fenglailea/article/details/52723586

thinkphp设置404页面

听说所有的文件会从index.php进来,所以理论上就不存在404,但是又要404,网上找的。
注意下文件的路径问题,因为每个项目的环境不一样。

第一步,
在Lib/Action文件夹下创建EmptyAction.class.php

<?php
	class EmptyAction extends Action 
	{
		function _empty()
		{
			header("HTTP/1.0 404 Not Found");
			$this->display('Public:404');
		} 
		// 404
		function index() 
		{
			header("HTTP/1.0 404 Not Found");
			$this->display('Public:404');
		}	
	}

第二步,
修改Lib/Action文件夹下所有的Action文件
添加一个方法

	function _empty()
	{
		header("HTTP/1.0 404 Not Found");
		$this->display('Public:404');
	}

第三步,
在Tpl/Public文件夹下创建404.html

http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<META http-equiv=refresh content="20;URL = http://666vpn.com/">
<title>您访问的网页不存在...</title> 
</head>
<body>
<style type="text/css">
body,ul,ol,li,p,dt,dl,dd,h1,h2,h3,h4,h5,h6,form,fieldset,table,td,th,img,div{margin:0;padding:0}
img { border:0}
body{background:#fff;color:#333;font-size:12px;font-family:Arial,'宋体'}
ul,ol{list-style:none}
h2,h3,h4,h5,h6,em,stone,i{font-size:12px;font-weight:400}
select,input,select{vertical-align:middle}
a:link,a:visited{color:#333;text-decoration:none}
a:hover,a:active,a:focus{color:#f60;text-decoration:underline}
.clear{clear:both}
.left { float:left; display:inline-block}
.wrap { width:960px; overflow:hidden; margin:0 auto;}
#top { height:43px; overflow:hidden; background:#343434; width:100%}
#top ul { margin-left:20px;}
#top li { float:left; display:inline-block; padding:0 15px;}
#top a { color:#fff; font-size:14px; line-height:43px;}
.login { float:right; display:inline-block;}
.login a { padding-left:10px;}
.m404 {margin:100px auto; vertical-align:middle; text-align:center}
</style>
<div class="m404">
<a href="http://666vpn.com/"><img src="/Public/images/404.png" width="409" height="177" alt="真的很抱歉,我们搞丢了页面……要不去网站首页看看" border="0"></a></div>
</body>
</html>

thinkphp前台模版字符串截取

转载自:http://blog.21514.com/archives/269
ThinkPHP\Common\extend.php 中管理前台模版的截取{$vons.title|msubstr=0,26}
原始的代码是无法使用截取支持…. 由于涉及到只有汉字检测最为准确
需要加入代码让他正常的分页截取之后加入…

function msubstr($str, $start=0, $length, $charset="utf-8", $suffix=true)
{
	if(strlen($str)/3>$length)
	{
		if(function_exists("mb_substr"))	
		{
			return mb_substr($str, $start, $length, $charset).'…';
		}
		elseif(function_exists('iconv_substr')) 
		{
			return iconv_substr($str,$start,$length,$charset).'…';
		}
		$re['utf-8']   	= 	"/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xff][\x80-\xbf]{3}/";
		$re['gb2312'] 	= 	"/[\x01-\x7f]|[\xb0-\xf7][\xa0-\xfe]/";
		$re['gbk']    	= 	"/[\x01-\x7f]|[\x81-\xfe][\x40-\xfe]/";
		$re['big5']   	= 	"/[\x01-\x7f]|[\x81-\xfe]([\x40-\x7e]|\xa1-\xfe])/";
		preg_match_all($re[$charset], $str, $match);
		$slice 			= 	join("",array_slice($match[0], $start, $length));
		if($suffix)
		{
			return $slice;
		}
		else
		{
			return $slice;
		}
	}
	return $str;
}

ThinkPhp支付宝验证失败

原因是因为thinkphp会在post时多带一个参数_URL_
把它给过滤就好了
修改alipay_core.function.php

/**
 * 除去数组中的空值和签名参数
 * @param $para 签名参数组
 * return 去掉空值与签名参数后的新签名参数组
 
function paraFilter($para) {
	$para_filter = array();
	while (list ($key, $val) = each ($para)) {
		if($key == "sign" || $key == "sign_type" || $val == "")continue;
		else	$para_filter[$key] = $para[$key];
	}
	return $para_filter;
}
*/
function paraFilter($para) {
 
    $para_filter = array();
 
    foreach ($para as $key => $val) {
 
        if($key == "sign" || $key == "sign_type" || $key == "_URL_" || $val == "")continue;
        else    $para_filter[$key] = $para[$key];
    }
    return $para_filter;
}