分类目录归档:PHP

全球使用最多的网站开发技术

Access denied for user ‘xxx ‘@’localhost’ (using password: YES) ThinkPHP

老站点,TP3.2开发的,最近转移到新服务器,检查数据库名、账号密码等各项配置都没错,却依旧出现下面错误提示:

Access denied for user ‘xxx ‘@’localhost’ (using password: YES) ThinkPHP

将数据库连接地址 localhost 更改成 127.0.0.1 ,, 问题依旧;

将PHP版本降回php5.3,,问题依旧;

清空 /app/Runtime/ 目录,,问题解决。准确来说 是 删除了 /app/Runtime/common~runtime.php 这个文件之后,网站可以正常访问了 。

Thinkphp目录结构以及相应权限设置

ThinkPHP 的目录结构非常清晰和容易部署。大致的目录结构如下,以项目为基础进行部署。
┎━ThinkPHP 框架系统目录
┃ ┝ ThinkPHP.php 系统公共文件
┃ ┝ Common 公共文件目录
┃ ┝ Tpl 框架系统模版目录
┃ ┝ Lang 系统语言包目录
┃ ┝ PlugIns 公共插件目录
┃ ┗ Lib 系统基类库目录
┃ ┝ Think 系统运行库(必须)
┃ ┝ Com 扩展类库包(非必须)
┃ ┗ ORG 扩展类库包(非必须)

┝━App App 项目目录
┃ ┝ index.php 项目入口文件(可任意放置)
┃ ┝ Cache 模版缓存目录
┃ ┝ Common 公共文件目录(非必须)
┃ ┝ Conf 项目配置目录
┃ ┝ Data 项目数据目录
┃ ┝ Html 静态文件目录(非必须)
┃ ┝ PlugIns 插件目录(非必须)
┃ ┝ Tpl 模版文件目录
┃ ┝ Lang 语言包目录(非必须)
┃ ┝ Logs 日志文件目录
┃ ┝ Temp 数据缓存目录
┃ ┗ Lib 应用类库目录
┃ ┝ Action 控制器(模块)类目录
┃ ┝ Model Model 类文件目录
┃ … 下面的应用目录可根据需要选择和定义
┃ ┝ Exception 异常类库目录
┃ ┝ Common 公共应用类目录
┃ ┗ Help 助手类目录

┃…更多项目目录(和App 目录类似,每个项目采用独立目录,便于部署)

┝━Public 网站公共目录(多项目公用)
┃ ┝ Js JS 类库目录(建议)
┃ ┝ Images 公共图像目录(建议)
┃ ┗ Uploads 公共上传目录(建议)
ThinkPHP 框架除了模板目录和网站入口文件必须放到 WEB 目录下之外,其它所有框架的文件和目录可以单独存放,不受限制,您需要做的仅仅是在首页文件中指定ThinkPHP 框架的包含目录,我们建议您如果可能的话把 ThinkPHP 框架的目录包放到其它网站不能访问的目录下面,以保障应用的安全性。项目独立目录,方便部署和团队开发。每个项目有自身的配置文件、语言文件、插件文件和日志文件。 如果在类Linux 环境下面部署,需要对以下目录设置可写权限(这些目录仅仅针对项目目录,系统目录无需设置任何可写权限,因为每个项目的模版缓存和数据缓存,以及日志文件都是独立的)。 项目目录下面的 Cache(模版缓存目录)、Temp(数据缓存目录)、Conf(项目配置目录,写入权限用于自动生成配置缓存和插件缓存文件)、 Logs(日志文件目录)、如果设置了 Uploads 上传目录和 Data 数据目录的话也必须设置为可写。
另外,如果设置了 Public 目录下面的 Uploads 目录作为公共上传目录,也需要设置可写权限。通常的设置都是设置目录属性为 777。 一定要注意在 Linux 环境下面的文件大小写问题,否则会导致文件加载错误。

CI如何去掉URL中的index.php

前提:服务器是 Apache,支持 mod_rewrite。
在 CI 根目录(与index.php同级) 下新建立一个txt文件,命名为: .htaccess (注意不带后缀名txt)。在文件中输入:
RewriteEngine on
RewriteRule ^(.*)$ /index.php/$1 [L]
第二行中 /index.php/ 要根据index.php相对于根目录的路径修改。我的访问的时候用http://www.yanfei.info/ci/ 那就改为 /ci/index.php/
打开applicationconfig中的 config.php
$config[‘index_page’] = “index.php”;修改成$config[‘index_page’] = “”;
 
