快乐每一天

自己选择的路,跪着也要走下去...

ThinkPHP5 中try{}catch{}是事务异常处理 +回滚事务


    public  function test1()
    {
        
            Db::startTrans();
            // 事务 
            try{ 
            // 第1条数据更新id 18
            $a=Db::name('user')->where("id", 15)->update(['ledou' => 8888888888]);
            // 判断是否更新成功
                if (!$a) {
                throw new \Exception("第1条数据更新失败"); 
                }
                // 第2条数据更新 id 9
                $b= Db::name('order')->where('id',9)
                        ->update(['status' => 8]);
                // 判断是否更新成功
                if (!$b) {
                    throw new \Exception("第2条数据更新失败");
                    } 
                    // 执行提交操作
                Db::commit();
                }catch(\Exception $e){
                // 回滚事务
                Db::rollback();
                // 获取提示信息
                dump($e->getMessage()); 
                
                }
                if ($a&$b) {
                
                 return json(['code' => 1, 'msg' => '成功']);
                }else{
                 return json(['code' => 0, 'msg' => '失败']);
                
                }
        
    }
阅读全文

PHP 使用PhpExcle导出报错 Could not open php://output for writing

$objWriter->save('php://output'); 

改为

$this->SaveViaTempFile($objWriter);
public function SaveViaTempFile($objWriter){
        $filePath = sys_get_temp_dir() . "/" . rand(0, getrandmax()) . rand(0, getrandmax()) . ".tmp";
        $objWriter->save($filePath);
        readfile($filePath);
        unlink($filePath);
    }

如果修复后报错

ZipArchive::close(): Failure to create temporary file: Permission denied

看报错明细指向那个目录权限不足就去开启即可修改对应目录权限为777 就能解决。

参考网址:
地址1 地址2

阅读全文

ThinkPHP5.1.*导入导出Excle(注意,跟TP5.0.*区别还是蛮大的)

导入操作

今天来跟大家分享一下我用thinkphp5.1上传excel数据遇到的坑。我们的宗旨是勇于尝鲜(听说柿子和大闸蟹一起吃是剧毒,我想中毒,有对我不满的要抓住机会了,听说螃蟹越大毒性也越强啊)。

首先composer下载phpexcel类库 在doc中切换到项目根目录
输入命令:composer require phpoffice/phpexcel
如果你没安装compose那你是安装composer还是去官网下载类库随便你,你开心就好。

总之要把phpexcel类库放到你的项目根目录就可以啦。

2019-05-15T08:46:56.png

下面是Html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form id="input-excel" method="post" action="{:url('index/excel/importExcel')}" enctype="multipart/form-data">
<div class="form-group">
    <input type="hidden" name="table" value="tablename"/>
    <input type="file" name="excel" id="excel">
    <input type="submit" value="导入"/>
    <p class="help-block"></p>
</div>
</form>
</body>
</html>

这里是重点,要做笔记,要考的

这是控制器代码:注意:tp5.1中vendor不能用了,import不能用了,总之就是不能用,不能用。所以

一定要使用user导入PHPExcel_IOFactory。

<?php

namespace app\index\controller;

use think\Controller;
use think\Db;
use Env;
use PHPExcel_IOFactory;

class Excel extends Controller{

    public function excel(){
        return $this->fetch();
    }

public function importExcel(){
    header("content-type:text/html;charset=utf-8");
    //上传excel文件
    $file = request()->file('excel');
    //将文件保存到public/uploads目录下面
    $info = $file->validate(['size'=>1048576,'ext'=>'xls,xlsx'])->move( './uploads');
    if($info){
        //获取上传到后台的文件名
        $fileName = $info->getSaveName();
        //获取文件路径
        $filePath = Env::get('root_path').'public'.DIRECTORY_SEPARATOR.'uploads'.DIRECTORY_SEPARATOR.$fileName;
        //获取文件后缀
        $suffix = $info->getExtension();
        //判断哪种类型
        if($suffix=="xlsx"){
            $reader = \PHPExcel_IOFactory::createReader('Excel2007');
            }else{
            $reader = PHPExcel_IOFactory::createReader('Excel5'); 
            }
        }else{
            $this->error('文件过大或格式不正确导致上传失败-_-!');
        }
    //载入excel文件
    $excel = $reader->load("$filePath",$encode = 'utf-8');
    //读取第一张表
    $sheet = $excel->getSheet(0);
    //获取总行数
    $row_num = $sheet->getHighestRow();
    //获取总列数
    $col_num = $sheet->getHighestColumn();
    $data = []; //数组形式获取表格数据
    for ($i=2; $i <=$row_num; $i++) { 
        $data['user_id']   = $sheet->getCell("A".$i)->getValue();
        $data['user_name'] = $sheet->getCell("B".$i)->getValue();
        $data['phone']     = $excel->getActiveSheet()->getCell("C".$i)->getValue();
        $data['email']     = $excel->getActiveSheet()->getCell("D".$i)->getValue();
        //将数据保存到数据库
        // $res = Db::name('user1')->insert($data);
    }
    return json($data);

}
}

