65.9K
CodeProject 正在变化。 阅读更多。
Home

MVP.PHP 数据同步

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.47/5 (3投票s)

2014 年 12 月 13 日

CPOL

5分钟阅读

viewsIcon

20152

downloadIcon

254

MVP 是一个用于管理数据库表的类库,并提供简单的迁移解决方案。

引言

MVP.PHP 是一个包含 2 个主要类和其他实用函数的库。MVP.PHP 使数据表模型定义比以往任何时候都更容易,无论使用何种开发框架,并使 PHP 数组和 SQL 表列之间建立简单的关系。

MVP.PHP 包含 MVPENTITY 以及直接在 .php 文件中定义的相关函数。

背景

访问 MySQL 数据库和定义表依赖于框架,并非易事。因此,mvp.php 试图使定义表更容易、更快地迁移和由程序员操作,并为他带来对 MySQL 查询的自然访问。

理解概念

如前所述,该库包含两个主要类。

Entity:此类用于定义数据库中的表并与 PHP 和 MySQL 同步。此类仅用于在迁移(例如从本地主机到 Web 服务器)中生成表或修改列,并且在更新、插入或读取表数据时永远不需要包含。

MVP:此类用于任何插入、更新或读取表的内容,或运行 MySQL 查询,并且应该在项目的整个项目或数据修改库中可访问。

Using the Code

MySQL 服务器连接

MVP 类包含一个有用的 static 函数,它将连接到下面描述的 MySQL 服务

<?php
Require ‘mvp.php’;
Mvp::autoconfig(‘localhost:3306’ , ‘myusername’ , ‘mypassword’ , ‘databasename’);
?>

上述函数将连接 MySQL,并为当前会话选择数据库。如果数据库不存在,它将创建一个名为第 4 个参数的数据库。

注意:在使用 entity 或 MVP 类之前,必须使用此函数。它们假定 PHP 应用程序已首先连接到 MySQL 服务器。

给初学者的注意事项:MySQL 连接应在每个页面开始,否则它们将由父级包含。因此,如果您将 autoconfig 函数放在起始代码的顶部,则整个项目将可以访问 MySQL。

实体类

使用 entity 类定义数据表非常简单,如下所述。

通过 [tablename] 构造函数参数实例化 entity 类后,entity 包含几个函数,它们可以委托 MySQL 列类型,如 varchartextint 等。

<?php
Require ‘mvp.php’;
$e = new entity(‘mytable’);
$e->target(“mysql”);
$e->varchar(“username” , 200);
$e->varchar(“password” , 100);
$e->text(“welcomemessage”);
$e->int(“totalvisists”);
$e->AsyncMySQL();
?>

AsyncMySQL:此函数将启动 PHP 和 MySQL 之间的查询,并将表定义转换为 SQL 查询。

重要的是,当您使用 MVP 或 entity 类时,RECORD_ID 将是您的记录主键,它会自动生成并且是 AUTO_INCREMNT,因此您无需在查询中再次定义它。

通过运行 AsyncMySQL 函数,将生成具有以下描述的表,或者如果存在,仍然会生成。entity 类还将考虑的另一个选项是,如果目标 MySQL 表的列少于新定义,它将自动生成。这将减少在客户网站从开发计算机更新后在 phpmyadmin 中操作 MySQL 表。

MVP 类

无论现有表还是通过 entity 生成的表,MVP 类都将表作为数据集连接到 PHP 脚本。为了使 MVP 更简单,数据集是原始 PHP 数组。同样,对于插入或更新记录,原始 PHP 数组作为参数的输入,因此可以非常简单地存储和读取数据,而无需浪费时间进行类型转换。

读取记录 vs. 读取记录集

Mvp 包含两个用于读取表数据的函数:selectselects。这两个函数之间的区别是可以预测的。Select 获取单个记录(通过 RECORD_ID),而 selects 可以通过实现下面示例中解释的 MySQL 条件来获取多条记录。

<?php
Require ‘mvp.php’;
$mvp = new mvp(‘mytable’); 
// select RECORD_ID = 1
$dataset = $mvp->select(1);
print_r($dataset); 
/* $dataset will be printed like:
Array(
    ‘username’ => ‘’ ,
    ‘password’ => ‘’,
    ...
);*/
$condition = array(
        ‘limit’ => 5 , ‘where’ => ‘RECORD_ID > 10’ , ‘order’ =>’RECORD_ID desc’,
        ‘column’ => ‘username , password’
);
$dataset = $mvp->selects($condition); 
print_r($dataset); 
/* $dataset will be printed like:
Array(
   [0] => array(
    ‘username’ => ‘’ ,
    ‘password’ => ‘’
   ),
   [0] => array(
    ‘username’ => ‘’ ,
    ‘password’ => ‘’
   ) 
);*/?>

如您所见,对于 selects 函数,应仅传递一个参数,它是一个可以包含 limit、column、where 和 order 四个参数的数组。但与 select 应该考虑的另一个区别是它的返回类型是数组。