OK

smarty比较操作符详细对照表

smarty 比较操作符对照表

操作符 中文解释
eq 相等
ne、neq 不相等
gt 大于
lt 小于
gte、ge 大于等于
lte、le 小于等于
not
mod 求模
is [not] div by 是否能被某数整除
is [not] even 是否为偶数
is [not] odd 是否为奇

使用示例:
$a is [not] even by $b即($a / $b) % 2 == 0
$a is not odd by $b即($a / $b) % 2 != 0
以上操作符可用在Smarty中的if语句,也可使用在else和elseif句中.以上修饰词: eq、ne、neq、gt、lt、lte、le、gte、ge、is even、is odd、is not even、is not odd、not、mod、div by、even by、odd by、==、!=、>、<、<=、>=. 在使用这些修饰词时,必须和变量或常量用空格格开.

php 数组去重复[转]

去除数组中的重复项
一维数组的重复项:
使用array_unique函数即可,使用实例如下:

<?php
$aa=array(“apple”,”banana”,”pear”,”apple”,”wail”,”watermalon”);
$bb=array_unique($aa);
print_r($bb);
?>

结果如下:Array ( [0] => apple [1] => banana [2] => pear [4] => wail [5] => watermalon ) 。
二维数组的重复项:
对于二维数组咱们分两种情况讨论,一种是因为某一键名的值不能重复,删除重复项;另一种因为内部的一维数组不能完全相同,而删除重复项,下面举例说明:
㈠因为某一键名的值不能重复,删除重复项

<?php
function assoc_unique($arr, $key)
{
$tmp_arr = array();
foreach($arr as $k => $v)
{
if(in_array($v[$key], $tmp_arr))//搜索$v[$key]是否在$tmp_arr数组中存在,若存在返回true
{
unset($arr[$k]);
}
else {
$tmp_arr[] = $v[$key];
}
}
sort($arr); //sort函数对数组进行排序
return $arr;
}
$aa = array(
array(‘id’ => 123, ‘name’ => ‘张三’),
array(‘id’ => 123, ‘name’ => ‘李四’),
array(‘id’ => 124, ‘name’ => ‘王五’),
array(‘id’ => 125, ‘name’ => ‘赵六’),
array(‘id’ => 126, ‘name’ => ‘赵六’)
);
$key = ‘id’;
assoc_unique(&$aa, $key);
print_r($aa);
?>

显示结果为:Array ( [0] => Array ( [id] => 123 [name] => 张三 ) [1] => Array ( [id] => 124 [name] => 王五 ) [2] => Array ( [id] => 125 [name] => 赵六 ) [3] => Array ( [id] => 126 [name] => 赵六 ) )
㈡因内部的一维数组不能完全相同,而删除重复项

<?php
function array_unique_fb($array2D){
foreach ($array2D as $v){
$v = join(“,”,$v); //降维,也可以用implode,将一维数组转换为用逗号连接的字符串
$temp[] = $v;
}
$temp = array_unique($temp); //去掉重复的字符串,也就是重复的一维数组
foreach ($temp as $k => $v){
$temp[$k] = explode(“,”,$v); //再将拆开的数组重新组装
}
return $temp;
}
$aa = array(
array(‘id’ => 123, ‘name’ => ‘张三’),
array(‘id’ => 123, ‘name’ => ‘李四’),
array(‘id’ => 124, ‘name’ => ‘王五’),
array(‘id’ => 123, ‘name’ => ‘李四’),
array(‘id’ => 126, ‘name’ => ‘赵六’)
);
$bb=array_unique_fb($aa);
print_r($bb)
?>

显示结果:Array ( [0] => Array ( [0] => 123 [1] => 张三 ) [1] => Array ( [0] => 123 [1] => 李四 ) [2] => Array ( [0] => 124 [1] => 王五 ) [4] => Array ( [0] => 126 [1] => 赵六 ) )

get_headers()返回"HTTP request failed!" (Read 1135 times)

<?php
// print_r(get_headers(‘http://www.digg.com’, 1));
// print_r(get_headers(‘http://digg.com’, 1));
?>