版本二(自己使用的)

/*账号批量导入*/
    public function inserExcel(){
        $uid=$this->uid;
        //上传excel文件
        $file = request()->file('excel');
        //将文件保存到public/uploads目录下面
        $info = $file->validate(['size'=>1048576,'ext'=>'xls,xlsx'])->move( './uploads');
        if($info){
            //获取上传到后台的文件名
            $fileName = $info->getSaveName();
            //获取文件路径
            $filePath = Env::get('root_path').'public'.DIRECTORY_SEPARATOR.'uploads'.DIRECTORY_SEPARATOR.$fileName;
            //获取文件后缀
            $suffix = $info->getExtension();
            //判断哪种类型
            if($suffix=="xlsx"){
                $reader = \PHPExcel_IOFactory::createReader('Excel2007');
            }else{
                $reader = \PHPExcel_IOFactory::createReader('Excel5');
            }
        }else{
            $this->error('文件过大或格式不正确导致上传失败-_-!');
        }
        //载入excel文件
        $excel = $reader->load("$filePath",$encode = 'utf-8');
        //读取第一张表
        $sheet = $excel->getSheet(0);
        //获取总行数
        $row_num = $sheet->getHighestRow();
        //获取总列数
        $col_num = $sheet->getHighestColumn();
        $data = []; //数组形式获取表格数据
        for ($i = 2; $i <= $row_num; $i ++) {
            $data[$i]['gzh_mc']  = $sheet->getCell("A".$i)->getValue();
            $data[$i]['gzh_wxh']  = $sheet->getCell("B".$i)->getValue();
            $data[$i]['username']  = $sheet->getCell("C".$i)->getValue();
            $data[$i]['pwd']  = $sheet->getCell("D".$i)->getValue();
            //将数据保存到数据库
        }


        foreach ($data as $vs) {
            $vs['uid']=$uid;
            if($vs){
                $check=Db::name('weixin')->where('gzh_wxh',$vs['gzh_wxh'])->whereOr('gzh_mc',$vs['gzh_mc'])->find();
                if(!$check){
                    $vs['isdr']=2;
                    $vs['status']=1;
                    Db::name('weixin')->insert($vs);
                }
            }
        }
        $this->redirect('member/copywrit/index');
    }

导出操作(简单两个函数解决战斗)