selects 中,即使您获得 1 条记录,它也位于索引 0 的子数组中,当结果包含更多记录时,您可以使用 foreach 语句访问它们。

<?php
Require ‘mvp.php’;
$mvp = new mvp(‘mytable’);
foreach ($mvp->selects() as $q) {
        echo $q[‘username’] . “<br />”;
}?>

注意:mvp->selects(null) 将返回表中所有记录,并具有 MySQL 中定义的默认限制(通常是 1000 条记录和所有列)。

插入记录

从 PHP 数组、$_POST$_GET$_SESSION 插入数据是 MVP 的选项,可以通过数组类型进行 insertupdate

<?php
Require ‘mvp.php’;
$mvp = new mvp(‘mytable’);
$data = array(‘username’ => $_POST[‘username’] , ‘password’ => md5($_POST[‘password’]));
$unique_id = $mvp->insert($data);
If ($unique_id === false) echo “There was a problem”; else echo “Okay! New record id: $unique_id”; 
?>

如以上代码所述,可以通过与 MySQL 表具有相同列名的数组来插入表中的行。插入前的值将是 SQL 注入安全的。如果 $data 中的列名在表中不存在,它将不会被插入到表中。

如果插入行成功,将产生一个数字(RECORD_ID)作为 insert 函数的返回值,否则返回 false

直接从用户帖子插入?!

MVP 表示您可以直接从 $_POST(用户浏览器发送的数据)插入表单数据。这可能不是一个非常安全的选择,但对于我们不将安全性和数据操作视为威胁的页面来说,这是可以发生的。

<?php
Require ‘mvp.php’;
$mvp = new mvp(‘mytable’);
If (!null($_POST[‘username’])) {
//$data = array(‘username’ => $_POST[‘username’] , ‘password’ => md5($_POST[‘password’])); 
// saving directly $_POST array, but if we want md5 password before we can:
$_POST[‘password’] = md5($_POST[‘password’]);
$unique_id = $mvp->insert($_POST); 
If ($unique_id === false) echo “There was a problem”; else echo “Okay! New record id: $unique_id”;
}
?>
<html>
<form method=”post”>
            <input type=”text” name=”username” />
            <input type=”password” name=”password” />
            <input type=”submit” /> 
</form>
</html> 

注意:在上面的代码中,我们直接保存了用户的输入,但在将其输入 mvp->insert 之前对密码进行了一些小的更改。

注意null 函数是 mvp.php 的一个函数,它将检查一个变量是否包含任何内容。它将检查 $x==””$x==null 这两种类型。

注意:对于 $_SESSION$_GET 全局数组,也可以实现同样的功能。

更新记录

更新记录与插入类似,但有 2 个区别

  • Update 函数接受 2 个参数,第一个是 RECORD_ID,类型为 int
  • 第二个参数数组的索引名应存在于列名中。
<?php
Require ‘mvp.php’;
$mvp = new mvp(‘mytable’);
$record = 10;
$data = array(‘username’ => $_POST[‘username’] , ‘password’ => md5($_POST[‘password’]));
$unique_id = $mvp->update($record , $data);
If ($unique === true ) {
        echo “Record updated”;
}?>

删除记录

可以通过 drop 函数通过获取 RECORD_ID 来删除记录。

<?php
Require ‘mvp.php’;
$mvp = new mvp(‘mytable’);
$result = $mvp->drop(20);
?>

计算记录数

获取表的总记录数并使用返回结果集

<?php
Require ‘mvp.php’;
$mvp = new mvp(‘mytable’);
$result = $mvp->count();
?>

条目是否存在

可以通过比较某一列是否具有某个值来快速获取记录。这在您想要检查用户名和密码是否存在于您的表中时很有用。

<?php
Require ‘mvp.php’;
$mvp = new mvp(‘mytable’);
$result = $mvp->entryexists($column , $value);
$record_id = $mvp->whereexists($column , $value);
?>

获取表列

您可以通过 getcolumns() 函数获取 MVP 中的列名和类型列表。它返回表名和类型的数组。

MVP.PHP 函数

mvp.php 文件中有一系列有用的函数,当您需要它时,它们无需初始化即可访问。

<?php 
Require ‘mvp.php’;
// use this instead of $mvp->insert()
$x = ToDB(‘table name’ , array(‘name’=>’val’ , ‘name1’ => ‘val1’));
$x = FromDb(‘table name’ , array(/* condition of selects($condition)*/);
$x = GetNextRecord(“Table” , “RECORD_ID”);
?>

注意GetNextRecord 函数可用于在特定记录之后获取下一个记录 RECORD_ID。由于有时会删除一些记录,因此下一个记录的主键可能增加超过 1。

关注点

使用此库很有用,因为它与框架无关,代码非常轻量级,并且可以轻松访问和迁移。

历史

  • MVP 类的设计
  • 用于定义表和迁移的 Entity 类的设计
  • 文章于 2014/12/13 更新
© . All rights reserved.