欢迎光临
我们一直在努力

No input file specified的解决方法

(一)IIS Noinput file specified

方法一:改PHP.ini中的doc_root行,打开ini文件注释掉此行,然后重启IIS

方法二:
请修改php.ini
找到

; cgi.force_redirect = 1

去掉前面分号,把后面的1改为0

cgi.force_redirect = 0

(二)apacheNo input file specified

apache No input filespecified,今天是我们配置apache RewriteRule时出现这种问题,解决办法很简单如下

打开.htaccess 在RewriteRule 后面的index.php教程后面添加一个“?”

完整代码如下

.htaccess
RewriteEngine on
RewriteCond $1 !^(index.php|images|robots.txt)
RewriteRule ^(.*)$ /index.php?/$1 [L]

如果是apache服务器出问题,看看是不是的Apache 把 .php 后缀的文件解析哪里有问题了。

总结

Apache 将哪些后缀作为 PHP 解析。例如,让 Apache 把 .php 后缀的文件解析为PHP。可以将任何后缀的文件解析为 PHP,只要在以下语句中加入并用空格分开。这里以添加一个 .phtml 来示例。
AddType application/x-httpd-php .php .phtml
为了将 .phps教程作为 PHP 的源文件进行语法高亮显示,还可以加上:
AddType application/x-httpd-php-source .phps
用通常的过程启动 Apache(必须完全停止 Apache 再重新启动,而不是用 HUP 或者USR1 信号使 Apache 重新加载)。

(三)nginx配置遭遇No inputfile specified

虚拟机测试nginx 遭遇 Noinput file specified,多方查找终于找到解决办法

1、 php.ini(/etc/php5/cgi/php.ini)的配置中这两项

cgi.fix_pathinfo=1  (这个是自己添加的)
doc_root=

 

2、nginx配置文件/etc/nginx/sites-available/default中注意以下部分

location ~ \.php$ {
fastcgi_pass   127.0.0.1:9000;
fastcgi_index  index.php;
fastcgi_param  SCRIPT_FILENAME  /var/www/nginx-default$fastcgi_script_name;
include              fastcgi_params;
}

红色部分路径需要根据你主机主目录的实际情况填写

配置完以上部分,重启一下service nginx restart,应该没问题了

(四)注意检查下网站目录是否有相关用户的写入权限

PHP文件上传

HTML中使用type=”file”类型的表单可向服务器上传文件,服务端使用PHP接收文件数据和接收普通表单元素数据的处理方法稍有不同。例如:

<form action="user.php" enctype="multipart/form-data" method="post"

name="upvideo">

上传文件:<input type="file" name="video" />

<input type="submit" value="上传" />

</form>

上传文件的表单必须在form中定义enctype=”multipart/form-data”。此时用于接收文件信息的代码如下:

<?php

var_dump($_POST);

var_dump($_FILES);

if ($_FILES["video"]["error"] > 0)

{

echo "Error: " . $_FILES["video"]["error"] . "<br />";

} else {

print_r($_FILES["video"]);

if(is_uploaded_file($_FILES['video']['tmp_name'])){

$upfile=$_FILES["video"];

//获取数组里面的值

$name=$upfile["name"];//上传文件的文件名

$type=$upfile["type"];//上传文件的类型

$size=$upfile["size"];//上传文件的大小

$tmp_name=$upfile["tmp_name"];//上传文件的临时存放路径

// 移动上传的文件到指定目录

move_uploaded_file($tmp_name, '/Library/WebServer/Documents/book/'.$name);

}

}

?>

执行上述上传文件操作,打印结果如下:

 

array(0) { } array(1) { ["video"]=> array(5) { ["name"]=> string(14) "linux icon.gif" ["type"]=> string(9) "image/gif" ["tmp_name"]=> string(26) "/private/var/tmp/phpyiMCwf" ["error"]=> int(0) ["size"]=> int(15712) } } Array ( [name] => linux icon.gif [type] => image/gif [tmp_name] => /private/var/tmp/phpyiMCwf [error] => 0 [size] => 15712 )

 

第一个数组为空,表明在使用file类型表单提交数据时并不使用$_POST接收数据,而是使用全局变量$_FILE来接收。PHP中使用move_uploaded_file函数将上传的文件移动到指定位置。

另外,在PHP配置文件php.ini中默认上传文件的大小只有2MB,在上传大文件时需要对配置文件进行修改。php.ini中有关上传文件的设置如下:

  • file_uploads 是否允许HTTP文件上传,默认值为On,允许HTTP文件上传,此选项不能设置为Off。
  • upload_tmp_dir 文件上传的临时存放目录。如果没指定,那么PHP会使用系统默认的临时目录。该选项默认为空,如果不配置这个选项,文件上传功能就无法实现。
  • upload_max_filesize 上传文件的最大尺寸。这个选项默认值为2MB,即文件上传的大小为2MB,如果想上传一个50MB的文件,就必须设定upload_max_filesize = 50M。 仅设置upload_max_filesize = 50M 还是无法实现大文件的上传功能,还必须修改php.ini文件中的 post_max_size 选项。
  • post_max_size 通过表单POST给PHP所能接收的最大值,包括表单里的所有值,默认为8MB。如果POST数据超出限制,那么$_POST和$_FILES将会为空。 要上传大文件,必须设定该选项值大于upload_max_filesize选项的值,例如设置了upload_max_filesize = 50M ,这里就可以设置post_max_size = 100M。 另外,如果启用了内存限制,那么该值应当小于memory_limit选项的值。
  • max_execution_time 每个PHP页面运行的最大时间值(单位秒),默认为30秒。当我们上传一个较大的文件时,例如50MB,很可能要几分钟才能上传完,但PHP默认页面最久执行时间为30秒,超过30秒该脚本就停止执行,导致出现无法打开网页的情况。因此我们可以把值设置得较大些,如 max_execution_time = 600。 如果设置为0,就表示无时间限制。
  • max_input_time 每个PHP脚本解析请求数据所用的时间(单位秒),默认为60秒。当我们上传大文件时,可以将这个值设置得较大些。如果设置为0,就表示无时间限制。
  • memory_limit 这个选项用来设置单个PHP脚本所能申请到的最大内存空间。这有助于防止写得不好的脚本消耗光服务器上的可用内存。如果不需要任何内存上的限制将其设为 -1。