Warning: get_headers(http://www.digg.com) [function.get-headers]: failed to open stream: HTTP request failed! in /home/jacob/workspace/tester.php on line 3
Warning: get_headers(http://www.digg.com) [function.get-headers]: failed to open stream: HTTP request failed! in /home/jacob/workspace/tester.php on line 6

Is allow_url_fopen set to true within your php.ini? If not the function will fail right away.

即,php.ini文件中打开allow_url_fopen。

opencart开发架构分析[转]

1. opencart的系统架构
1.1. 架构分析
opencart是有自己的开发架构的,其架构的核心都在systemengine 下,访问控制统一用 根目录下的 index.php 来协调。
Route 就是起到一个中转器的作用,它会根据你的Route目录去找到它要执行的方法,比如:

index.php?route=account/login

根据这个route,op的框架会找到Controller下的Account里的Login.php, 注意login.php的类名一定是这种格式的

ControllerAccoutLogin{…}

否则Op就识别不了目录,route=account/login 会执行类的默认方法:index
如果要指明执行那个方法,则在login后面再加上

route=account/login/你定义的方法名

并且在login.php 里定义你要执行的方法。
同理,Op里 load 语言包和model等都是以这种机制为基础的。请结合程序,应该是比较好理解的。
至于View层,Op都是把要显示的数据加载到 this->data里去的,这样就可以用 $变量名 在页面上显示变量了。
1.2. Op系统配置文件 (这段是引用别人的。。。找不到出处了 – – 作者看到请联系我)
在Op的目录下,可以发现一个 Config.php文件,这里是配置一些OP要使用到的配置路径,并且是每个单独项目里都有一个单独的配置(这点要注意),比如admin和catalog下就分别有这个文件。
OpenCart是使用面向对象编程的,同时又使用了MVC的设计思想,因此在解读其源代码时是看不到过程式的代码的。同时它把MVC框架部分单独放在library目录中,这个部分的内容一般是不作修改的。就象你显式地使用其它框架编程一样。
Engine下有一个装配器文件:loader.php,这个文件中只有一个类:loader,实际上是一个调度程序,框架中的其它组件,如controller,module,session,cache,language统统由它装载调度。
为了让系统运行起来, 象所有的PHP程序一样,OpenCart需要把系统中的一些重要的参数从config.php中,对于这个文件,按惯例,使用一句:

require(‘config.php’);

连接数据库的DSN参数和相关目录设置就可用了,下面有必要将config.php文件列表在下,这有利于我们理解OpenCart的设计思想:

// HTTP
define(‘HTTP_SERVER’, ‘http://localhost/cnopencart/’);
define(‘HTTP_IMAGE’, ‘http://localhost/cnopencart/image/’);
// HTTPS
define(‘HTTPS_SERVER’, ”);
define(‘HTTPS_IMAGE’, ”);
// DIR
define(‘DIR_CACHE’, ‘C:wampwwwcnopencart/cache/’);
define(‘DIR_DOWNLOAD’, ‘C:wampwwwcnopencart/download/’);
define(‘DIR_IMAGE’, ‘C:wampwwwcnopencart/image/’);
define(‘DIR_LIBRARY’, ‘C:wampwwwcnopencart/library/’);
define(‘DIR_MODEL’, ‘C:wampwwwcnopencartcatalog/model/’);
define(‘DIR_CONTROLLER’, ‘C:wampwwwcnopencartcatalog/controller/’);
define(‘DIR_LANGUAGE’, ‘C:wampwwwcnopencartcatalog/language/’);
define(‘DIR_EXTENSION’, ‘C:wampwwwcnopencartcatalog/extension/’);
define(‘DIR_TEMPLATE’, ‘C:wampwwwcnopencartcatalog/template/’);
// DB
define(‘DB_HOST’, ‘localhost’);
define(‘DB_USER’, ‘root’);
define(‘DB_PASSWORD’, ‘111111’);
define(‘DB_NAME’, ‘opencart’);
?>

与别的系统可能有些不同是的,OpenCart有一个config类用来从别的设置文件或数据库里存取数据,这些数据也是在程序一开始运行就需要的,因此第一个由loader装载的就是config类,装载config类就只简单地用了一句:

// Config
$config =$this->load->….

其它所有的对象这是以这种方法来进行管理。
2. Op的加载器
2.1. 系统加载
在System下有一些公共类,所以的基础类和公共类都是通过index.php 去加载的,这样你就可以去加载你需要的类和文件了。比如:

$loader = new Loader();
Registry::set(‘load’, $loader);

然后你就可以在系统里调用Load方法去加载需要的Model和language 文件了。调用方式如下:

$this->load->….

Op里就是通过这个方法来注册他所需要的资源的。