/**
     * 测试方法 2
     * (根据得到的的数组数据,导出Excel文件)
     */
    public function outputToExcelTest()
    {
        //测试数据(数组形式),一般来源于数据表查询
        $list = [
            ['name' => '顺丰速运', 'code' => 'SF', 'mark' => '很贵的哦'],
            ['name' => '百世快递', 'code' => 'HTKY', 'mark' => 'en嗯嗯'],
            ['name' => '中通快递', 'code' => 'ZTO', 'mark' => '还是挺快的!'],
            ['name' => '申通快递', 'code' => 'STO', 'mark' => 'God bless you!'],
            ['name' => '圆通速递', 'code' => 'YTO', 'mark' => '施主您好'],
            ['name' => '韵达速递', 'code' => 'YD', 'mark' => '大学的记忆'],
            ['name' => '邮政快递包裹', 'code' => 'YZPY', 'mark' => '听,起风了~'],
        ];
        $headerArr = ['快递名称', '编码', '备注'];
        //设置保存的Excel表格名称
        $excelTitle = 'moTzxx表格导出测试';
        $save_fileUrl = "moTzxx快递公司".date('Ymd-His', time()) . ".xls";
        $this->outputDataToExcelFile($list, $headerArr, $excelTitle, $save_fileUrl);
    }

    /**
     * 将得到的数组数据,转化为Excel文件导出
     * @param array $list 数组数据
     * @param array $headerArr 显示的顶部导航栏
     * @param string $excelTitle 表格标题
     * @param string $save_fileUrl 构建存储文件,注意扩展名
     */
    public function outputDataToExcelFile($list = [], $headerArr = [],$excelTitle = "", $save_fileUrl = "")
    {
        //实例化PHPExcel类
        $objPHPExcel = new \PHPExcel();
        //设置头信息 激活当前的sheet表
        $objPHPExcel->setActiveSheetIndex(0);
        $keyC = ord('A');
        foreach ($headerArr as $head) {
            $colKey = chr($keyC);
            //TODO 设置表格头(即excel表格的第一行)
            $objPHPExcel->getActiveSheet()->setCellValue($colKey . '1', $head);
            //设置单元格宽度
            $objPHPExcel->getActiveSheet()->getColumnDimension($colKey)->setWidth(20);
            $keyC++;
        }

        $colIndex = 2;
        foreach ($list as $key => $rows) {
            $colKey2 = ord('A');
            foreach ($list[$key] as $keyName => $value) {
                $objPHPExcel->getActiveSheet()->setCellValue(chr($colKey2) . $colIndex, $value);
                $colKey2++;
            }
            $colIndex++;
        }

        //设置当前激活的sheet表格名称;
        $objPHPExcel->getActiveSheet()->setTitle($excelTitle);
        //设置浏览器窗口下载表格
        header("Content-Type: application/force-download");
        header("Content-Type: application/octet-stream");
        header("Content-Type: application/download");
        header('Content-Disposition:inline;filename="' . $save_fileUrl . '"');
        //生成excel文件
        $objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
        //下载文件在浏览器窗口
        $objWriter->save('php://output');
        exit;
    }

参考原文链接: https://www.1949la.com/post/55.html

阅读全文

阿里云短信接入ThinkPHP5.0.* (依然是简单粗暴改写官方demo)

官方源码包先下载下来:传送门
取其中的api_sdk 放到 extend 目录里面即可。
2019-05-15T05:18:22.png

下面是自定义的短信类库 Sms,测试用了单短信发送接口 sendSms

<?php

namespace app\index\controller;


ini_set("display_errors", "on");

include APP_EXTEND . '/api_sdk/vendor/autoload.php';

use Aliyun\Core\Config;
use Aliyun\Core\Profile\DefaultProfile;
use Aliyun\Core\DefaultAcsClient;
use Aliyun\Api\Sms\Request\V20170525\SendSmsRequest;
use Aliyun\Api\Sms\Request\V20170525\SendBatchSmsRequest;
use Aliyun\Api\Sms\Request\V20170525\QuerySendDetailsRequest;

// 加载区域结点配置
Config::load();

/**
 * Class Sms
 *
 * 这是短信服务API产品的DEMO程序,直接执行此文件即可体验短信服务产品API功能
 * (只需要将AK替换成开通了云通信-短信服务产品功能的AK即可)
 * 备注:Demo工程编码采用UTF-8
 */
class Sms
{

    static $acsClient = null;

    /**
     * 取得AcsClient
     *
     * @return DefaultAcsClient
     */
    public static function getAcsClient() {
        //产品名称:云通信短信服务API产品,开发者无需替换
        $product = "Dysmsapi";

        //产品域名,开发者无需替换
        $domain = "dysmsapi.aliyuncs.com";

        // TODO 此处需要替换成开发者自己的AK (https://ak-console.aliyun.com/)
        $accessKeyId = "AccessKeyId"; // AccessKeyId

        $accessKeySecret = "AccessKeySecret"; // AccessKeySecret

        // 暂时不支持多Region
        $region = "cn-hangzhou";

        // 服务结点
        $endPointName = "cn-hangzhou";


        if(static::$acsClient == null) {

            //初始化acsClient,暂不支持region化
            $profile = DefaultProfile::getProfile($region, $accessKeyId, $accessKeySecret);

            // 增加服务结点
            DefaultProfile::addEndpoint($endPointName, $region, $product, $domain);

            // 初始化AcsClient用于发起请求
            static::$acsClient = new DefaultAcsClient($profile);
        }
        return static::$acsClient;
    }