php.ini配置上传文件功能示例

假设要上传一个50MB的大文件,php.ini配置如下:

file_uploads = On

upload_tmp_dir = "/user/file"

upload_max_filesize = 50M

post_max_size = 100M

max_execution_time = 600

max_input_time = 600

max_input_time = 600

 

小例子:

<?php

$file = $_FILES['file'];

$src = '';
if($file){
    $src = 'uploads/'.$file['name'];
    copy($file['tmp_name'],$src);
}

?>
<html>
<head>
    <meta charset="utf-8">
    <title>文件上传</title>
</head>
<body>
<form action="" enctype="multipart/form-data" method="post">
    <input type="file" name="file">
    <input type="submit" name="dosubmit" value="确定">
</form>

<div>
    <img src="<?php echo $src;?>" alt="">
</div>

</body>
</html>

 

PHP 命名空间

1. PHP中的命名空间是什么?

官方解释在此: 命名空间概述

命名空间用一句话说,就是:把 类、函数、变量 等放到逻辑子文件夹中去,以避免命名冲突。

注:命名空间跟实际代码文件在文件系统中的路径没有任何关系,如果你感到迷茫,可以看看本文最后一节。

2. 被隐藏的第一个 \

在每个 PHP 文件的最开始定义命名空间:

<?php namespace TinyLara\TinyRoute;

class TinyRoute {
  ...
}

在定义命名空间之后引入命名空间:

<?php namespace TinyLara\TinyRoute;

use TinyLara\TinyView\TinyView;

class TinyRoute {
  ...
}

上述代码中,

namespace TinyLara\TinyRoute
use TinyLara\TinyView\TinyView

这两行的真实路径是: \TinyLara\TinyRoute、\TinyLara\TinyView\TinyView,顶级命名空间标识(第一个 \ )被省略了。

3. 被隐藏的别名

在上一节中中,这一行代码

use TinyLara\TinyView\TinyView

的完整写法应该是:

use \TinyLara\TinyView\TinyView as TinyView;

如果不指定别名,那就默认别名为类名。

4. 使用绝对路径直接调用

<?php namespace TinyLara\TinyRoute;

class TinyRoute {
    public function foo()
    {
        return \TinyLara\TinyView\TinyView::fuck();
    }
}

使用绝对路径调用类时顶级命名空间标识(第一个 \ )不能省略。(很多人都在这个地方迷惑了)

5. 命名空间的实际价值

命名空间的存在是为了解决下面两个问题:

  1. 用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突。
  2. 为很长的标识符名称(通常是为了缓解第一类问题而定义的)创建一个别名(或简短)的名称,提高源代码的可读性。

目前非常流行的 Composer 就是一个基于命名空间的包管理器/依赖管理器,同样,Laravel 能达到今天的成功,很大程度上也是因为PHP5.3的普及,生恰逢时。你可以在 https://packagist.org/ 上下载到各种 composer 包,类似于 yum、npm或者gem。

6. 同一命名空间下的类可以任意相互调用

<?php namespace A;

class ClassA {
  public static function test() {
    echo 'Success!';
  }
}
<?php namespace A;

class ClassB {
  public static function test() {
    ClassA::test(); // 直接调用即可
  }
}

直接调用即可。

7. 关于代码文件的结构

PSR-4 命名空间规范约定了 PHP 类的命名空间应该和实际在文件系统中的位置一致,而现实中绝大多数 PHP 框架为了方便都采纳了这条规范,最明显的就是 Laravel 4 到 5 的转变。在这种情况下,我发现不少新手又迷茫了,错误地理解了我在上文中的阐述的“路径”的概念。基于此我要简单讲述一下 PHP 运行的基本流程,我相信看完你们就不会再有上面的误解了。

PHP 运行流程

