精华内容
下载资源
问答
  • 对于由原生PHP写成的独立PHP框架,利用单一入口文件实现路径的访问。这时我们会遇到的首要问题是:文件的相互包含,其次就是路由分配。当我们不利用成熟的PHP框架进行web开发时,我们就会发现上述两个问题会是很困扰...

    对于由原生PHP写成的独立PHP框架,利用单一入口文件实现路径的访问。这时我们会遇到的首要问题是:文件的相互包含,其次就是路由分配。当我们不利用成熟的PHP框架进行web开发时,我们就会发现上述两个问题会是很困扰我们的问题所在。
    问题解决方案:
    1、文件包含
    php的文件包含有两种方式:require和include,两个方法的区别在于利用require包含文件当出错时,会报出严重错误,同时PHP脚本会停止运行;而利用include包含文件出错时,会有警告,但PHP脚本仍然会继续向下执行。同时两个方法都包含对应的xxx_once方法,可以避免”declare class”的问题。所以一般使用文件包含的时候我们尽量使用include_once包含文件。
    同时在关于文件包含的路径问题上,我们可以利用设置全局变量的方式,依托入口文件的绝对路径,去寻找其他路径文件。修改php.ini中的inclue_path路径当然也是另一种方式,利用require和include包含文件,假如是相对路径的方式,首先会根据php.ini配置文件中的include_path的设置寻找。
    2、路由分配
    基于php的路由分配,实质上来说就是利用url中的path去匹配对应的控制类,同时调用其中的方法进行相关操作的处理。

    一言不合上代码:

    <?php
    // 权限控制
    include_once './auth.php';
    
    // 应用入口文件
    date_default_timezone_set("Asia/Shanghai");
    header('Content-type: text/html;charset=utf-8');
    // 项目根路径
    define('BASEPATH', dirname(__FILE__));
    // 调试模式
    define('APP_DEBUG', True);
    
    // 引入配置文件
    include_once BASEPATH . '/config/config.php';
    
    // 路由控制
    $router = include_once BASEPATH . '/config/router.php';
    if ($_SERVER['HTTP_HOST'] !== 'xxx.com') {
        var_dump('当前host不被允许');
    } else {
        $request_path = str_replace('/index.php', '', $_SERVER['PHP_SELF']);
        $request_query = getCurrentQuery();
        if (array_key_exists($request_path, $router)) {
            $module_file = BASEPATH . $router[$request_path]['file_name'];
            $class_name = $router[$request_path]['class_name'];
            $method_name = $router[$request_path]['method_name'];
            if (file_exists($module_file)) {
                include $module_file;
                $obj_module = new $class_name();
                if (!method_exists($obj_module, $method_name)) {
                    die("要调用的方法不存在");
                } else {
                    if (is_callable(array($obj_module, $method_name))) {
                        $obj_module->$method_name($request_query, $_POST);
                    }
                }
            } else {
                die("定义的模块不存在");
            }
        } else {
            echo '页面不存在';
        }
    }

    利用上述方式就可实现基本的PHP框架的路由分配。

    转载于:https://www.cnblogs.com/niuben/p/10835184.html

    展开全文
  • index.html是入口文件,同级的upload.phpPHP上传接口 看代码: index.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="vie...

    原生JS模拟表单提交要用到 formData
    先看截图:
    在这里插入图片描述
    在这里插入图片描述
    index.html是入口文件,同级的upload.php是PHP上传接口

    看代码:
    提示:这里直接是multiple上传多个文件的,如果是上传单文件的只需限制下上传文件的数量就行了,这里的upload.php是单文件和多文件统一上传接口,都支持

    1. index.html
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>单/多文件上传demo</title>
        <style>
    
            *{
                margin:0;
                padding:0;
            }
            html,body{
                width:100%;
                height:100%;
            }
            ul,dl,ol{
                list-style: none;
                padding:0;
                margin:0;
            }
            .out-box{
                width:100%;
                height:100%;
                overflow: auto;
                background:#f5f5f5;
            }
            .in-box{
                width:800px;
                height:800px;
                background:#f5f81a;
                box-sizing: border-box;
                padding:30px;
                margin:0 auto;
            }
            .up-btn{
                outline: none;
                border:none;
                background:#782ef3;
                color:#fff;
                font-size:32px;
                padding:16px 32px;
                border-radius:64px;
                cursor:pointer;
            }
            .up-btn:active{
                background:#6a18f3;
            }
            .notice{
                font-size:32px ;
                color:#ccc;
                margin-left:15px;
            }
            .info-box{
                padding:30px 0;
                font-size:32px;
                color:#f6960d;
            }
            .file-box{
                font-size:24px;
                font-weight:bold;
                color:#30ec0b;
                padding:6px;
                max-height:200px;
                overflow:auto;
            }
            .fail-box{
                font-size:24px;
                font-weight:bold;
                color:#fb3131;
                padding:6px;
                max-height:200px;
                overflow:auto;
            }
        </style>
        <script>
            window.onload = function(){
    
                upBtn.onclick = function(){
                    upFile.click();
                }
    
                upFile.onchange = function(e){
                    let files = [].slice.call(e.target.files,0);
    
                    let successList = [];
                    let fileHtml = '',failHtml='';
                    let max = 1024*1024*5; //最大5M,其他限制自行添加,比如限制GIF,JPG,PNG格式等等
                    for(let i in files){
                        if(files[i].size >= max){
                            failHtml += `<li class="fail-item"><span class="failname">${files[i].name}</span></li>`;
                        }else{
                            successList.push(files[i]);
                            fileHtml += `<li class="file-item"><span class="filename">${files[i].name}</span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="size">${getSizeFormat(files[i].size)}</span></li>`
                        }
                    }
                    
                    fileBox.innerHTML = fileHtml;
                    failBox.innerHTML = failHtml;
                    
                    upload(successList);
                }
    
                /*
                传递过来 btyes 的 size 值,转换成 大一点的单位 返回
                */
                function getSizeFormat(num){
                    let str = '';
                    if(num<1024){
                        str = num+'btyes';
                    }else if (num<1024*1024){
                        str = Math.ceil(num / 1024) + 'KB';
                    }else if (num<1024*1024*1024){
                        str = Math.ceil(num / (1024 * 1024)) + 'MB';
                    }
                    return str;
                }
            }
    
            //ajax模拟表单上传文件携带额外参数
            function upload(files){
                let formData = new FormData();
                formData.append('p1',1);
                formData.append('p2',2);
                formData.append('p3',3);
                formData.append('p4',4);
                files.map(el=>{
                    formData.append('files[]',el);
                })
    
                let xhr = getXhr();
                xhr.open('POST','/upload.php',true);
                xhr.withCredentials = false;
                xhr.send(formData);
                // 处理返回数据
                xhr.onreadystatechange = function(){
                    if(xhr.readyState == 4){
                        if(xhr.status == 200){
                            console.log("xhr.response",xhr.response);
                        }
                    }
                }
            }
    
            //获取 request 对象
            function getXhr(){
                let xhr=null;
                if(window.XMLHttpRequest){
                    xhr = new XMLHttpRequest();
                } else {
                    //为了兼容IE6
                    xhr = new ActiveXObject('Microsoft.XMLHTTP');
                }
                return xhr;
            }
            
        </script>
    </head>
    <body>
        <div class="out-box">
            <div class="in-box">
                <button class="up-btn" id="upBtn">上传文件</button><span class="notice">上传文件最大为5M</span>
                <div class="info-box">
                    <p>上传成功文件</p>
                    <ul class="file-box" id="fileBox">
                    </ul>
                </div>
                <div class="info-box">
                    <p>上传失败文件</p>
                    <ul class="fail-box" id="failBox">
                    </ul>
                </div>
            </div>
        </div>
        <input style="display:none;" type="file" name="file" multiple id="upFile">
    </body>
    </html>
    
    1. upload.php
    <?php
    $p1 = $_REQUEST['p1'];
    $p2 = $_REQUEST['p2'];
    $p3 = $_REQUEST['p3'];
    $p4 = $_REQUEST['p4'];
    $files = $_FILES['files'];
    
    //将上传获取到的files数据重组
    $newFiles = resetArr($files);
    
    //将上传的文件储存起来
    foreach($newFiles as $v){
    	//这里我没添加判断,如果有需求,自行添加各种判断,判断是目录是否存在,判断文件是否存在决定是否覆盖等等
        move_uploaded_file($v['tmp_name'],'./'.$v['name']);
    }
    
    //接收到的数据重组
    function resetArr($fileList){
        foreach($fileList as $key=>$file){
            foreach($file as $k=>$v){
                $newArr[$k][$key] = $v;
            }
        }
        return $newArr;
    }
    
    展开全文
  • 原生php和html做了一个登陆注册:这个是多入口,一般程序都是单入口,单入口就是统一通过index.php进入,然后再引入其他文件,调用其代码,多入口就是每次通过不同文件进入(比如一会展示的login.php和register....

    用原生的php和html做了一个登陆注册:

    1. 这个是多入口,一般程序都是单入口,单入口就是统一通过index.php进入,然后再引入其他文件,调用其代码,多入口就是每次通过不同文件进入(比如一会展示的login.php和register.php)
    2. 保留登陆信息用的是session,现在普遍是前后端分离,一般用cookie或者redis实现session的功能,很少直接使用session的
    3. 连接mysql使用的是mysqli,没有做封装,也没有使用pdo,除了能用没有其他优点了
    4. 这种样子的代码大概是上世纪的风格了,MVC都没用,看一看好了,真的开发再不济也要MVC分一下层
    5. 性能杠杆的,不要信任何框架的吹嘘,就性能而言,没有任何框架快得过原生。

    准备工作

    emmmm,首先用nginx或者Apache创建一个站点指向本地代码的目录,然后在host里配置127.0.0.1指向该站点。后是一个user库的sql,和登陆和注册的前端代码页面(不好意思说这是代码):

    1. sql
    CREATE TABLE `user` (
      `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id',
      `username` varchar(64) NOT NULL DEFAULT '' COMMENT '账号',
      `password` varchar(64) NOT NULL DEFAULT '' COMMENT '密码',
      `nickname` varchar(64) NOT NULL DEFAULT '' COMMENT '昵称',
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
    1. login.html
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Login</title>
    </head>
    <body>
    <form action="login.php" method="post">
        账 号 <input type="text" name="username"> <br>
        密 码 <input type="password" name="password"> <br>
        <button type="submit">提交</button>
    </form>
    <a href="register.html">没有账号?注册</a>
    </body>
    </html>
    1. register.html
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Register</title>
    </head>
    <body>
    <form action="register.php" method="post">
        账 号 <input type="text" name="username"> <br>
        密 码 <input type="password" name="password"> <br>
        昵 称 <input type="text" name="nickname"> <br>
        <button type="submit">注册</button>
    </form>
    </body>
    </html>

    正文

    1. 首页index.php
      假设我们的网站有个首页,需要判断用户是否登陆,登陆就欢迎他,没有登陆就让他去登陆,这个思路我们这么写
    <?php
    session_start(); 
    if (!$_SESSION['nickname']) {
        header("location:login.html");
    }
    ?>
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>index</title>
    </head>
    <body>
    Hello <?php echo $_SESSION['nickname'] ?>
    </body>
    </html>
    1. 这行session_start() 是开启session,必须在最开始写,保证我们可以使用session相关的功能
    2. 如果当前session里没有存用户的昵称,那我们就认为该用户没有登陆,跳转到登陆界面
    3. 跳转是通过header的方式,参数重location后边是目标地址
    4. <?php echo $_SESSION['nickname'] ?>这段代码可以镶嵌在.php文件的html代码的任何一个地方,echo出来的字符在html中具有等同的功能
    5. 这样的就是前后端代码混杂,如果项目庞大之后非常难于维护
    1. 登陆部分login.php
      这部分处理登陆请求,假设用户输入了账号密码这样的数据(前端和后端都应该对数据进行校验和处理,本文略去),然后拿到用户信息,判断用户密码是否正确,让用户成功登陆或者重新输入。
    <?php
    session_start();
    $username = $_POST['username'];
    $password = $_POST['password'];
    $password_md5 = md5('study'.$password);
    //连接mysql
    $db = new MySQLi("localhost","root","root","allcanadmin",'8889');
    $sql = "select * from `user` where `username`= '{$username}'";
    $res = $db->query($sql);
    $user = $res->fetch_array();
    if ($password_md5 == $user['password']){
        $_SESSION['nickname'] = $user['nickname'];
        header("location:index.php");
    }else{
        header("location:".getenv('HTTP_REFERER'));
    }  
    1. 首先也是启用了session,因为登陆登陆成功之后要通过session保存用户信息这样才能在其他页面确认用户是已经登陆的状态了。
    2. $_POST和$_GET是php自带的两个全局数组,保存了当前请求的post和get参数,比如这次登陆请求的from表单的传递用户名的input标签的name=username,并且请求方式是post,该参数就会在$_POST数组中,key是input标签的name,value是input标签的value。
    3. 业界通用的一个操作,服务器不要存用户的明文密码。本文通过用一个字符串拼接然后计算md5之后再保存(这只是一个比较简单的方式)
    4. new MySQLi(地址,用户名,密码,库名,端口) 创建一个mysqli对象(mysqli是一个更安全更好用的替代原来mysql的扩展,mysql扩展已被弃用),这个对象可以操作mysql库。
    5. $res = $db->query($sql); mysqli的对象$db运行query方法,执行参数的sql语句,这里的sql是查询用户名为用户输入用户名的数据,保存在结果对象$res里,再通过结果对象的fetch_array()方法,获取到结果保存为一个数组。
    6. getenv('HTTP_REFERER') 获取环境变量,这里是取到上一个页面地址,用来做返回,如果用户登陆失败,返回到登陆界面。
    1. 注册部分register.php
      这部分处理注册业务,注册理论上要控制用户名不能重复,可以通过mysql唯一索引或者代码处查询的方式保证唯一,本文采用查询的方式。
    <?php
    $username = $_POST['username'];
    $password = $_POST['password'];
    $password_md5 = md5('study'.$password);
    $nickname = $_POST['nickname'];
    $db = new MySQLi("localhost","root","root","allcanadmin",'8889');
    $sql_select = "select * from `user` where `username`= '{$username}'";
    $res_select = $db->query($sql);
    if ($res_select){
        header("location:".getenv('HTTP_REFERER'));
    }
    $sql = "insert into `user` (`username`,`password`,`nickname`) VALUES ('{$username}','{$password_md5}','{$nickname}')";
    $res = $db->query($sql);
    if ($res){
        header("location:login.html");
    }else{
        header("location:".getenv('HTTP_REFERER'));
    }  
    看懂登陆,注册实现就很容易了,查找不到这个账号则表明该账号是可以注册的,新增一条数据就好了。

    写在最后

    做个小demo,登陆注册真是不能再简单了,搬砖的工作大多也就是这样了,拿参数,走业务,跑sql,反结果。

    很多PHPer在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提升,对此我整理了一些资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干货需要的可以免费分享给大家,需要

    PHP进阶架构师>>>视频、面试文档免费获取shimo.im
    3adfb617359e5fbf6113cdd87f02440a.png

    或 者关注咱们下面的知乎专栏

    PHP大神进阶zhuanlan.zhihu.com
    a4cedfbb7b496dd1eb45f72bddadb96e.png
    展开全文
  • 原生态的PHP MVC架构, 需提前安装 mongodb/*** 入口文件** @version $Id: index.php 2014-3-12 下午2:27:11 zhangzw $*/// 加载路径$dirpath = array(get_include_path(), 'class', 'model', 'config');set_include_...

    原生态的PHP MVC架构, 需提前安装  mongodb

    /**

    * 入口文件

    *

    * @version $Id: index.php 2014-3-12 下午2:27:11 zhangzw $

    */

    // 加载路径

    $dirpath = array(get_include_path(), 'class', 'model', 'config');

    set_include_path( implode(PATH_SEPARATOR, $dirpath) );

    // 自动加载调用类

    class ClassLoader{

    /**

    * 加载类名称

    * @param string $class_name

    */

    public static function class_loader($class_name){

    $class_name = strtolower($class_name);

    $search = 'cls';

    if( strpos( $class_name, $search) > 0 ){

    $file = str_replace($search, '', $class_name).'_'.$search.'.php';

    require_once $file;

    }

    }

    /**

    * 加载模型类

    * @param string $model_name

    */

    public static function model_loader($model_name){

    if(strpos( strtolower($model_name), 'model') > 0){

    $file = 'model_'.strtolower($model_name).'.php';

    require_once $file;

    }

    }

    }

    // 加载类文件

    spl_autoload_register(array('ClassLoader', 'class_loader'));

    // 加载模型文件

    spl_autoload_register(array('ClassLoader', 'model_loader'));

    // 初始化

    $core = CoreCls::instance();

    展开全文
  • 对于由原生PHP写成的独立php框架,利用单一入口文件实现路径的访问。这时我们会遇到的首要问题是:文件的相互包含,其次就是路由分配。当我们不利用成熟的PHP框架进行web开发时,我们就会发现上述两个问题会是很困扰...
  • 对于由原生PHP写成的独立php框架,利用单一入口文件实现路径的访问。这时我们会遇到的首要问题是:文件的相互包含,其次就是路由分配。当我们不利用成熟的PHP框架进行web开发时,我们就会发现上述两个问题会是很困扰...
  • PHP 原生实现MVC框架

    2017-06-05 17:01:00
    2017-6-5 由于工作需要 打算自己实现一个简单的 MVC框架以完成工作需求 初步定义 框架需要完成的工作 ...项目接口的 public 目录中存在一个index.php 文件 作为 项目的唯一入口 文件功能主...
  • index.php //入口文件 <?php /** * @name index.php * @decs * @author 老猫 <18368091722@163.com> * Updated on: 2019/5/30 9:49 */ include "goods.php";  conn.inc.php //...
  • 看下成果 ps:纯天然h5,绝不添加任何添加剂(css)以及化学成分(js)(<...这个是多入口,一般程序都是单入口,单入口就是统一通过index.php进入,然后再引入其他文件,调用其代码,多入口就是每次通...
  • 3、应用锁文件 (理论上整个应用只有一个锁文件 …) UML 图 代码 标准单例模式: HttpClient.php 1.创建一个静态私有变量存放实例化的对象 2.创建一个私有构造函数 3.防止外部克隆该类 4.防止序列化 5.提供唯一的...
  • Mysql数据库创建 ...1.1. 创建文件dbconfig.php,保存常量 <?php define("HOST","localhost"); define("USER","root"); define("PASS","********"); define("DBNAME","news"); 1.2. 创建入口文...
  • 防止SQL注入的两种参数绑定方式: 第一种,使用?参数绑定 第二种(推荐),使用命名占位符进行参数绑定(salary为...DB.php:数据库入口文件,Qurey.php为查询类文件、Builder.php为生成类文件、Connection.ph...
  • 0x00 模板引擎的原理模板引擎就是在模板文件中使用一系列提前约定好的标签代替原生PHP代码,通过访问一个PHP的入口文件,会有一个PHP...PHP入口文件服务端开发者将前端代码中所需要的变量注入到前端。PHP编译文件该文
  • 对于由原生PHP写成的独立PHP框架,利用单一入口文件实现路径的访问。这时我们会遇到的首要问题是:文件的相互包含,其次就是路由分配。当我们不利用成熟的PHP框架进行web开发时,我们就会发现上述两个问题会是很困扰...
  • PHP的路由分配的实现

    2018-06-19 15:24:12
    使用原生PHP写成独立的PHP框架,利用单一入口文件实现路径的访问面临的最大问问题就是:文件的相互包含问题,其次就是路由的分配问题.① 文件包含php的文件包含有两种方式:require和include,两个方法的区别在于利用...
  • PHP实现的贴吧

    2018-08-31 15:19:57
    使用原生PHP实现贴吧功能,后台模块具有统一的调用入口。该贴吧功能主要包括发帖、回帖以及帖子列表的展示,其中发帖和回帖支持富文本。数据库使用mysql,文件中包含表结构。
  • 连接与查询构造器数据库操作运行流程图.png1.数据库操作运行流程图* ThinkPHP5的数据库...配置方法:* 静态连接:应用/模块中的数据库配置文件database.php* 动态连接:入口类Db.php中的connect(参数[数组或字符串]...
  • ThinkPHP核心框架实现

    2017-09-01 17:46:42
    之前和朋友一块学过够语言,作为系统级别的语言,没有一定的功力和系统编程 经验,很难...虽然跟着老师创业的时候写了一段时间原生PHP直接进入代码:再次学习TP 用户URL请求 调用应用入口文件 载入框架入口文件**...
  • Passport 密码模式

    2019-11-12 15:11:36
    交流群 375462817 ...准备工作 composer create-project --prefer-dist laravel/laravel laravel6 .env 数据库配置 修改数据库默认字符串长度 php artisan make:request BaseRequest //...入口文件替换原生 Request 为 ...
  • thinkphp 3.2.3

    2018-09-05 10:08:16
    一直用的原生php编写,目前也是。想通过框架,学习里面的思想与方法,然后再带回原生中去。 ...一个thinkPHP框架可用于多个项目:只要在项目入口文件中引入"ThinkPHP/ThinkPHP.php"...
  • Thinkphp5的ajax接口实现

    2019-01-05 18:39:30
    首先是html代码部分,如访问地址为:http://www.domain.com/thinkphp/public/index.php/index/index/api,这里没有省略入口文件,同时本地的域名是www.domain.com,tp5框架在thinkphp文件里面。这里采用原生ajax,...
  • 改进后的项目编译机制,可以支持编译文件直接作为入口载入,并且支持常量 外部载入,利于产品发布。 类库导入:采用基于类库包和命名空间的方式导入类库,让类库导入看起来更 加简单清晰,而且还支持自动加载和别名...
  • yii2.0 使用分页封装类 分页

    千次阅读 2016-09-23 00:19:08
    第二步:封装的类放在web下面,入口文件,可以自定义;命名 使用封装类 第三步:注意文件名的路径,跳转上一页下一页的路径 下面可以对比看到 类名 Db.class.php 连接数据库 <?php /** * Created by PhpStorm. * ...
  • 连接与查询构造器数据库操作运行流程图.png1.数据库操作运行流程图* ThinkPHP5的数据库...配置方法:* 静态连接:应用/模块中的数据库配置文件database.php* 动态连接:入口类Db.php中的connect(参数[数组或字符串]...

空空如也

空空如也

1 2 3
收藏数 41
精华内容 16
关键字:

原生php入口文件