• 通达OA二次开发手册V12


    环境编码

    1. UTF-8
    2. 包括PHP、MySQL、nginx等

    PHPMySQL版本

    PHP7.2

    由 PHP5.4 升级为 PHP7.2 64位

    MySQL5.7

    由 MySQL5.6 升级为 MySQL5.7 64位

    PHP版本升级已弃用功能

    each() 函数已弃用,建议使用 foreach()

    语法样例:

    $arr = [1, 2, 3, 4];

    foreach($arr as $key => $val)

    {

    echo "\$a[$key] => $val<br>";

    }

    输出结果:

    $a[0] => 1

    $a[1] => 2

    $a[2] => 3

    $a[3] => 4

    PHP版本升级兼容

    1    由于php7+不支持php_mysql.dll,所以需要改为php_mysqli.dll,有关MySQL的函数需要调整为

    mysqli相关函数,代码中遇到请注意

    mysql 转 mysqli 相关兼容

    mysql_connect(host, user, pwd, connection) 替换 mysqli_connect(host, user, pwd, db) mysql_query($q, $c) 替换 mysqli_query($c, $q)

    mysql_select_db($db, $c) 替换 mysqli_select_db($c, $db)

    mysql_field_name 已弃 解决方案参考:关于如何解决mysqli()没有与之对应mysqli_field_name()问题 - 知乎 mysql_field_name — (mysqli_fetch_field_direct() [name] or [orgname])取得结果中指定字段的字段名

    mysql_error 替换 注:mysqli_error(conn) 参数必选mysql_errno 替换 注:mysqli_errno(conn) 参数必选mysql_numrows 替换 mysqli_num_rows

    mysql_unbuffered_query 替换 mysqli_query (mysqli_query(“SQL语句”, MYSQLI_USE_RESULT);

    )向 MySQL 发送一条 SQL 查询,并不获取和缓存结果的行

    其他mysql函数,绝大部分都可以直接批量替换为mysqli相关函数,使用参考mysqli函数文档

    mysql_affected_rows() mysqli_affected_rows() 的区别

    // MySQL方式

    $query = "select * from td_user";

    $cursor = exequery($conn, $query);

    $count0 = mysql_affected_rows(); var_dump($count0);

    // MySQLI方式

    $query = "select * from td_user";

    $conn = TD::conn();

    $cursor = exequery($conn, $query);

    $count1 = mysqli_num_rows($cursor); var_dump($count1);

    $count2 = mysqli_affected_rows($conn);

    var_dump($count2);

    OA升级相关处理

    1 建议使用pdo的SQL语法,medoo版本1.6 2

    3 参考文档:https://medoo.lvtao.net/1.2/doc.php

    数据库表修改

    拆表:

    user 改为 td_user

    td_user表中的DEPT_ID_OTHER、USER_PRIV_OTHER 转存到user_other中,type=1辅助部门,

    type=2辅助角色

    department表中的1.部门主管,2:部门助理,3:上级主管领导,4:上级分管领导    转存到

    department_manager表中

    user_priv表中,角色对应的菜单FUNC_ID_STR,改成一对多存到user_priv_func user_ext表中U_FUNC_ID_STR 用户菜单ID串,改成一对多存到user_ext_func user_function表原来uid对应的user_func_id_str用户菜单id串,改为多条数据形式

    注意:

    建议非必要不要使用find_in_set函数,性能不好,优先使用    in

    表结构字段建议设置为 NOT NULL DEFAULT ''

    表属性:

    1 表、字段编码均为 utf8_general_ci

    数据库部分数据处理

    unserialize 相关数据处理

    1. 由于之前gbk编码情况下存入数据库中的unserialize数据,在utf-8编码情况下解析后会变为空
    2. 处理方案:
    3. include_once("inc/utility_all.php");
    4. $module_name = gbk2utf8_unserialize($module_name); // gbk数据转为utf8数据,后续该如何处理就如何处理即可

    数据库兼容国产化相关处理

    日期字段默认值 0000-00-00 判断改为 1000-01-01

    时间字段默认值 0000-00-00 00:00:00 判断改为 1000-01-01 00:00:00

    timestamp字段默认值 0000-00-00 00:00:00 判断改为 2000-01-01 00:00:00

    配置文件说明

    OA相关参数:

    MYOA/webroot/inc/td_config.php

    MYOA/webroot/inc/oa_config.php

    1. MYOA_DB_TYPE (在db_config.php中设置,mysql dm kb st...)
    2. MYOA_PRODUCT_TYPE (0 - 标准版,1 - 信创版)

    数据库配置:

    MYOA/webroot/inc/db_config.php

    //默认连接的数据库

    $DB_TYPE = "mysql"; // ['mysql', 'dm', 'kb']

    $MYSQL_SERVER = "127.0.0.1:3336";

    $MYSQL_PORT = "3336"; // ['3336', '5236']

    $MYSQL_USER = "oa";

    $MYSQL_PASS = "myoa888";

    $MYSQL_ROOT_USER = "root";

    $MYSQL_ROOT_PASS = "myoa888";

    $MYSQL_DB = "TD_OA";

    $MYSQL_DB_APP = "TD_APP";

    $MYSQL_DB_CRSCELL = "crscell";

    $MYSQL_DB_ARCHIVE = "TD_OA_ARCHIVE";

    Redis相关兼容

    1 Redis::delete() 转为 Redis::del() 2

    3 Redis::setTimeout() 转为 Redis::EXPIRE()

    PHP新增函数接口

    1  获取当前浏览器
    inc/utility_all.php GetBrowser()

    is_weakpass()

    1  检验是否弱密码,true / false

    GetMembersFromDept($DEPT_ID1, $QUERY_MASTER="")

    1 获取指定主部门的成员user_id串信息

    gbk2utf8_unserialize($str)

    1 获取根据unserialize的gbk数据信息转为unserialize的utf-8数据信息

    is_https()

    1 获取当前访问是否是https请求,true / false

    td_gzcompress($content, $db_type = 'mysql')

    1 获取根据原始内容数据及数据库类型处理后的进制流数据

    td_gzuncompress($compress_content, $db_type = 'mysql')

    1    获取根据数据库中取出的进制流内容数据,针对不通数据库类型处理后的原始内容数据

    1 获取我能管理的用户信息

    2  [['uid' => 1, 'user_id' => 'admin', 'user_name' => '系统管理员'], ...]


    inc/utility_org.php get_manage_user()

    GetUserOtherAllByDeptId($DeptIds, $type=0, $return=0)

    1. 获取指定部门id串为主部门/辅助部门下的人员信息
    2. return 1 - 用户user_id字符串信息
    3. return 0 - 返回用户数组信息

    4  [['uid' => 1, 'user_id' => 'admin'], ...]

    GetUserOtherAllByUserPrivId($UserPrivId, $type=0, $retu

    1. 获取指定角色id串为主角色/辅助角色下的人员信息
    2. return 1 - 用户user_id字符串信息
    3. return 0 - 返回用户数组信息

    4  [['uid' => 1, 'user_id' => 'admin'], ...]

    GetUserOtherIdByUid($uid, $type=0)

    1. 获取指定用户uid的相关信息
    2. type 1 - 辅助部门
    3. type 2 - 辅助角色
    4. type 0 - 辅助部门和辅助角色

    5 ['dept_id_other' => '1,2,3,', 'user_priv_other' => '1,2,3,']

    medoo相关及语法

    1. medoo版本 1.6
    2. webroot/inc/medoo/medoo.php

    SQL实例select

    $ret = TD::DB()->select(TD::tableFix("url"), "*", [

    "OR"

    => [

    "AND #first"

    "URL_TYPE" "USER"

    ],

    "AND #second"

    "URL_TYPE" "USER"

    ]

    => [

    => '3',

    => ''

    => [

    => '2',

    => $_SESSION["LOGIN_USER_ID"]

    ],

    "ORDER" => ["URL_NO" => "ASC"]

    ]);

    var_dump($ret);

    输出结果:

    array(14) { [0]=>

    array(8) {

    ["URL_ID"]=>

    string(2) "23"

    ["URL_NO"]=>

    string(1) "1" ["URL_DESC"]=>

    string(12) "百度搜索"

    ["URL"]=>

    string(16) "http://baidu.com" ["USER"]=>

    string(0) "" ["URL_TYPE"]=>

    string(1) "3" ["SUB_TYPE"]=>

    string(0) "" ["URL_ICON"]=>

    string(13) "ewp_baidu.png"

    }

    [1]=> ...

    }

    insert

    1 TD::DB()->insert(TD::tableFix("im_offline_file"), ['TIME' => date('Y-m-d H:i:s'), 'SRC_UID' => $_SESSION["LOGIN_UID"], ...]);

    2 TD::DB()->id();

    update

    1 TD::DB()->update(TD::tableFix("td_user"), ["ON_STATUS" => 1, ...], ["UID" =>

    $_SESSION["LOGIN_UID"]]);

    delete

    1 TD::DB()->delete(TD::tableFix("address"),["ADD_ID" => $TOK]);

    count

    1 $TOTAL_ITEMS = TD::DB()->count(TD::tableFix('im_offline_file'),['DEST_UID' =>

    $_SESSION["LOGIN_UID"]]);


    prepareQuery

    1. $query="select * from td_user ...";
    2. $row = TD::DB()->prepareQuery($query);

    debug

    1. TD::DB()->debug()->select()
    2. TD::DB()->debug()->update()
    3. TD::DB()->debug()->insert()
    4. TD::DB()->debug()->prepareQuery() 5 ...


    更多参考:中文文档-中文帮助手册-Medoo - 高效的轻量级PHP数据库框架, 提高开发效率!

    存储:

    $compress_content = bin2hex(gzcompress($content));

    $compress_content = '0x'.$compress_content;

    获取:

    $compress_content

    = gzuncompress($ret_test[0]['compress_content']);


    富文本内容压缩存储

    各数据库有关blob处理

    MySQL blob处理

    DM blob处理

    存储:

    $compress_content = bin2hex(gzcompress($content));

    // SQL中 '0x' 可加可不加,达梦会自动转十六进制

    $compress_content = '0x'.$compress_content;

    或者使用 TO_BLOB 函数处理

    获取:

    $compress_content3 = @gzuncompress(hex2bin($ret_test[0] ['compress_content']));

    KB blob处理

    存储:

    $compress_content = bin2hex(gzcompress($content));

    $compress_content = "x'".$compress_content."'";

    获取:

    SELECT "COMPRESS_CONTENT"::BYTEA FROM "test_blob" WHERE id=1146;

    1. medoo中CONTENT别名aa
    2. $ret_test = TD::DB()->select(TD::tableFix("test_blob"), ['CONTENT(aa)', 'COMPRESS_CONTENT'], array(
    3. "id" => $test_id 4 ));

    业务代码使用

    新增 & 修改

    include_once("inc/utility_all.php");

    $COMPRESS_CONTENT = td_gzcompress($CONTENT);

    // 方法一:推荐

    TD::DB()->insert('news', [

    "COMPRESS_CONTENT[BLOB]" => $COMPRESS_CONTENT // 注:变量不需要使用引号处理

    ]);

    // 方法二:

    $query = "insert into news (`COMPRESS_CONTENT`) values ($COMPRESS_CONTENT);"; // 注:变量不需要使用引号处理exequery(TD::conn(), $query);

    // 方法三:

    $query = "insert into news (`COMPRESS_CONTENT`) values ($COMPRESS_CONTENT);"; // 注:变量不需要使用引号处理TD::DB()->prepareQuery($query);

    查看

    1. include_once("inc/utility_all.php");
    2. $COMPRESS_CONTENT = td_gzuncompress($ROW["COMPRESS_CONTENT"]);

    归档数据库使用

    方法一:直接ARCHIVE_DB连接数据库型 (推荐使用)

    1. $table_name = "email_body_20190807";
    2. $rows = TD::ARCHIVE_DB()->select($table_name, ['body_id', 'subject']);

    方法二:DB函数重连数据库型

    1. $table_name = "email_body_20190807";
    2. $rows = TD::DB('1', true, 'td_oa_archive')->select($table_name, ['body_id', 'subject']);
    3. $table_name = "email_body_20190807";
    4. $rows = TD::DB('1')->select($table_name, ['body_id', 'subject']);

    方法三:复杂SQL

    1. $query = "select body_id,subject from td_oa_archive.email_body_20190807";
    2. $rows = TD::DB()->prepareQuery($query);

    方法四:mysqli连接数据库型

    1. $query = "select body_id,subject from td_oa_archive.email_body_20190807";
    2. $cursor = exequery(TD::conn(), $query);
    3. while($rows = mysqli_fetch_array($cursor))

    方法五:medoo兼容处理型

    1. $table_name = "td_oa_archive.email_body_20190807";
    2. $rows = TD::DB()->select($table_name, ['body_id', 'subject']);

    MySQL升级相关

    配置文件my.ini修改

    [mysql]

    default-character-set=utf8

    [mysqld]

    character-set-server=utf8 skip-ssl

    # innodb_file_format=Barracuda log_timestamps = SYSTEM

    # thread_concurrency =8

    sql_mode=NO_ENGINE_SUBSTITUTION

    数据库管理工具配置

    下载

    官网下载phpMyAdmin工具:http://www.phpmyadmin.net,建议下载对应PHP版本的最新的all- language版本(准备工作文件已经给提供)

    解压缩

    在MYOA\webroot目录下新建一个目录,如mysql369(为了防止他人利用该工具侵入数据库系统,可把 目录名设为比较复杂的,如MySQL2345,避免目录名被猜测到。),将下载的程序包解压后拷贝至mysql369目录下

    修改配置文件

    用文本编辑器,如记事本,打开MySQL管理工具目录,复制config.sample.inc.php文件并改名为

    confing.inc.php,打开后修改以下配置信息:

    $cfg['blowfish_secret'] = ''; //随便输入一个字符串,加密Cookie等信息

    $cfg['Servers'][$i]['auth_type'] = 'http'; //http,config,cookie,建议使用http

    $cfg['Servers'][$i]['host'] = 'localhost'; //数据库地址,默认为localhost

    $cfg['Servers'][$i]['port'] = '3336'; //数据库端口,默认为3336

    $cfg['Servers'][$i]['user'] = 'root'; //数据库用户名,默认为root

    $cfg['Servers'][$i]['password'] = ''; //数据库密码,默认为myoa888

    使用phpMyAdmin

    MySQL管理工具地址:http://OA地址/mysql1369,注意,进入后先选择中文界面(中文-Chinese simplified )。该管理工具的使用需具有一定数据库基础,请勿进行危险操作,以免导致数据丢失

    注:也可使用其他的数据库管理工具,如Navicat等

    MySQL升级遇到问题汇总

     问题一:mysql5.7 BLOB, TEXT, GEOMETRY or JSON column 'user_str' can't have a default value

    1. select @@sql_mode 查看模式,修改模式为:
    2. sql_mode=NO_ENGINE_SUBSTITUTION
    3. //STRICT_TRANS_TABLES 存储引擎启用严格模式,非法数据值被拒绝

  • 相关阅读:
    2.12 PE结构:实现PE字节注入
    数据结构(2)时间复杂度——渐进时间复杂度、渐进上界、渐进下界
    Spring Cloud 常用框架组件
    Vue中的Ajax②(slot插槽)
    STM32单片机三线制PT100温度采集控制系统LCD12864显示器
    Mysql :创建数据库和管理数据库
    7月份最后一篇博客
    简述两种爆破ssh弱口令的方法
    stm32的ADC采样率如何通过Time定时器进行控制
    输入输出系统
  • 原文地址:https://blog.csdn.net/u011994288/article/details/125633317