在一个典型的 Apache +  mod_php 架构的 PHP 运行环境中,一个 PHP 网站是这样运行的:

  1. Apache 收到用户的 HTTP 请求
  2. 这个请求是以 .php 结尾或者是一个不存在的路径(.htaccess 会将其转发到 index.php)
  3. Apache 的 mod_php 会启动一个新的 PHP 进程(PHP 解释器),读取 HTTP 请求的 URL 中的那个 .php 文件或者 index.php
  4. 被读取进 PHP 解释器的字符串被按照 PHP 的语法进行解析。为了方便理解,我们将这些经过解析的字符串所生成的 context(上下文)命名为 Matrix
  5. 然后 PHP 解释器会根据从 Matrix 中解析出的特定 PHP 语句(如 require)载入其他 PHP 文件,并将其内容以字符串的形式加入 Matrix
  6. 最终 Matrix 变成一个数万行代码的巨型上下文(为了便于理解可以想象成巨长的代码文件字符串),PHP 解释器会按照 PHP 语法执行 Matrix,进行数据库连接、网络请求、文件读写等操作
  7. 每一次的 echo 都会被写入到输出缓冲区,最终这个巨长的代码字符串被执行完毕,PHP 进程退出内存
  8. 缓冲区中就是要发给用户的 HTTP response,其实就是一堆字符串,只不过它遵守 HTML 规范,可以被浏览器解析。这一堆字符串被 Apache 发送回用户的浏览器,浏览器渲染,用户看到内容

命名空间在哪里?

命名空间从始至终就是一个“内部伪概念”,只是用于解决类和变量的命名冲突,从来就跟实际文件结构没有半毛钱的关系。让大家疑惑的其实是自动加载,当它和命名空间混杂在一起的时候,就不容易理解了。命名空间从来就是一个纯 PHP 内部的概念,你可以把整个 Laravel 框架的所有文件合并成一个巨大的 PHP 文件,取消自动加载,除了性能会损失一些,功能不会受到任何影响,命名空间依旧运转良好。

实际上 Laravel 提供类似的功能:Laravel 5 程序优化技巧——3. 类映射加载优化

PHP实现队列及队列原理

队列是一种线性表,按照先进先出的原则进行的:

 

 

 

 

 

PHP实现队列:第一个元素作为队头,最后一个元素作为队尾

<?php
/**
 * 队列就是这么简单
 * 
 * @link
 */
$array =  array('PHP', 'JAVA');
array_push($array, 'PYTHON'); //入队列
array_shift($array); //出队列

什么是双端队列(或双向队列)Deque,全名double-ended queue?

即元素可以在队列的任意一段入队或出队,如果我们把这些方法叫做insertLeft()和insertRight(),以及removeLeft()和removeRight()。如果严格禁止调用insertLeft()和removeLeft()方法(或禁用右段的操作),双端队列功能就和栈一样。禁止调用insertLeft()和removeRight()(或相反的另一对方法),它的功能就和队列一样了。双端队列与栈或队列相比,是一种多用途的数据结构。

PHP实现双端队列

<?php
class Deque  
{ 
    public $queue = array(); 
    
    /**(尾部)入队  **/ 
    public function addLast($value)  
    { 
        return array_push($this->queue,$value); 
    } 
    /**(尾部)出队**/ 
    public function removeLast()  
    { 
        return array_pop($this->queue); 
    } 
    /**(头部)入队**/ 
    public function addFirst($value)  
    { 
        return array_unshift($this->queue,$value); 
    } 
    /**(头部)出队**/ 
    public function removeFirst()  
    { 
        return array_shift($this->queue); 
    } 
    /**清空队列**/ 
    public function makeEmpty()  
    { 
        unset($this->queue);
    } 
    
    /**获取列头**/
    public function getFirst()  
    { 
        return reset($this->queue); 
    } 
 
    /** 获取列尾 **/
    public function getLast()  
    { 
        return end($this->queue); 
    }
 
    /** 获取长度 **/
    public function getLength()  
    { 
        return count($this->queue); 
    }
    
}

php在app开发中的应用

php作为服务端的开发语言在app开发中扮演着连接客户端和数据库的角色,客户端通过调用由php开发的接口完成对数据库的操作,php代码中实现用户业务逻辑的部分。客户端需要传递一些参数给服务端php,这些参数的格式由客户端开发人员和服务端开发人员共同协商制定,两者遵循同一套标准,使得双方之间传递的数据能够被正确解析。在实际开发中json格式的数据被广泛用于客户端和服务端数据的交互,几乎每种语言都支持json数据的解析,在php中使用json_encode()和json_decode()便可,非常便捷。

在php为app开发接口中需要注意以下几点:

1、数据传输建议使用json,json具有很强的跨平台性,大多编程语言都支持json解析,json正在逐步取代xml,成为网络数据的通用格式。

2、为了保证接口安全,一定要加入鉴权体系,确保请求php接口的是合法来源。另外对于传输的数据也可以使用加密技术,本书第20章有讲述关于api接口签名和信息加密的内容。

3、对于线上的API,尽量使用error_reporting(0)关闭错误提示,或者把错误提示写入到日志中,方便日后排查。这样做的目的,一方面可以保护接口安全,防止输出不该打印的错误信息,另一方面是保证输出的是正确的数据格式,防止输出错误信息被客户端错误解析而出现的接口调用异常。

4、开发 API 和 WEB 有一定的区别,如果接口返回的格式不规范,被客户端拿到解析,可能会导致客户端闪退崩溃等情况的出现,所以在接口上线之前一定要充分的测试。

5、尽可能保证php写出的代码的性能,手机应用比web应用对响应速度的要求更高,因为用户手机性能的巨大差异,手机应用在从服务端取到数据后要进行数据重组页面渲染等会比web应用消耗更多的时间。

