帮酷LOGO
0 0 评论
  • 显示原文与译文双语对照的内容
文章标签:PHP  WRAP  CRUD  换行  PDO  
MySQL PDO Wrapper (php, mysql, pdo, crud, library)

  • 源代码名称:simplon_mysql
  • 源代码网址:http://www.github.com/fightbulc/simplon_mysql
  • simplon_mysql源代码文档
  • simplon_mysql源代码下载
  • Git URL:
    git://www.github.com/fightbulc/simplon_mysql.git
  • Git Clone代码到本地:
    git clone http://www.github.com/fightbulc/simplon_mysql
  • Subversion代码到本地:
    $ svn co --depth empty http://www.github.com/fightbulc/simplon_mysql
    Checked out revision 1.
    $ cd repo
    $ svn up trunk
    
  •  _ _ _ 
     ___(_)_ __ ___ _ __ | | ___ _ __ _ __ ___ _ _ ___ __ _| |
    /__| | '_ ` _ | '_ | |/_ | '_ | '_ ` _ | | |/__|/_` | |
    __ | | | | | | |_) | | (_) | | | | | | | | | | |_| __ (_| | |
    |___/_|_| |_| |_|. __/|_|___/|_| |_| |_| |_| |_|__, |___/__, |_|
     |_| |___/|_| 
    simplon/mysql

    Dependecies

    • PHP> = 7.1
    • PDO

    1安装

    轻松安装 Composer。仍然不知道 Composer 是什么? 请告知你自己,这里是

    {
     "require": {
     "simplon/mysql": "*" }
    }

    2直接 vs CRUD

    我实现了两种与MySQL交互的不同方式。 第一个选项是通常与数据库交互的一个选项。 下面是一个简单的例子来展示我的意思:

    $data=$dbConn->fetchRow('SELECT*FROM names WHERE name = :name', ['name'=>'Peter']);//// $data is an array with our result//

    在constrast到之前的方法中,CRUD更加结构化,使用 storemodel。 此外,它还使用 Builder模式与数据库交互。 关于如何重写上述 direct query的一个快速示例:

    $store=newNamesStore($dbConn);$model=$store->read( (newReadQueryBuilder())->addCondition(NameModel::COLUMN_NAME, 'Peter'));//// $model is a class with our result data abstracted//

    3安装连接

    库需要一个配置值对象,以便用MySQL实例化连接。 了解它的完成方式:

    $pdo=newPDOConnector('localhost', // server'root', // user'root', // password'database'// database);$pdoConn=$pdo->connect('utf8', []); // charset, options//// you could now interact with PDO for instance setting attributes etc:// $pdoConn->setAttribute($attribute, $value);//$dbConn=newMysql($pdoConn);

    4用法:直接访问

    4.1.查询

    FetchColumn

    从第一个 MATCH 返回选定的列。 下面的示例返回 id 或者 null 如果未找到任何内容。

    $result=$dbConn->fetchColumn('SELECT id FROM names WHERE name = :name', ['name'=>'Peter']);// resultvar_dump($result); // '1' || null
    FetchColumnMany

    返回一个 array,其中包含所有匹配数据集的选定列。 在下面的示例中,如果没有找到任何内容,将返回一个带有所有 ids的array 或者 null

    $result=$dbConn->fetchColumnMany('SELECT id FROM names WHERE name = :name', ['name'=>'Peter']);// resultvar_dump($result); // ['1', '15', '30',.. .] || null
    FetchColumnManyCursor

    一次返回一个匹配的数据集。 它是资源高效,因此当你的结果有很多数据时方便。 在下面的示例中,如果有匹配或者没有发生任何情况,你可以循环遍历foreach循环。

    $cursor=$dbConn->fetchColumnMany('SELECT id FROM names WHERE name = :name', ['name'=>'Peter']);foreach ($cursoras$result){var_dump($result); // '1'}
    FetchRow

    从匹配的数据集中返回所有选定的列。 下面的示例返回匹配数据集的idage。 如果没有匹配的null 将返回。

    $result=$dbConn->fetchRow('SELECT id, age FROM names WHERE name = :name', ['name'=>'Peter']);var_dump($result); // ['id' => '1', 'age' => '22'] || null
    FetchRowMany

    从所有匹配的数据集中返回所有选定的列。 下面的示例返回每个匹配的数据集 idage。 如果没有匹配的null 将返回。

    $result=$dbConn->fetchRowMany('SELECT id, age FROM names WHERE name = :name', ['name'=>'Peter']);var_dump($result); // [ ['id' => '1', 'age' => '22'], ['id' => '15', 'age' => '40'],.. . ] || null
    FetchRowManyCursor

    FetchColumnManyCursor 相同的解释,除了接收所有选中的列。

    $result=$dbConn->fetchRowMany('SELECT id, age FROM names WHERE name = :name', ['name'=>'Peter']);foreach ($cursoras$result){var_dump($result); // ['id' => '1', 'age' => '22']}

    4.2插入

    单个数据

    将数据插入数据库非常简单。 遵循下面的示例:

    $data= ['id'=>false,'name'=>'Peter','age'=>45,];$id=$dbConn->insert('names', $data);var_dump($id); // 50 || bool

    结果取决于表。 如果表包含 autoincrementing ID 列,你将收到所插入数据的ID计数。 如果表不包含这样的字段,你将收到 true 以获得成功的插入。 如果有任何错误你将收到 false

    许多数据集

    请按照以下示例一次插入多个数据集:

    $data= [ ['id'=>false,'name'=>'Peter','age'=>45, ], ['id'=>false,'name'=>'Peter','age'=>16, ],];$id=$dbConn->insertMany('names', $data);var_dump($id); // 50 || bool

    结果取决于表。 如果表包含 autoincrementing ID 列,你将收到所插入数据的ID计数。 如果表不包含这样的字段,你将收到 true 以获得成功的插入。 如果有任何错误你将收到 false

    4.3更新

    简单更新语句

    插入语句相同,说明更新。 易于理解如果更新成功,响应将为 true。 如果未更新任何内容,你将收到 null

    $conds= ['id'=>50,];$data= ['name'=>'Peter','age'=>50,];$result=$dbConn->update('names', $conds, $data);var_dump($result); // true || null
    自定义更新条件查询

    插入语句相同,说明更新。 易于理解如果更新成功,响应将为 true。 如果未更新任何内容,你将收到 null

    $conds= ['id'=>50,'name'=>'Peter',];// custom conditions query$condsQuery='id = :id OR name =: name';$data= ['name'=>'Peter','age'=>50,];$result=$dbConn->update('names', $conds, $data, $condsQuery);var_dump($result); // true || null

    4.4替换

    is: REPLACEINSERT 完全相同,除非表中的旧行与 PRIMARY KEY 或者 UNIQUE index的新行相同,否则旧行将被删除。

    替换单个数据集

    因此,如果出现错误,你将收到 INSERT ID 或者 false

    $data= ['id'=>5,'name'=>'Peter','age'=>16,];$result=$dbConn->replace('names', $data);var_dump($result); // 1 || false
    替换多个数据集

    因此,如果出现错误,你将收到 INSERT IDs 或者 false的array。

    $data= [ ['id'=>5,'name'=>'Peter','age'=>16, ], ['id'=>10,'name'=>'John','age'=>22, ],];$result=$dbConn->replaceMany('names', $data);var_dump($result); // [5, 10] || false

    4.5.删除

    简单删除条件

    下面的示例演示如何删除数据。 如果查询成功,我们将收到 truefalse

    $result=$dbConn->delete('names', ['id'=>50]);var_dump($result); // true || false
    自定义删除条件查询

    下面的示例演示如何使用自定义条件查询移除数据。 如果查询成功,我们将收到 truefalse

    $conds= ['id'=>50,'name'=>'John',];// custom conditions query$condsQuery='id = :id OR name =: name';$result=$dbConn->delete('names', $conds, $condsQuery);var_dump($result); // true || false

    4.6执行

    这里方法用于不需要任何参数( 如 TRUNCATE )的调用。 如果调用成功,你将收到 true。 如果失败,MysqlException 将被抛出。

    $result=$dbConn->executeSql('TRUNCATE names');var_dump($result); // true

    5用法:CRUD

    下面的查询示例将重写上述 direct access 示例。 为此,我们需要一个 store 和一个相关的model

    5.1安装存储

    namespaceTestCrud;useSimplonMysqlCrudCrudModelInterface;useSimplonMysqlCrudCrudStore;useSimplonMysqlMysqlException;useSimplonMysqlQueryBuilderCreateQueryBuilder;useSimplonMysqlQueryBuilderDeleteQueryBuilder;useSimplonMysqlQueryBuilderReadQueryBuilder;useSimplonMysqlQueryBuilderUpdateQueryBuilder;/** * @package TestCrud*/classNamesStoreextendsCrudStore{/** * @return string*/publicfunctiongetTableName(): string {return'names'; }/** * @return CrudModelInterface*/publicfunctiongetModel(): CrudModelInterface {returnnewNameModel(); }/** * @param CreateQueryBuilder $builder * * @return NameModel * @throws MysqlException*/publicfunctioncreate(CreateQueryBuilder$builder): NameModel {/** @var NameModel $model */$model=$this->crudCreate($builder);return$model; }/** * @param ReadQueryBuilder|null $builder * * @return NameModel[]|null * @throws MysqlException*/publicfunctionread(?ReadQueryBuilder$builder=null):?array {/** @var NameModel[]|null $response */$response=$this->crudRead($builder);return$response; }/** * @param ReadQueryBuilder $builder * * @return null|NameModel * @throws MysqlException*/publicfunctionreadOne(ReadQueryBuilder$builder):?NameModel {/** @var NameModel|null $response */$response=$this->crudReadOne($builder);return$response; }/** * @param UpdateQueryBuilder $builder * * @return NameModel * @throws MysqlException*/publicfunctionupdate(UpdateQueryBuilder$builder): NameModel {/** @var NameModel|null $model */$model=$this->crudUpdate($builder);return$model; }/** * @param DeleteQueryBuilder $builder * * @return bool * @throws MysqlException*/publicfunctiondelete(DeleteQueryBuilder$builder): bool {return$this->crudDelete($builder); } /** * @param int $id * * @return null|NameModel * @throws MysqlException*/publicfunctioncustomMethod(int$id):?NameModel {$query='SELECT*FROM'.$this->getTableName() .' WHERE id=:id';if ($result=$this->getCrudManager()->getMysql()->fetchRow($query, ['id'=>$id])) {return (newNameModel())->fromArray($result); }returnnull; }}

    5.2安装模型

    <?phpnamespaceTestCrud;useSimplonMysqlCrudCrudModel;/** * @package TestCrud*/classNameModelextendsCrudModel{constCOLUMN_ID='id';constCOLUMN_NAME='name';constCOLUMN_AGE='age';/** * @var int*/protected$id;/** * @var string*/protected$name;/** * @var int*/protected$age;/** * @return int*/publicfunctiongetId(): int {return (int)$this->id; }/** * @param int $id * * @return NameModel*/publicfunctionsetId(int$id): NameModel {$this->id=$id;return$this; }/** * @return string*/publicfunctiongetName(): string {return$this->name; }/** * @param string $name * * @return NameModel*/publicfunctionsetName(string$name): NameModel {$this->name=$name;return$this; }/** * @return int*/publicfunctiongetAge(): int {return (int)$this->age; }/** * @param int $age * * @return NameModel*/publicfunctionsetAge(int$age): NameModel {$this->age=$age;return$this; }}

    5.3。连接存储

    为了与我们的存储交互,我们需要创建一个实例。 对于以下点,我们将使用这个实例。

    $store=newNamesStore($pdoConn);

    5.4.查询

    获取一项

    如果无法匹配任何内容,则返回 name model 或者 null

    $model=$store->readOne( (newReadQueryBuilder())->addCondition(NameModel::COLUMN_NAME, 'Peter'));echo$model->getId(); // prints user id

    你可以从 addCondition 中使用运算符:

    $model=$store->readOne( (newReadQueryBuilder())->addCondition(NameModel::COLUMN_AGE, 20, '>'));echo$model->getId(); // prints user id
    获取多个项目

    返回 name models 或者 null的array,如果不能匹配。

    $models=$store->read( (newReadQueryBuilder())->addCondition(NameModel::COLUMN_NAME, 'Peter'));echo$models[0]->getId(); // prints user id from first matched model

    5.5插入

    下面的示例演示如何创建新的存储项。

    $model=$store->create( (newCreateQueryBuilder())->setModel( (newNameModel())->setName('Johnny')->setAge(22) ));

    5.6.更新

    下面的示例演示如何更新现有的存储项。

    //// fetch a model//$model=$store->readOne( (newReadQueryBuilder())->addCondition(NameModel::COLUMN_NAME, 'Peter'));//// update age//$model->setAge(36);//// persist change//$model=$store->update( (newUpdateQueryBuilder())->setModel($model)->addCondition(NameModel::COLUMN_ID, $model->getId()));

    5.7.删除

    下面的示例演示如何删除现有的存储项。

    //// fetch a model//$model=$store->readOne( (newReadQueryBuilder())->addCondition(NameModel::COLUMN_NAME, 'Peter'));//// delete model from store//$store->delete( (newDeleteQueryBuilder())->addCondition(NameModel::COLUMN_ID, $model->getId()))

    5.8.自定义查询

    你还可以为你的存储编写自定义查询/处理。 我向商店添加了一个方法,该方法演示如何实现自定义处理。

    /** * @param int $id * * @return null|NameModel * @throws MysqlException*/publicfunctioncustomMethod(int$id):?NameModel{$query='SELECT*FROM'.$this->getTableName() .' WHERE id=:id';if ($result=$this->getCrudManager()->getMysql()->fetchRow($query, ['id'=>$id])) {return (newNameModel())->fromArray($result); }returnnull;}

    6.IN() 子句处理

    6.1问题

    没有通过PDO使用 IN() 子句的方法。 这里功能只是没有给出。 但是,你可以执行如下操作:

    $ids=array(1,2,3,4,5);$query="SELECT*FROM users WHERE id IN (".join(',', $ids) .")";

    乍看起来不错- 不性感,但可能是工作? 这个方法只适用于 INTEGERS,不支持用户输入- reason我们在第一个地方使用的原因。

    以下是一个不工作的字符串示例:

    $emails=array('johnny@me.com', 'peter@ibm.com');$query="SELECT*FROM users WHERE email IN (".join(',', $emails) .")";

    这样做的唯一方法是将每个值包装如下: '"email"' 工作太多了。

    6.2解决方案

    要利用内置的IN() Clause 和转义和类型处理,可以在直接访问中执行以下操作。 CRUD将自动为你执行查询构建。

    // integers$conds=array('ids'=>array(1,2,3,4,5));$query="SELECT*FROM users WHERE id IN (:ids)";// strings$conds=array('emails'=>array('johnny@me.com', 'peter@ibm.com'));$query="SELECT*FROM users WHERE email IN (:emails)";

    7异常

    对于两个访问方法,( 直接,sqlmanager ) 发生的异常将被 MysqlException 包起来。 所有基本异常信息将在 Exception Message 中汇总为 JSON

    下面是一个可能看起来像的示例:

    {"query":"SELECT pro_id FROM names WHERE connector_type = :connectorType","params":{"connectorType":"FB"},"errorInfo":{"sqlStateCode":"42S22","code":1054,"message":"Unknown column 'pro_id' in 'field list'"}}
    许可证

    simplon/mysql可以根据MIT许可条款自由发行。

    版权所有( c ) 2017 Tino Ehrich ( tino@bigpun.me )

    若要在取得该软件副本时免费授予任何人,如有下列条件的软件,请免费授予该软件的副本,并与相关的文档文件("软件") 进行许可,包括不受限制的权利,包括以下条件:

    上述版权声明和本许可声明须包括在所有的副本或实质性部分的软件。

    软件是"是",没有任何保证,表示或者隐含,包括但不限于销售,适合特定用途和 NONINFRINGEMENT。 作者或者版权持有人在合同。侵权或者它的他与软件或者它的他用户交易的行为。



    文章标签:PHP  WRAP  换行  CRUD  PDO  

    Copyright © 2011 HelpLib All rights reserved.    知识分享协议 京ICP备05059198号-3  |  如果智培  |  酷兔英语