php-crud-api, 将 REST API 添加到SQL数据库的单个文件PHP脚本

分享于 

37分钟阅读

GitHub

  繁體 雙語
Simple PHP script that adds a very basic API to a MySQL database
  • 源代码名称:php-crud-api
  • 源代码网址:http://www.github.com/mevdschee/php-crud-api
  • php-crud-api源代码文档
  • php-crud-api源代码下载
  • Git URL:
    git://www.github.com/mevdschee/php-crud-api.git
    Git Clone代码到本地:
    git clone http://www.github.com/mevdschee/php-crud-api
    Subversion代码到本地:
    $ svn co --depth empty http://www.github.com/mevdschee/php-crud-api
    Checked out revision 1.
    $ cd repo
    $ svn up trunk
    

    Average time to resolve an issuePercentage of issues still openBuild Status

    PHP-CRUD-API

    将 REST API 添加到 MySQL 5.5 InnoDB数据库的单个文件PHP脚本。 支持 PostgreSQL 9.1和 MS SQL Server 2012. 对 SQLite 3的支持甚至有限。

    相关项目:

    这里脚本中也有以下端口:

    这里脚本还有proof-of-concept端口,只支持基本的REST CRUD功能: C#. NET 核心node.js 和python。

    要求

    • 启用了 MySQLi 5.3或者更高的,超级数组,SQLSRV或者已经启用( PHP 7推荐)
    • PHP在 Windows 上连接 SQL Server 2012时
    • MySQL 5.6/MariaDB 10.0或者更高的空间特性
    • PostGIS 2.0或者更高版本,用于 PostgreSQL 9.1或者更高版本的空间特性

    安装

    这是单个文件应用程序 ! 将" api.php"上传到某个地方并享受 !

    限制

    • 主键应该是自动递增( 从 1到 2 ^53 ) 或者 UUID
    • 不支持复合主键或者外键
    • ( 同时"和"&"或者") 不支持复杂过滤器
    • 不支持复杂写( 事务处理)
    • 不支持调用函数( 像"concat"或者或或者"和")的复杂查询
    • MySQL存储引擎必须是InnoDB或者 XtraDB
    • SQLite不支持二进制和空间/gis功能
    • 不支持MySQL位字段类型( 使用 TINYINT )

    特性

    • 单一PHP文件,易于部署。
    • 代码很少,易于维护和维护
    • 数据流数据,内存占用低
    • 支持将变量作为输入
    • 支持JSON对象作为输入
    • 支持 JSON array 作为输入( 批量插入)
    • 支持从web窗体上载文件( 多部分/表单数据)
    • 压缩JSON输出:第一行包含字段名称
    • 使用回调净化和验证输入
    • 数据库。表。列和记录的权限系统
    • 支持多租户数据库布局
    • 跨域请求的多域CORS支持
    • 组合请求,支持多个 table 名称
    • 在多个条件下搜索支持
    • 分页。排序和列选择
    • 外键的关系检测与过滤
    • PHP和JavaScript的关系"转换"
    • 通过修补程序( 对于计数器)的原子增量支持
    • 支持base64编码的二进制字段
    • WKT支持的空间/gis字段和过滤器
    • 通过 JSON/JSONB/XML 进行非结构化数据支持
    • 使用Swagger工具生成API文档
    • 通过JWT令牌或者用户名/密码进行身份验证( 通过 PHP-API-AUTH )

    配置

    在文件" api.php"的底部编辑以下行:

    
    $api = new PHP_CRUD_API(array(
    
    
     'username'=>'xxx',
    
    
     'password'=>'xxx',
    
    
     'database'=>'xxx',
    
    
    ));
    
    
    $api->executeCommand();
    
    
    
    

    以下是所有配置选项及其默认值:

    
    $api = new PHP_CRUD_API(array(
    
    
     'dbengine'=>'MySQL',
    
    
     'username'=>'root',
    
    
     'password'=>null,
    
    
     'database'=>false,
    
    
    //for connectivity (defaults to localhost):
    
    
     'hostname'=>null,
    
    
     'port'=>null,
    
    
     'socket'=>null,
    
    
     'charset'=>'utf8',
    
    
    //callbacks with their default behavior
    
    
     'table_authorizer'=>function($cmd,$db,$tab) { return true; },
    
    
     'record_filter'=>function($cmd,$db,$tab) { return false; },
    
    
     'column_authorizer'=>function($cmd,$db,$tab,$col) { return true; },
    
    
     'tenancy_function'=>function($cmd,$db,$tab,$col) { return null; },
    
    
     'input_sanitizer'=>function($cmd,$db,$tab,$col,$typ,$val) { return $val; },
    
    
     'input_validator'=>function($cmd,$db,$tab,$col,$typ,$val,$ctx) { return true; },
    
    
     'before'=>function(&$cmd,&$db,&$tab,&$id,&$in) {/* adjust array $in */},
    
    
     'after'=>function($cmd,$db,$tab,$id,$in,$out) {/* do something */},
    
    
    //configurable options
    
    
     'allow_origin'=>'*',
    
    
     'auto_include'=>true,
    
    
    //dependencies (added for unit testing):
    
    
     'db'=>null,
    
    
     'method'=>$_SERVER['REQUEST_METHOD'],
    
    
     'request'=>$_SERVER['PATH_INFO'],
    
    
     'get'=>$_GET,
    
    
     'post'=>file_get_contents('php://input'),
    
    
     'origin'=>$_SERVER['HTTP_ORIGIN'],
    
    
    ));
    
    
    $api->executeCommand();
    
    
    
    

    NB:"插座"SQL Server 不支持选项。 SQLite需要"数据库"字段中的文件名。

    文档

    配置之后,可以直接从生成的API文档中获益。 在 URL below 中,你可以在 Swagger 2.0格式中找到生成的API规范。

    
    http://localhost/api.php
    
    
    
    

    请尝试使用编辑器来快速查看它 ! 从菜单中选择"文件">"粘贴 json。"。

    用法

    你可以执行所有 CRUD ( 创建,读取,更新,删除) 操作和一个额外的List 操作。 下面是操作方法:

    下拉列表

    列出数据库表的所有记录。

    
    GET http://localhost/api.php/categories
    
    
    
    

    输出:

    
    {"categories":{"columns":["id","name"],"records":[[1,"Internet"],[3,"Web development"]]}}
    
    
    
    

    List + 转换

    列出数据库 table的所有记录并将它们转换为对象。

    
    GET http://localhost/api.php/categories?transform=1
    
    
    
    

    输出:

    
    {"categories":[{"id":1,"name":"Internet"},{"id":3,"name":"Web development"}]}
    
    
    
    

    NB: 这个转换是CPU和内存密集型的,也可以被执行客户端( 见: lib )。

    List + 过滤器

    搜索是用"筛选器"参数实现的。 你需要指定列名。逗号。匹配类型。其他commma和要筛选的值。 这些是支持的匹配类型:

    • cs: 包含字符串( 字符串包含值)
    • sw: 以( 字符串开头) 开始
    • :以( 带值结尾的字符串结尾) 结束
    • eq: 相等( 字符串或者数字正好匹配)
    • lt: 低于( 数字小于值)
    • le: 小于或者等于( 数字小于或者等于值)
    • ge: 大于或者等于( 数字大于或者等于值)
    • gt: 大于( 数字大于数值)
    • bt: 在( 数字之间是两个逗号分隔值)
    • in: ( 数字为逗号分隔的List 值)
    • 是:空( 字段包含"为空"值"

    你可以通过预置'n'字符来取消所有过滤器,从而使'eq'成为'neq'。

    
    GET http://localhost/api.php/categories?filter=name,eq,Internet
    
    
    GET http://localhost/api.php/categories?filter=name,sw,Inter
    
    
    GET http://localhost/api.php/categories?filter=id,le,1
    
    
    GET http://localhost/api.php/categories?filter=id,ngt,2
    
    
    GET http://localhost/api.php/categories?filter=id,bt,1,1
    
    
    GET http://localhost/api.php/categories?filter=categories.id,eq,1
    
    
    
    

    输出:

    
    {"categories":{"columns":["id","name"],"records":[[1,"Internet"]]}}
    
    
    
    

    注:你可以在域名前指定 table 名称,用点分隔。

    List + 滤波器+ 满足

    可以使用"过滤 []"而不是"筛选器"作为参数名应用多个筛选器。 然后,参数"满足"用于指示是否应满足"全部"( 默认) 或者"任意"筛选器以引导匹配:

    
    GET http://localhost/api.php/categories?filter[]=id,eq,1&filter[]=id,eq,3&satisfy=any
    
    
    GET http://localhost/api.php/categories?filter[]=id,ge,1&filter[]=id,le,3&satisfy=all
    
    
    GET http://localhost/api.php/categories?filter[]=id,ge,1&filter[]=id,le,3&satisfy=categories.all
    
    
    GET http://localhost/api.php/categories?filter[]=id,ge,1&filter[]=id,le,3
    
    
    
    

    输出:

    
    {"categories":{"columns":["id","name"],"records":[[1,"Internet"],[3,"Web development"]]}}
    
    
    
    

    如果你想将"还有"和"或者或或者"混合为不同的表,你可以指定"satisfy=categories。所有帖子。任何"。

    List + 列选择

    默认情况下选择所有列。 使用"列"参数,你可以选择特定的列。 多个列应该是逗号分隔的。 Asterisk ("*") 可以用作通配符以指示"所有列"。 与"列"类似,你可以使用"排除"参数删除某些列:

    
    GET http://localhost/api.php/categories?columns=name
    
    
    GET http://localhost/api.php/categories?columns=categories.name
    
    
    GET http://localhost/api.php/categories?exclude=categories.id
    
    
    
    

    输出:

    
    {"categories":{"columns":["name"],"records":[["Web development"],["Internet"]]}}
    
    
    
    

    注:用于包含相关实体的列自动添加,不能从输出中排除。

    List + 顺序

    使用"顺序"参数可以排序。 默认情况下排序是按升序排序的,但通过指定"说明",可以反转:

    
    GET http://localhost/api.php/categories?order=name,desc
    
    
    GET http://localhost/api.php/posts?order[]=icon,desc&order[]=name
    
    
    
    

    输出:

    
    {"categories":{"columns":["id","name"],"records":[[3,"Web development"],[1,"Internet"]]}}
    
    
    
    

    NB: 你可以通过使用"订单 []"而不是"顺序"作为参数名对多个字段进行排序。

    List + 顺序+ 分页

    "页面"参数保存请求的页面。 默认页面大小为 20,但可以调整( 比如。 到 50 ):

    
    GET http://localhost/api.php/categories?order=id&page=1
    
    
    GET http://localhost/api.php/categories?order=id&page=1,50
    
    
    
    

    输出:

    
    {"categories":{"columns":["id","name"],"records":[[1,"Internet"],[3,"Web development"]],"results":2}}
    
    
    
    

    NB: 不能对未排序的页进行分页。

    创建

    你可以使用POST方法( x-www-form-urlencoded,请参见 RFC1738 ) 轻松地添加记录。 调用返回"最后插入 id"。

    
    POST http://localhost/api.php/categories
    
    
    id=1&name=Internet
    
    
    
    

    输出:

     
    1
    
    
    
     

    注意,请求中未指定的字段获取数据库中指定的默认值。

    创建( 使用JSON对象)

    或者,你可以在 body 中发送JSON对象。 调用返回"最后插入 id"。

    
    POST http://localhost/api.php/categories
    
    
    {"id":1,"name":"Internet"}
    
    
    
    

    输出:

     
    1
    
    
    
     

    注意,请求中未指定的字段获取数据库中指定的默认值。

    创建( 使用 JSON array )

    也可以在 body 中发送包含多个JSON对象的JSON array。 调用返回"最后插入 id"值的一个 array。

    
    POST http://localhost/api.php/categories
    
    
    [{"name":"Internet"},{"name":"Programming"},{"name":"Web development"}]
    
    
    
    

    输出:

     
    [1,2,3]
    
    
    
     

    这里调用使用事务,将插入所有或者无记录。 如果事务失败,它将返回'空'。

    如果你想读取单个对象,可以使用:

    
    GET http://localhost/api.php/categories/1
    
    
    
    

    输出:

    
    {"id":1,"name":"Internet"}
    
    
    
    

    读取( 多个)

    如果要读取多个对象,可以使用:

    
    GET http://localhost/api.php/categories/1,2
    
    
    
    

    输出:

    
    [{"id":1,"name":"Internet"},{"id":2,"name":"Programming"}]
    
    
    
    

    更新

    编辑记录用放置方法完成。 调用将返回受影响的行数。

    
    PUT http://localhost/api.php/categories/2
    
    
    name=Internet+networking
    
    
    
    

    输出:

     
    1
    
    
    
     

    注意,只有在请求中指定的字段才会更新。

    更新( 使用JSON对象)

    或者,你可以在 body 中发送JSON对象。 调用将返回受影响的行数。

    
    PUT http://localhost/api.php/categories/2
    
    
    {"name":"Internet networking"}
    
    
    
    

    输出:

     
    1
    
    
    
     

    注意,只有在请求中指定的字段才会更新。

    更新( 带有 JSON array )

    也可以在 body 中发送包含多个JSON对象的JSON array。 调用返回受影响的行的array。

    
    PUT http://localhost/api.php/categories/1,2
    
    
    [{"name":"Internet"},{"name":"Programming"}]
    
    
    
    

    输出:

     
    [1,1]
    
    
    
     

    URL中主键值的数量应该与 JSON array ( 按照同样的顺序) 中的元素数匹配。

    这里调用使用事务,将更新所有或者无记录。 如果事务失败,它将返回'空'。

    删除

    DELETE 谓词用于对记录进行 DELETE。 调用将返回受影响的行数。

    
    DELETE http://localhost/api.php/categories/2
    
    
    
    

    输出:

     
    1
    
    
    
     

    Delete ( 多重)

    DELETE 动词也可以用于 DELETE的多个记录。 调用返回在URL中指定的每个主 key-value 所受影响的行数。

    
    DELETE http://localhost/api.php/categories/1,2
    
    
    
    

    输出:

     
    [1,1]
    
    
    
     

    这里调用使用事务,将 delete 全部或者无记录。 如果事务失败,它将返回'空'。

    关系

    这个特性的解释是基于 blog.sql 数据库文件中的数据结构的。 这个数据库是一个非常简单的博客数据结构,具有相应的外部键关系。 由于关系检测基于它们,而不是列命名,因此需要这些外键约束。

    使用以下方法可以获取具有等于的"POST",它的对应的"类别","标签"和"评论":

    
    GET http://localhost/api.php/posts?include=categories,tags,comments&filter=id,eq,1
    
    
    
    

    输出:

    
    {
    
    
    "posts": {
    
    
    "columns": [
    
    
    "id",
    
    
    "user_id",
    
    
    "category_id",
    
    
    "content"
    
    
     ],
    
    
    "records": [
    
    
     [
    
    
     1,
    
    
     1,
    
    
     1,
    
    
    "blog started"
    
    
     ]
    
    
     ]
    
    
     },
    
    
    "post_tags": {
    
    
    "relations": {
    
    
    "post_id":"posts.id"
    
    
     },
    
    
    "columns": [
    
    
    "id",
    
    
    "post_id",
    
    
    "tag_id"
    
    
     ],
    
    
    "records": [
    
    
     [
    
    
     1,
    
    
     1,
    
    
     1
    
    
     ],
    
    
     [
    
    
     2,
    
    
     1,
    
    
     2
    
    
     ]
    
    
     ]
    
    
     },
    
    
    "categories": {
    
    
    "relations": {
    
    
    "id":"posts.category_id"
    
    
     },
    
    
    "columns": [
    
    
    "id",
    
    
    "name"
    
    
     ],
    
    
    "records": [
    
    
     [
    
    
     1,
    
    
    "anouncement"
    
    
     ]
    
    
     ]
    
    
     },
    
    
    "tags": {
    
    
    "relations": {
    
    
    "id":"post_tags.tag_id"
    
    
     },
    
    
    "columns": [
    
    
    "id",
    
    
    "name"
    
    
     ],
    
    
    "records": [
    
    
     [
    
    
     1,
    
    
    "funny"
    
    
     ],
    
    
     [
    
    
     2,
    
    
    "important"
    
    
     ]
    
    
     ]
    
    
     },
    
    
    "comments": {
    
    
    "relations": {
    
    
    "post_id":"posts.id"
    
    
     },
    
    
    "columns": [
    
    
    "id",
    
    
    "post_id",
    
    
    "message"
    
    
     ],
    
    
    "records": [
    
    
     [
    
    
     1,
    
    
     1,
    
    
    "great"
    
    
     ],
    
    
     [
    
    
     2,
    
    
     1,
    
    
    "fantastic"
    
    
     ]
    
    
     ]
    
    
     }
    
    
    }
    
    
    
    

    你可以调用 php_crud_api_tranform() 函数以如下方式构造数据结构:

    
    {
    
    
    "posts": [
    
    
     {
    
    
    "id": 1,
    
    
    "post_tags": [
    
    
     {
    
    
    "id": 1,
    
    
    "post_id": 1,
    
    
    "tag_id": 1,
    
    
    "tags": [
    
    
     {
    
    
    "id": 1,
    
    
    "name":"funny"
    
    
     }
    
    
     ]
    
    
     },
    
    
     {
    
    
    "id": 2,
    
    
    "post_id": 1,
    
    
    "tag_id": 2,
    
    
    "tags": [
    
    
     {
    
    
    "id": 2,
    
    
    "name":"important"
    
    
     }
    
    
     ]
    
    
     }
    
    
     ],
    
    
    "comments": [
    
    
     {
    
    
    "id": 1,
    
    
    "post_id": 1,
    
    
    "message":"great"
    
    
     },
    
    
     {
    
    
    "id": 2,
    
    
    "post_id": 1,
    
    
    "message":"fantastic"
    
    
     }
    
    
     ],
    
    
    "user_id": 1,
    
    
    "category_id": 1,
    
    
    "categories": [
    
    
     {
    
    
    "id": 1,
    
    
    "name":"anouncement"
    
    
     }
    
    
     ],
    
    
    "content":"blog started"
    
    
     }
    
    
     ]
    
    
    }
    
    
    
    

    这个转换函数在"lib"文件夹中的文件 php_crud_api_tranform.phpphp_crud_api_tranform.js 中可以用于PHP和 JavaScript。

    权限

    默认情况下,单个数据库在读写模式下公开了所有的表和列。 可以通过指定一个'table_authorizer'和/或者'column_authorizer'函数来更改权限,以指示是否允许指定 table 或者列。

    记录筛选器

    通过定义'record_filter'函数,可以应用强制筛选器,例如在数据库系统中实现角色。 规则"你无法查看未发布的博客帖子,除非你有管理员角色"可以用这个过滤器实现。

    
    return ($table=='posts' && $_SESSION['role']!='admin')?array('published,nis,null'):false;
    
    
    
    

    多重租赁

    这个'tenancy_function'允许你为多租户数据库模式公开一个 API。 在最简单的模型中,所有表都有一个名为'customer_id'的列,而'tenancy_function'被定义为:

    
    return $col=='customer_id'?$_SESSION['customer_id']:null
    
    
    
    

    在这个示例中,$_SESSION['customer_id'] 是你的API中的认证客户。

    Sanitizing输入

    默认情况下,所有输入都被接受并发送到数据库。 如果你想在存储( 一定)的HTML标签之前,你可以指定一个'input_sanitizer'函数返回调整后的值。

    验证输入

    默认情况下接受所有输入。 如果要验证输入,可以指定一个'input_validator'函数,该函数返回指示值是否有效的boolean函数。

    多数据库

    代码还支持api的多数据库。 这些url包含路径中第一段是数据库而不是 table 名称的url。 这可以通过不在配置中指定数据库来启用。 配置中的权限应该包含一个点字符,以便从 table 名称分离数据库。 数据库的'mysql','information_schema'和'系统'被自动阻止。

    原子增量( 用于计数器)

    递增记录的数值字段是用补丁方法( 忽略非数值字段) 完成的。 递减可以使用负增量值进行。 要将'2'添加到带有主键'1'的记录的'事件'table 中的字段'访客',执行:

    
    PATCH http://localhost/api.php/events/1
    
    
    {"visitors":2}
    
    
    
    

    输出:

     
    1
    
    
    
     

    调用将返回受影响的行数。 请注意,可以增加多个字段并支持批处理操作( 请参见: 更新/放置)。

    二进制数据

    自动检测二进制字段,并使用base64编码返回这些字段中的数据。

    
    GET http://localhost/api.php/categories/2
    
    
    
    

    输出:

    
    {"id":2,"name":"funny","icon":"ZGF0YQ=="}
    
    
    
    

    发送包含二进制字段的记录时,还必须发送base64编码数据。

    
    PUT http://localhost/api.php/categories/2
    
    
    icon=ZGF0YQ
    
    
    
    

    在 上面 示例中,你将看到如何发送二进制数据。 "base64url"和标准"base64"都允许( 查看 rfc4648 )。

    文件上传

    你还可以使用如下所示的web窗体( 多部分/表单数据) 上载文件:

    
    <form method="post" action="http://localhost/api.php/categories" enctype="multipart/form-data">
    
    
     Select image to upload:
    
    
     <input type="file" name="icon">
    
    
     <input type="submit">
    
    
    </form>
    
    
    
    

    然后就像你将发送的那样处理:

    
    POST http://localhost/api.php/categories
    
    
    {"icon_name":"not.gif","icon_type":"image/gif","icon":"ZGF0YQ==","icon_error":0,"icon_size":4}
    
    
    
    

    你可以看到"xxx_name"。"xxx_type"。"xxx_error"和"xxx_size"元字段被添加为( 位置"xxx"是文件字段的名称)。

    注意:不能使用这里方法编辑文件,因为浏览器不支持这些表单中的"放置"方法。

    基于的空间/gis支持

    还支持空间过滤器:

    • sco: 空间包含( 几何图形包含另一个)
    • scr: 空间交叉( 几何图形交叉另一个)
    • sdi: 空间不相交( 几何图形与另一个不相交)
    • seq: 空间相等( 几何图形等于另一个)
    • sin: 空间相交( 几何图形与另一个相交)
    • 空间重叠:空间重叠( 几何图形重叠)
    • sto: 空间接触( 几何图形接触另一个)
    • swi: ( 几何图形在另一个内部)
    • sic: 空间闭合( 几何图形闭合且简单)
    • sis: 空间很简单( 几何图形很简单)
    • siv: 空间有效( 几何图形有效)

    你也可以通过预先预先处理'n'字符来反转这些过滤器,因这里'sco'变成'nsco'。

    例如:

    
    GET http://localhost/api.php/countries?columns=name,shape&filter[]=shape,sco,POINT(30 20)
    
    
    
    

    输出:

    
    {"countries":{"columns":["name","shape"],"records":[["Italy","POLYGON((30 10,40 40,20 40,10 20,30 10))"]]}}
    
    
    
    

    发送包含几何图形( 空间空间) 字段的记录时,还必须发送WKT字符串。

    
    PUT http://localhost/api.php/users/1
    
    
    {"location":"POINT(30 20)"}
    
    
    
    

    在 上面 示例中,你将看到如何发送 WKT字符串

    非结构化数据支持

    在数据库中可以将JSON文档存储在 JSON ( MySQL )。JSONB ( PostgreSQL ) 或者 XML ( SQL Server ) 字段类型中。 这些文档没有架构。 结构中的空白不被维护。

    发送 NULL

    使用POST方法( x-www-form-urlencoded,请参见 RFC1738 ) 时,可以使用带有"__is_null"后缀的参数来设置数据库空值:

    
    PUT http://localhost/api.php/categories/2
    
    
    name=Internet&icon__is_null
    
    
    
    

    发送JSON数据时,如果你可以使用 JSON"空"值( 没有引号),那么为可以空数据库字段发送空值就更容易了。

    
    PUT http://localhost/api.php/categories/2
    
    
    {"name":"Internet","icon":null}
    
    
    
    

    自动字段

    调用'前'函数之前,允许你设置一些自动字段。 注意,'输入'参数是可以写的,并且是对象( 或者或或者'false'当它丢失或者无效时)。

    软删除

    '前'函数允许修改请求参数,并且可以使用( 例如) 来实现软 delete 行为。

    'before'=>function(&$cmd, &$db, &$tab, &$id, &$in) { if ($cmd=='delete') {$cmd='update'; // change command to update$in= (object)array('deleted'=>date('Y-m-d H:i:s', time())); }},'column_authorizer'=>function($cmd, $db, $tab, $col) { return ( !in_array($col, array('deleted')));},'record_filter'=>function($cmd,$db,$tab) { returnarray('deleted,is,null');}

    自定义操作

    在任何操作之后,调用'后'函数,它允许你执行一些自定义操作。 注意,由于API的流特性,'读取'或者'列表'操作不填充输出参数。

    基于的多域

    通过在配置中指定 allow_origin,你可以控制正在发送的Access-Control-Allow-Origin 响应 header。

    如果将 allow_origin 设置为 *,则 Access-Control-Allow-Origin 响应 header 将设置为 *。 在所有其他情况下,Access-Control-Allow-Origin 响应 header 被设置为请求 header Origin的值,当找到匹配项时。

    你还可以指定 allow_originhttps://*.yourdomain.com 匹配任何以 https:// 开头的主机,以 .yourdomain.com 结束。

    可以使用逗号指定多个主机,使你可以将 allow_origin 设置为 https://yourdomain.com, https://*.yourdomain.com

    JavaScript中的位整数

    JavaScript不支持 64位整数。 所有数字都存储为 64位浮点值。 64位浮点数的尾数只有 53位,这就是为什么所有大于 53位的整数都会导致JavaScript出现问题的原因。

    错误

    可以报告以下类型的404'找不到'错误:

    • 实体( 找不到实体)
    • 对象( 在读取时找不到实例)
    • 输入( 在创建时找不到实例)
    • 主题( 更新时找不到实例)
    • 1pk ( 找不到主键或者复合键)

    测试

    我主要测试 Ubuntu,我有以下测试设置:

    • 带有 PHP 5.3和 MySQL 5.5和 PostgreSQL 9.1的Ubuntu 12.04服务器
    • 带有 PHP 5.5和 MySQL 5.5和 PostgreSQL 9.3的Ubuntu 14.04服务器
    • 具有 PHP 7.0和 MySQL 5.7/MariaDB 和 PostgreSQL 9.5的16.04服务器
    • 使用 PHP 5.4和 MySQL 5.5和 log4j 9.1的Debian 7服务器
    • Debian 8服务器,具有 PHP 5.6和 MySQL 5.5/MariaDB 10.0和 PostgreSQL 9.4
    • Debian 9服务器,具有 PHP 7.0和 MySQL 5.5/MariaDB 10.1和 PostgreSQL 9.6
    • 带 PHP 5.4和 MariaDB 5.5和PostgreSQL的CentOS 7服务器
    • 带 PHP 5.6和 SQL Server 2012的Windows 2012 R2

    这应该涵盖大多数环境,但请通知我失败的测试并报告你的环境。 我将尝试覆盖项目的"Docker"文件夹中的大部分 上面 设置。

    Travis CI

    不幸的不是所有的测试都是自动化的。 这里区域的贡献非常欢迎 !

    Linux上的 sql,PostgreSQL和 SQLite

    测试保存在 Tests.php 文件中,但是首先应该将 Config.php.dist 文件复制到 Config.php 并添加数据库凭据。 你可以为一个或者所有支持的数据库添加凭据。

    配置数据库连接后,使用PHPUnit来运行所有测试:

    
    $ wget https://phar.phpunit.de/phpunit.phar
    
    
    $ php phpunit.phar
    
    
    PHPUnit 5.7.17 by Sebastian Bergmann and contributors.
    
    
    
    ............................................................... 63/304 ( 20%)
    
    
    ............................................................... 126/304 ( 41%)
    
    
    ..........................SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS 189/304 ( 62%)
    
    
    SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS........................ 252/304 ( 82%)
    
    
    .................................................... 304/304 (100%)
    
    
    
    Time: 11.16 seconds, Memory: 12.00MB
    
    
    
    OK, but incomplete, skipped, or risky tests!
    
    
    Tests: 6004, Assertions: 338, Skipped: 76.
    
    
    $
    
    
    
    

    你还可以一次只对一个数据库运行测试,如果你希望。 例如要运行MySQL测试,请指定 MysqlTest.php file:

    
    $ php phpunit.phar tests/MysqlTest.php
    
    
    PHPUnit 5.7.17 by Sebastian Bergmann and contributors.
    
    
    
    ................................................................. 65/76 ( 85%)
    
    
    ........... 76/76 (100%)
    
    
    
    Time: 3.54 seconds, Memory: 10.00MB
    
    
    
    OK (76 tests, 113 assertions)
    
    
    $
    
    
    
    

    NB: 你必须使用一个空数据库作为破坏性数据库夹具加载。

    Windows 上的 SQL Server:

    
    C:php-crud-api>c:PHPphp.exe phpunit.phar testsSqlServerTest.php
    
    
    PHPUnit 5.2.10 by Sebastian Bergmann and contributors.
    
    
    
    ................................................................ 64/76 ( 84%)
    
    
    ............ 76/76 (100%)
    
    
    
    Time: 9.53 seconds, Memory: 7.25Mb
    
    
    
    OK (76 tests, 111 assertions)
    
    
    
    C:php-crud-api>
    
    
    
    

    注:必须将空数据库作为desctructive数据库夹具('blog_sqlserver。sql') 加载。

    在 Ubuntu Linux上安装 MySQL

    12.04

    
    apt-get -y remove mysql-server
    
    
    apt-get -y autoremove
    
    
    apt-get -y install software-properties-common
    
    
    add-apt-repository -y ppa:ondrej/mysql-5.6
    
    
    apt-get update
    
    
    apt-get -y install mysql-server
    
    
    
    

    在 Ubuntu Linux上安装 PostGIS

    12.04

    使用以下命令在 Ubuntu Linux上安装 PostGIS:

    
    sudo apt-get install python-software-properties
    
    
    sudo apt-add-repository ppa:ubuntugis/ppa
    
    
    sudo apt-get update
    
    
    sudo apt-get install postgresql-9.1-postgis-2.0
    
    
    
    

    14.04

    使用以下命令在 Ubuntu Linux上安装 PostGIS:

    
    sudo apt-get install postgresql-9.3-postgis-2.1
    
    
    
    

    16.04

    使用以下命令在 Ubuntu Linux上安装 PostGIS:

    
    sudo apt-get install postgresql-9.5-postgis-2.2
    
    
    
    

    finally ( 适用于所有发行版)

    现在为你的数据库启用PostGIS扩展:

    
    sudo -u postgres psql phpcrudapi -c"CREATE EXTENSION postgis;"
    
    
    
    

    在 上面 字符串"phpcrudapi"中,是数据库的名称。

    Nginx 配置示例

    
    server {
    
    
     listen 80 default_server;
    
    
     listen [::]:80 default_server;
    
    
    
     root/var/www/html;
    
    
     index index.php index.html index.htm index.nginx-debian.html;
    
    
     server_name server_domain_or_IP;
    
    
    
     location/{
    
    
     try_files $uri $uri/=404;
    
    
     }
    
    
    
     location ~ [^/].php(/|$) {
    
    
     fastcgi_split_path_info ^(.+.php)(/.+)$;
    
    
     try_files $fastcgi_script_name =404;
    
    
     set $path_info $fastcgi_path_info;
    
    
     fastcgi_param PATH_INFO $path_info;
    
    
     fastcgi_index index.php;
    
    
     include fastcgi.conf;
    
    
     fastcgi_pass unix:/run/php/php7.0-fpm.sock;
    
    
     }
    
    
    
     location ~/.ht {
    
    
     deny all;
    
    
     }
    
    
    }
    
    
    
    

    漂亮的URL

    你可以"重写"从URL中删除" api.php"。

    启用mod_rewrite并将以下内容添加到"。htaccess"file:

    
    RewriteEngine On
    
    
    RewriteCond %{REQUEST_FILENAME}!-d
    
    
    RewriteCond %{REQUEST_FILENAME}!-f
    
    
    RewriteRule ^(.*)$ api.php/$1 [L,QSA]
    
    
    
    

    "。htaccess"文件需要与" api.php"位于同一个文件夹中。

    Nginx

    对于 Nginx,你可能需要添加如下内容:

    
    location/api {
    
    
     rewrite ^/api(.*)$/api.php$1 last;
    
    
    }
    
    
    
    

    应该在 location ~ [^/].php(/|$) 部分之前或者之后添加到你的Nginx 配置中。

    命令行调试

    如果无法让文件正常工作,你可能需要检查使用的两个 环境变量。 取消注释以下行:

    
    var_dump($_SERVER['REQUEST_METHOD'],$_SERVER['PATH_INFO']); die();
    
    
    
    

    然后访问:

    
    http://localhost/api.php/posts
    
    
    
    

    这应该输出:

    
    string(3)"GET"
    
    
    string(6)"/posts"
    
    
    
    

    如果没有,你的宿主环境就会出现错误。

    Composer 安装

    你可以使用 Composer 插件来安装。 在 composer.json file: 中包含库

    {
     "require": {
     "mevdschee/php-crud-api": "dev-master" }
    }

    运行 composer install,然后在你自己的代码中使用库,如下所示:

    <?phpinclude'./vendor/autoload.php';// DB Connection$api=newPHP_CRUD_API(array('dbengine'=>'MySQL','hostname'=>'localhost','username'=>'','password'=>'','database'=>'','charset'=>'utf8'));$api->executeCommand();

    许可证

    MIT


    数据  文件  API  PHP  添加  REST  
    相关文章