客户端和服务端之间选定json作为数据传输格式,之后便要约定json中各字段的含义,一般在json数据中定义至少三个字段,分别为返回状态码,返回状态描述和数据内容。比如一个定义返回用户信息的的json数据如下:

{“code":0,"msg":"success","data":{"name":"chenxiaolong","age":"22","gender":"male"}}

其中code值为0表示客户端此次请求接口成功,msg字段说明此次请求的状态,与返回状态码code对应,data中是客户端想要取到的具体内容,里面包含服务端返回的用户信息。在data字段开发者可根据不同的接口需要定义不同的字段格式。

此接口的简单代码示例如下:

function getUserInfo() {

$uid = $_REQUEST[‘uid'];

$user = new User();

if($data = $user->findByUid($uid) != false) {

$this->output($data);

} else {

$this->output('',1,'invalid uid');

}

}

客户端通过调用getUserInfo接口并传入用户的uid参数,php接收该参数到mysql数据库用户表里根据此uid查询用户相关信息,其中User是一个封装的用户表模型,它提供根据用户uid查询用户信息的findByUid方法,如果查询到用户信息就输出用户信息,否则返回错误信息给到客户端,此处返回的错误状态码定义为1,表示不合法的uid,即在用户表里没有查询到该uid对应的数据记录。

接口用到了一个公用output方法,此方法是输出json数据的具体实现,示例代码如下:

 

function output(,$data='',$code=0,$msg='success') {

$out = array('code'=$code,'msg'=>$msg,'data'=>$data);

echo json_encode($out);

}

注意向客户端返回数据时使用的是echo输出而不是return。

ecshop 常见问题汇总

1、如何修改网站”欢迎光临本店”
回答(1) languages\zh_cn\common.php文件中, $_LANG[‘welcome’] = ‘欢迎光临本店’;将他修改成你需要的字样。
还有member_info.lbi里面的welcome字样。

回答(2) 打开网站后台-模板选择-语言项编辑选择公共语言包-搜索“欢迎”进行修改(ecshop开发中心推荐这种办法修改)

 

2、如何修改登录\注册字体的颜色

在库文件member_info.lbi 中修改

 

3、如何修改首页”热门搜索关键字”
后台-系统设置-网店设置-显示设置-首页搜索关键字,修改他的内容,然后保存,必须是英文半角字符隔开

 

4、如何修改首页标题 “Powered by ECShop”
includes/lib_main.php,找到$page_title = $GLOBALS[‘_CFG’][‘shop_title’] . ‘ – ‘ . ‘Powered by ECShop’;修改成$page_title = $GLOBALS[‘_CFG’][‘shop_title’]就可以了。
详情请见图文教程http://www.68ecshop.com/article-664.html   视频教程 http://www.68ecshop.com/article-665.html

 

5、如何发布首页公告
后台->系统设置->商店设置->网店信息->商店公告.

 

6、如何修改网站logo
用你的logo图片替换/themes/当前使用模板/images/logo.gif (以你当前logo图的名称为准)详见http://115.28.41.150/article-321.html

 

7、如何去除ecshop产品详细页产品点击率
模板文件中,打开goods.dwt,删除<strong>{$lang.goods_click_count}:</strong>{$goods.click_count}
8、网站公告代码段在那里
index.php文件中, $smarty->assign(‘shop_notice’,     $_CFG[‘shop_notice’]);       // 商店公告代码段控制公告
9、网站首页"精品推荐"显示数量在那里设置
ecshop中,为了让更多更丰富的购买信息显示在首页,可以根据自己所在行业特点,根据自己所在行业购买行为的分析,在ecshop首页设置热买促销新品的数量,让版面更加合理,让用户体验.
设置ecshop首页热买商品的数量.
模板管理 -> 设置模板 -> 热买商品 (修改其显示数量)修改下面的10为你需要的数量,这就是热买商品
设置ecshop首页新品的数量.
模板管理 -> 设置模板 -> 新品上架 (修改其显示数量)修改下面的10为你需要的数量,这就是新品上架
设置ecshop首页精品的数量.
模板管理 -> 设置模板 -> 精品推荐 (修改其显示数量)修改下面的10为你需要的数量,这就是精品推荐

10、如何修改产品的库存
商品管理 -> 商品列表 -> 选中(库存),编辑

 

11、如何修改ecshop表的前缀
修改data/config.php下的$prefix    = “ecs_”;将ecs_修改成你需要的前缀.其次,在数据库中,修改表名比如ecs_ad修改为”xxx_ad”;

12、如何调用促销产品
后台 - 商品管理 –  商品列表 –  编辑产品 –  通用信息 –   勾上促销价 - 填写促销期限 - 保存 - 清除缓存

 

13、如何显示商品品牌列表
商品管理 – 商品品牌 – 增加品牌 -> 保存
增加该品牌下的产品
商品管理 – 增加新产品 – 选择商品品牌 –  保存 –  清除缓存 (ps:为什么我添加的品牌图片没有显示,很显然你上传的商品没有选择该品牌)

 

14、如何修改ecshop导航栏目名称
后台 – 系统设置 -> 自定义导航栏 – 编辑 – 修改导航栏名称  (导航有顶部、中部和底部)

 

15、ecshop产品相关的图片有哪几种
$goods_img        = ”; // 初始化商品图片
$goods_thumb      = ”; // 初始化商品缩略图
$original_img     = ”; // 初始化原始图片
$old_original_img = ”; // 初始化原始图片旧图
16、如何修改“支付方式”显示顺序
打开ecs_payment表,如果你想让他显示在前面,你将设置pay_order值小一些,比如想让“支付宝”排第一,“快钱”排第二,你就可以设置支付宝pay_order=1,快钱pay_order=2

17、如何修改详细页的积分
详细页面的积分在模板<strong>{$lang.goods_give_integral}</strong><font>{$goods.give_integral} {$points_name}</font>中来控制的

18、如何修改产品缩略图大小
后台 –  系统设置 –  网店设置 –  显示设置 –  缩略图宽度.,当然你也可以设置缩略图高度

 

19、如何设置ecshop货币格式和日期格式
后台 –  系统设置 –  网店设置 –  显示设置 –  货币格式(¥%s元)或者时间格式(Y-m-d H:i:s)

 

20、如何开取和关闭ecshop登陆验证码
后台  –  系统设置 –  验证码管理  ,开启或关闭

21、ecshop如何删除“注册用户”,“VIP用户”价格
会员管理 –  会员等级 –  删除或者不显示对应会员等级的价格

22、如何修改调整ecshop用户中心左侧栏目
模板文件library/user_menu.lbi中。修改和去除一些栏目

 

23、如何设置网站最新新闻的数量
后台 – 系统设置 - 网店设置 - 显示设置 – 最新文章显示数量
24、ecshop后台如何设置商品价格显示规则
后台-系统设置-网店设置-显示设置-商品价格显示规则
25、如何修改网站关闭后的提示信息
languages\zh_cn\common.php 中,把这句中文,修改成你要的文字$_LANG[‘shop_closed’] = ‘本店盘点中,请您稍后再来…’;
也可以在后台模板管理-语言项编辑-公共语言包中搜索进行修改

面试题之微信公众平台开发

1. 微信运行机制

公众号与php之间用什么语言通信:Xml

Weixin.php中是如何接收公众号数据的:

$postStr = $GLOBALS[“HTTP_RAW_POST_DATA”];//接收数据  XML数据

 

2. 消息类型

微信目前提供了7种基本消息类型,分别为:

(1)文本消息(text);

(2)图片消息(image);

(3)语音(voice)

(4)视频(video)

(5)地理位置(location);

(6)链接消息(link);

(7)事件推送(event)

类型。掌握不同的消息类型发送时的数据传递格式

 

4. 将整个文件读入一个字符串的函数是

File_get_contents

5、常用函数

把xml数据解析成对象的函数是

simplexml_load_string( )

将字符串转换为数组的函数是___ explode_________,将数组转化为字符串的函数是____implode________.

编码 URL 字符串的字符串是____urlencode________.

6. Sprintf函数的作用

这个都是可以查手册的。

7. 微信公众号出现无法提供服务的原因?

1. 网络原因 ,数据接口原因

2. 代码错误,怎么推测原因

修改的哪里检查一下,如果代码没错

可以输出数据 看一下。用php操作文件

 

$myfile = fopen(“newfile.txt”, “w”);

$txt =”aaaaaaaaaa”;

fwrite($myfile, $txt);

fclose($myfile);

 

8.  自定义菜单的事件推送

单击

单击跳转链接

扫码推事件

扫码推且弹出

弹出系统拍照发图的事件

弹出微信相册发图器的事件

弹出地理位置选择器的事件

9.token的作用

安全机制验证,用于微信服务器与PHP服务器之间的安全验证
10. Appid与secrect的作用

请求api接口(例如菜单的操作)时需要传appid与secrect两个值,用来获取应用的授权码

面试题之二次开发系统(DEDE、ecshop)

1.对二次开发的理解

二次开发,简单的说就是在现有的软件上进行定制修改,功能的扩展,然后达到自己想要的功能,一般来说都不会改变原有系统的内核。

2. MVC

Model(模型)数据处理。

View(视图) 模板显示。

Controller(控制器) 控制流程。

 

MVC的概念是什么?各层主要做什么工作?

MVC(即模型-视图-控制器)是一种软件设计模式或者说编程思想。

M指Model模型层,V是View视图层(显示层或者用户界面),C是Controller控制器层。

使用mvc的目的是实现M和V分离,从而使得一个程序可以轻松使用不同的用户界面。

在网站开发中,

模型层一般负责对数据库表信息进行增删改查,

视图层负责显示页面内容,

控制器层在M和V之间起到调节作用,控制器层决定调用哪个model类的哪个方法,

执行完毕后由控制器层决定将结果assign到哪个view层。

 

3.二次开发程序安装后访问时候出现一些警告以及错误

根据错误,来修改服务器配置参数以及百度

4. 功能,模板的更换,功能的添加修改

其实也就是面向对象的应用 用,以及模板的更换类似smarty的使用

5. 用过哪些二次开发的东西?

Dedecms phpcms  ecshop,基本这些的东西如果基础好了 学习起来都是没问题的。

6. 像php做一次开发好,还是二次开发好?

一般中小企业都用cms系统二次开发,都是为了效率。当然如果想一次开发也行,会用框架而且时间充足的话就可以了,大企业都是团队来开发的,杜绝版权问题。

7. 二次开发过程中很多类与类之间进行之间的方法访问,是通过什么方式传递的?

不是类继承而是对象组合,把实例化好的对象通过global传递进去

 

8. dedecms如果更换目录,后台某项就进不去了如何解决?

后台核心设置中修改成现在的 项目目录名称

9.  dedecms中自定义模型的理解?

在织梦系统中有内容模型这个概念,不同内容模型可以用来构建不同内容形式的站点,在系统中自带了以下几种模型:普通文章、图集、软件、商品、分类信息、专题。通过系统自带的模型,我们可以用来构建不同类型的站点,例如:使用图集可以做一个图片站,用软件模型构建一个软件下载站点。

当然以上随系统附带的模型被称为系统模型,用户可以自己定义一些模型,比如图书、音乐专辑等,自定义了这些模型才可以构建更多内容形式的站点。

相当于我们自动添加了表结构,适应现在当前需求的变化

 

10.  dede中概念,设计和使用模板,必须要理解下面几个概念

1、板块(封面)模板:

指网站主页或比较重要的栏目封面频道使用的模板,一般用“index_识别ID.htm”命名,此外,用户单独定义的单个页面或自定义标记,也可选是否支持板块模板标记,如果支持,系统会用板块模板标记引擎去解析后才输出内容或生成特定的文件。

2、列表模板:

指网站某个栏目的所有文章列表的模板,一般用 “list_识别ID.htm” 命名。

3、档案模板:

表示文档查看页的模板,如文章模板,一般用 “article_识别ID.htm” 命名。

4、其它模板:

一般系统常规包含的模板有:主页模板、搜索模板、RSS、JS编译功能模板等,此外用户也可以自定义一个模板创建为任意文件。

 

11. dede中几种标签的使用?

 

列表 内容 等标签 只能在其本范围内使用,列表标签只能在列表中使用,内容标签只能在内容标签中使用。

全局标签能在所有页面中使用

 

12.熟悉常用类库

(例如:dedesql.class.php);熟悉系统函数库(common.func.php);熟悉自定义函数库(extend.func.php);熟悉前台入口文件(common.inc.php)

面试题之smarty模板引擎

1. 编译和缓存区别?

 

smarty的编译过程就是把模板拿过来,把里面的标签替换成相应php代码,这就是smarty的编译, 其实就是php和html混合的过程

 

smarty的缓存需要手动开启,smarty的缓存就是把编译好的文件执行后,同时生成一份静态的html页面,再次访问的时候,你访问的就是是html文件了,所以就效率来说,要高一些

 

2.什么是smarty? Smarty的优点是什么?

Smarty是一个使用PHP写出来的PHP模板引擎,目的是要使用PHP程序同美工分离,使的程序员改变程序的逻辑内容时不会影响到美工的页面设计,美工重新修改页面时不会影响到程序的程序逻辑,这在多人合作的项目中显的尤为重要。(也易于程序的多样式开发)

Smarty优点

1. 速度快:相对其他模板引擎。

2. 编译型:采用smarty编写的程序在运行时要编译成一个非模板技术的PHP文件

3 缓存技术:它可以将用户最终看到的HTML文件缓存成一个静态的HTML页

4. 插件技术:smarty可以自定义插件。

不适合使用smarty的地方

1. 需要实时更新的内容。例如像股票显示,它需要经常对数据进行更新 2.小项目。小项目因为项目简单而美工与程序员兼于一人的项目

 

3.在模板中使用{$smarty}保留变量

 

{$smarty.get.page} //类似在php脚本中访问$_GET[page]

{smarty.cookies.}

{smarty.post.}

{smarty.session.}

{smarty.server.}

 

4.在模板中访问php中的变量

在php脚本中有系统常量和自定义常量两种,同样这两种常量在Smarty模板中也可以被访问,而且不需要从php中分配,只要通过{$smarty}保留变量就可以直接输出常量的值。在模板中输出常量的示例:

{$smarty.const._MY_CONST_VAL}

{$smarty.const.__FILE__}

 

5.变量调解器

 

{$var|modifier1|modifier2|……..}

 

<{$str}><br>

<{$str|capitalize}><{*首字母大写*}><br>

<{$str|upper}><{*全部大写*}><br>

<{$str|lower}><{*全部小写*}><br>

<{$str|lower|upper}><{*全部大写,调节从左至右*}><br>

<{$leg|truncate}><{*字符串截取,默认80个字符*}><br>

<{$leg|truncate:10}><{*字符串截取,前10个,包括…三个字符*}><br>

 

6. php查询mysql数据库时,查询中文结果时出现的乱码。怎么解决????

1.文件属性(另存为)

2.文件meta(设置浏览器解析的时候)

3. 连接数据库时编码设定

4. PHP文件中使用header函数确定编码

 

7.缓存机制

 

如果开启了缓存,smarty同时生成一份静态的html页面,如果在设定的时间没有过期,再次访问的时候,你访问的就是是html文件了,减少了读取数据库,所以就效率来说,要高一些。

 

8. smarty的赋值和载入模板

$Smarty->assign(name,value)

$Smarty->display(‘index.html’)

 

9.marty模板技术的用途是什么?

为了php与html分开,美工和程序员各司其职,互不干扰。

 

10. smarty配置主要有哪几项?

1. 引入smarty.class.php;

2. 实例化smarty对象;

3. 重新修改默认的模板路径;

4. 重新修改默认的编译后文件的路径;

5. 重新修改默认的配置文件的路径;

6. 重新修改默认的cache的路径。

7. 可以设置是否开启cache。

8. 可以设置左侧和右侧定界符。

 

11. smarty在使用过程中需要注意哪些细节?

Smarty是基于MVC概念的一种模板引擎,它将一个页面程序分成了两部分来实现:即视图层和控制层,

也就是说smarty技术将用户UI与php代码分离开。

这样程序员和美工各司其职,互不干扰。

 

12. smarty运用过程中要注意以下几个问题:

1.正确配置smarty。主要要实例化smarty对象,配置smarty模板文件的路径;

2.php页面中使用assign赋值 和display显示页面;

3.smarty模板文件中不允许出现php代码段,所有的注释,变量,函数都要包含在定界符内。

A.{}

B. foreach

C. if else

D. include

E. Literal

面试题之ThinkPHP部分

1、常见的PHP框架

答:thinkPHP

yii

ZendFramework

CakePhp

sy

2、如何理解TP中的单一入口文件?

答:ThinkPHP采用单一入口模式进行项目部署和访问,无论完成什么功能,一个项目都有一个统一(但不一定是唯一)的入口。应该说,所有项目都是从入口文件开始的,并且所有的项目的入口文件是类似的,入口文件中主要包括:

定义框架路径、项目路径和项目名称(可选)

定义调试模式和运行模式的相关常量(可选)

载入框架入口文件(必须)

3、ThinkPHP中的MVC分层是什么?(理解)

答:MVC 是一种将应用程序的逻辑层和表现层进行分离的方法。ThinkPHP 也是基于MVC设计模式的。MVC只是一个抽象的概念,并没有特别明确的规定,ThinkPHP中的MVC分层大致体现在:

模型(M):模型的定义由Model类来完成。

控制器(C):应用控制器(核心控制器App类)和Action控制器都承担了控制器的角色,Action控制器完成业务过程控制,而应用控制器负责调度控制。

视图(V):由View类和模板文件组成,模板做到了100%分离,可以独立预览和制作。

但实际上,ThinkPHP并不依赖M或者V ,也就是说没有模型或者视图也一样可以工作。甚至也不依赖C,这是因为ThinkPHP在Action之上还有一个总控制器,即App控制器,负责应用的总调度。在没有C的情况下,必然存在视图V,否则就不再是一个完整的应用。

总而言之,ThinkPHP的MVC模式只是提供了一种敏捷开发的手段,而不是拘泥于MVC本身。

4、如何进行SQL优化?(关于后边的解释同学们可以进行理解,到时根据自己的理解把大体意思说出来即可)

答:

(1)选择正确的存储引擎

以 MySQL为例,包括有两个存储引擎 MyISAM 和 InnoDB,每个引擎都有利有弊。

MyISAM 适合于一些需要大量查询的应用,但其对于有大量写操作并不是很好。甚至你只是需要update一个字段,整个表都会被锁起来,而别的进程,就算是读进程都无法操作直到读操作完成。另外,MyISAM 对于 SELECT COUNT(*) 这类的计算是超快无比的。

InnoDB 的趋势会是一个非常复杂的存储引擎,对于一些小的应用,它会比 MyISAM 还慢。但是它支持“行锁” ,于是在写操作比较多的时候,会更优秀。并且,他还支持更多的高级应用,比如:事务。

(2)优化字段的数据类型

记住一个原则,越小的列会越快。如果一个表只会有几列罢了(比如说字典表,配置表),那么,我们就没有理由使用 INT 来做主键,使用 MEDIUMINT, SMALLINT 或是更小的 TINYINT 会更经济一些。如果你不需要记录时间,使用 DATE 要比 DATETIME 好得多。当然,你也需要留够足够的扩展空间。

(3)为搜索字段添加索引

索引并不一定就是给主键或是唯一的字段。如果在你的表中,有某个字段你总要会经常用来做搜索,那么最好是为其建立索引,除非你要搜索的字段是大的文本字段,那应该建立全文索引。

(4)避免使用Select *从数据库里读出越多的数据,那么查询就会变得越慢。并且,如果你的数据库服务器和WEB服务器是两台独立的服务器的话,这还会增加网络传输的负载。即使你要查询数据表的所有字段,也尽量不要用*通配符,善用内置提供的字段排除定义也许能给带来更多的便利。

(5)使用 ENUM 而不是 VARCHAR

ENUM 类型是非常快和紧凑的。在实际上,其保存的是 TINYINT,但其外表上显示为字符串。这样一来,用这个字段来做一些选项列表变得相当的完美。例如,性别、民族、部门和状态之类的这些字段的取值是有限而且固定的,那么,你应该使用 ENUM 而不是 VARCHAR。

(6)尽可能的使用 NOT NULL

除非你有一个很特别的原因去使用 NULL 值,你应该总是让你的字段保持 NOT NULL。 NULL其实需要额外的空间,并且,在你进行比较的时候,你的程序会更复杂。 当然,这里并不是说你就不能使用NULL了,现实情况是很复杂的,依然会有些情况下,你需要使用NULL值。

(7)固定长度的表会更快

如果表中的所有字段都是“固定长度”的,整个表会被认为是 “static” 或 “fixed-length”。 例如,表中没有如下类型的字段: VARCHAR,TEXT,BLOB。只要你包括了其中一个这些字段,那么这个表就不是“固定长度静态表”了,这样,MySQL 引擎会用另一种方法来处理。

固定长度的表会提高性能,因为MySQL搜寻得会更快一些,因为这些固定的长度是很容易计算下一个数据的偏移量的,所以读取的自然也会很快。而如果字段不是定长的,那么,每一次要找下一条的话,需要程序找到主键。

并且,固定长度的表也更容易被缓存和重建。不过,唯一的副作用是,固定长度的字段会浪费一些空间,因为定长的字段无论你用不用,他都是要分配那么多的空间。

5、如何理解 ThinkPHP 3.0 架构三(核心 + 行为 + 驱动)中的行为?

答:核心 + 行为 + 驱动

TP官方简称为:CBD

核心(Core):就是框架的核心代码,不可缺少的东西,TP本身是基于MVC思想开发的框架。

行为(Behavior) :行为在新版ThinkPHP的架构里面起着举足轻重的作用,在系统核心之上,设置了很多标签扩展位,而每个标签位置可以依次执行各自的独立行为。行为扩展就因此而诞生了,而且很多系统功能也是通过内置的行为扩展完成的,所有行为扩展都是可替换和增加的,由此形成了底层框架可组装的基础。

驱动( Driver ):数据库驱动、缓存驱动、标签库驱动和模板引擎驱动,以及外置的类扩展。

框架,即framework。其实就是某种应用的半成品,就是一组组件,供你选用完成你自己的系统。简单说就是使用别人搭好的舞台,你来做表演。而且,框架一般是成熟的,不断升级的软件。

6、什么是惯例配置?

答:惯例配置上一页下一页惯例重于配置是系统遵循的一个重要思想,系统内置有一个惯例配置文件(位于系统目录下面的Conf\convention.php),按照大多数的使用对常用参数进行了默认配置。所以,对应用项目的配置文件,往往只需要配置和惯例配置不同的或者新增的配置参数,如果你完全采用默认配置,甚至可以不需要定义任何配置文件。

惯例配置文件会被系统自动加载,无需在项目中进行加载。

7、什么是SQL注入?(理解)

答:SQL注入攻击是黑客对数据库进行攻击的常用手段之一。一部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,注入者可以在表单中输入一段数据库查询代码并提交,程序将提交的信息拼凑生成一个完整sql语句,服务器被欺骗而执行该条恶意的SQL命令。注入者根据程序返回的结果,成功获取一些敏感数据,甚至控制整个服务器,这就是SQL注入。

8、 ThinkPHP如何防止SQL注入?(理解)

答:(1)查询条件尽量使用数组方式,这是更为安全的方式;

(2)如果不得已必须使用字符串查询条件,使用预处理机制;

(3)开启数据字段类型验证,可以对数值数据类型做强制转换;(3.1版本开始已经强制进行字段类型验证了)

(4)使用自动验证和自动完成机制进行针对应用的自定义过滤;

(5)使用字段类型检查、自动验证和自动完成机制等避免恶意数据的输入。

9、如何开启调试模式?调试模式有什么好处?

答:开启调试模式很简单,只需要在入口文件中增加一行常量定义代码:

<?Php,bv

    //开启调试模式

    define(‘APP_DEBUG’, true);

    //加载框架入口文件

    require ‘./ThinkPHP/ThinkPHP.php’;

在完成开发阶段部署到生产环境后,只需要删除调试模式定义代码即可切换到部署模式。开启调试模式后,系统会首先加载系统默认的调试配置文件,然后加载项目的调试配置文件,调试模式的优势在于:

开启日志记录,任何错误信息和调试信息都会详细记录,便于调试;

关闭模板缓存,模板修改可以即时生效;

记录SQL日志,方便分析SQL;

关闭字段缓存,数据表字段修改不受缓存影响;

严格检查文件大小写(即使是Windows平台),帮助你提前发现Linux部署问题;

可以方便用于开发过程的不同阶段,包括开发、测试和演示等任何需要的情况,不同的应用模式可以配置独立的项目配置文件。

10、TP中支持哪些配置模式?优先级?

答:ThinkPHP在项目配置上面创造了自己独有的分层配置模式,其配置层次体现在:

惯例配置->项目配置->调试配置->分组配置->扩展配置->动态配置

以上是配置文件的加载顺序,因为后面的配置会覆盖之前的同名配置(在没有生效的前提下),所以优先顺序从右到左。

11、TP中的URL模式有哪几种?默认是哪种?

答:ThinkPHP支持四种URL模式,可以通过设置URL_MODEL参数来定义,包括普通模式、PATHINFO、REWRITE和兼容模式。

默认模式为:PATHINFO模式,设置URL_MODEL 为1

12、TP中系统变量有哪些?如何获取系统变量?

答:获取系统变量的方法:

只需要在Action中调用下面方法:

$this->方法名(“变量名”,[“过滤方法”],[“默认值”])

13、ThinkPHP框架中D函数与M函数的区别是什么?

答:M方法实例化模型无需用户为每个数据表定义模型类,D方法可以自动检测模型类,如果存在自定义的模型类,则实例化自定义模型类,如果不存在,则会自动调用M方法去实例化Model基类。同时对于已实例化过的模型,不会重复去实例化(单例模式)。