    /**
     * 发送短信
     * @return stdClass
     */
    public static function sendSms() {

        // 初始化SendSmsRequest实例用于设置发送短信的参数
        $request = new SendSmsRequest();

        //可选-启用https协议
        //$request->setProtocol("https");
        // 必填,设置短信接收号码
        $request->setPhoneNumbers("18712377078");

        // 必填,设置签名名称,应严格按"签名名称"填写,请参考: https://dysms.console.aliyun.com/dysms.htm#/develop/sign
        $request->setSignName("签名");

        // 必填,设置模板CODE,应严格按"模板CODE"填写, 请参考: https://dysms.console.aliyun.com/dysms.htm#/develop/template
        $request->setTemplateCode("模板CODE");

        // 可选,设置模板参数, 假如模板中存在变量需要替换则为必填项
        $request->setTemplateParam(json_encode(array(  // 短信模板中字段的值
            "adid"=>"12345"
            // "product"=>"dsd"
        ), JSON_UNESCAPED_UNICODE));

        // 可选,设置流水号
        $request->setOutId("12126632533");

        // 选填,上行短信扩展码(扩展码字段控制在7位或以下,无特殊需求用户请忽略此字段)
        $request->setSmsUpExtendCode("1234567");

        // 发起访问请求
        $acsResponse = static::getAcsClient()->getAcsResponse($request);

        print_r($response);

        return $acsResponse;
    }

    /**
     * 批量发送短信
     * @return stdClass
     */
    public static function sendBatchSms() {

        // 初始化SendSmsRequest实例用于设置发送短信的参数
        $request = new SendBatchSmsRequest();

        //可选-启用https协议
        //$request->setProtocol("https");

        // 必填:待发送手机号。支持JSON格式的批量调用,批量上限为100个手机号码,批量调用相对于单条调用及时性稍有延迟,验证码类型的短信推荐使用单条调用的方式
        $request->setPhoneNumberJson(json_encode(array(
            "1500000000",
            "1500000001",
        ), JSON_UNESCAPED_UNICODE));

        // 必填:短信签名-支持不同的号码发送不同的短信签名
        $request->setSignNameJson(json_encode(array(
            "云通信",
            "云通信"
        ), JSON_UNESCAPED_UNICODE));

        // 必填:短信模板-可在短信控制台中找到
        $request->setTemplateCode("SMS_1000000");

        // 必填:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为
        // 友情提示:如果JSON中需要带换行符,请参照标准的JSON协议对换行符的要求,比如短信内容中包含\r\n的情况在JSON中需要表示成\\r\\n,否则会导致JSON在服务端解析失败
        $request->setTemplateParamJson(json_encode(array(
            array(
                "name" => "Tom",
                "code" => "123",
            ),
            array(
                "name" => "Jack",
                "code" => "456",
            ),
        ), JSON_UNESCAPED_UNICODE));

        // 可选-上行短信扩展码(扩展码字段控制在7位或以下,无特殊需求用户请忽略此字段)
        // $request->setSmsUpExtendCodeJson("[\"90997\",\"90998\"]");

        // 发起访问请求
        $acsResponse = static::getAcsClient()->getAcsResponse($request);

        return $acsResponse;
    }

    /**
     * 短信发送记录查询
     * @return stdClass
     */
    public static function querySendDetails() {

        // 初始化QuerySendDetailsRequest实例用于设置短信查询的参数
        $request = new QuerySendDetailsRequest();

        //可选-启用https协议
        //$request->setProtocol("https");

        // 必填,短信接收号码
        $request->setPhoneNumber("12345678901");

        // 必填,短信发送日期,格式Ymd,支持近30天记录查询
        $request->setSendDate("20170718");

        // 必填,分页大小
        $request->setPageSize(10);

        // 必填,当前页码
        $request->setCurrentPage(1);

        // 选填,短信发送流水号
        $request->setBizId("yourBizId");

        // 发起访问请求
        $acsResponse = static::getAcsClient()->getAcsResponse($request);

        return $acsResponse;
    }

}

?>
阅读全文
none