【php】批量修改数据

Continue Read..

这篇文章主要介绍了关于PHP的批量更新 ,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下

mysql更新语句很简单,更新一条数据的某个字段,一般这样写:

UPDATE mytable SET myfield = 'value' WHERE other_field = 'other_value';

如果更新同一字段为同一个值,mysql也很简单,修改下where即可:

UPDATE mytable SET myfield = 'value' WHERE other_field in ('other_values');

这里注意,other_values是一个逗号,分隔的字符串,如:1,2,3

1 常规方案
那如果更新多条数据为不同的值,可能很多人会这样写:

foreach ($display_order as $id => $ordinal) {

$sql = "UPDATE categories SET display_order = $ordinal WHERE id = $id";

mysql_query($sql);

}

即是循环一条一条的更新记录。

一条记录update一次,这样性能很差,也很容易造成阻塞。

2 高效方案
那么能不能一条sql语句实现批量更新呢?

2.1 CASE WHEN
mysql并没有提供直接的方法来实现批量更新,但是可以用点小技巧来实现。

UPDATE mytable SET

myfield = CASE id

WHEN 1 THEN 'value'

WHEN 2 THEN 'value'

WHEN 3 THEN 'value'

END

WHERE id IN (1,2,3)

这里使用了case when 这个小技巧来实现批量更新。

举个例子:

UPDATE categories SET

display_order = CASE id

WHEN 1 THEN 3

WHEN 2 THEN 4

WHEN 3 THEN 5

END

WHERE id IN (1,2,3)

这句sql的意思是,更新display_order 字段:

如果id=1 则display_order 的值为3,
如果id=2 则 display_order 的值为4,
如果id=3 则 display_order 的值为5。
即是将条件语句写在了一起。

这里的where部分不影响代码的执行,但是会提高sql执行的效率。

确保sql语句仅执行需要修改的行数,这里只有3条数据进行更新,而where子句确保只有3行数据执行。

3.2 更新多值
如果更新多个值的话,只需要稍加修改:

UPDATE categories SET

display_order = CASE id

WHEN 1 THEN 3

WHEN 2 THEN 4

WHEN 3 THEN 5

END,

title = CASE id

WHEN 1 THEN 'New Title 1'

WHEN 2 THEN 'New Title 2'

WHEN 3 THEN 'New Title 3'

END

WHERE id IN (1,2,3)

到这里,已经完成一条mysql语句更新多条记录了。

但是要在业务中运用,需要结合服务端语言。

3.3 封装成PHP函数
PHP中,我们把这个功能封装成函数,以后直接调用。

为提高可用性,我们考虑处理更全面的情况。

如下时需要更新的数据,我们要根据id和parent_id字段更新post表的内容。

其中,id的值会变,parent_id的值一样。

$data = [

['id' => 1, 'parent_id' => 100, 'title' => 'A', 'sort' => 1],

['id' => 2, 'parent_id' => 100, 'title' => 'A', 'sort' => 3],

['id' => 3, 'parent_id' => 100, 'title' => 'A', 'sort' => 5],

['id' => 4, 'parent_id' => 100, 'title' => 'B', 'sort' => 7],

['id' => 5, 'parent_id' => 101, 'title' => 'A', 'sort' => 9],

];

例如,我们想让parent_id为100、title为A的记录依据不同id批量更新:

echo batchUpdate($data, 'id', ['parent_id' => 100, 'title' => 'A']);

其中,batchUpdate()实现的PHP代码如下:

/**

* 批量更新函数

* @param $data array 待更新的数据,二维数组格式

* @param array $params array 值相同的条件,键值对应的一维数组

* @param string $field string 值不同的条件,默认为id

* @return bool|string

*/

function batchUpdate($data, $field, $params = [])

{

if (!is_array($data) || !$field || !is_array($params)) {

return false;

}



$updates = parseUpdate($data, $field);

$where = parseParams($params);



// 获取所有键名为$field列的值,值两边加上单引号,保存在$fields数组中

// array_column()函数需要PHP5.5.0+,如果小于这个版本,可以自己实现,

// 参考地址:http://php.net/manual/zh/function.array-column.php#118831

$fields = array_column($data, $field);

$fields = implode(',', array_map(function($value) {

return "'".$value."'";

}, $fields));



$sql = sprintf("UPDATE `%s` SET %s WHERE `%s` IN (%s) %s", 'post', $updates, $field, $fields, $where);



return $sql;

}



/**

* 将二维数组转换成CASE WHEN THEN的批量更新条件

* @param $data array 二维数组

* @param $field string 列名

* @return string sql语句

*/

function parseUpdate($data, $field)

{

$sql = '';

$keys = array_keys(current($data));

foreach ($keys as $column) {



$sql .= sprintf("`%s` = CASE `%s` \n", $column, $field);

foreach ($data as $line) {

$sql .= sprintf("WHEN '%s' THEN '%s' \n", $line[$field], $line[$column]);

}

$sql .= "END,";

}



return rtrim($sql, ',');

}



/**

* 解析where条件

* @param $params

* @return array|string

*/

function parseParams($params)

{

$where = [];

foreach ($params as $key => $value) {

$where[] = sprintf("`%s` = '%s'", $key, $value);

}



return $where ? ' AND ' . implode(' AND ', $where) : '';

}

得到这样一个批量更新的SQL语句:

UPDATE `post` SET `id` = CASE `id`

WHEN '1' THEN '1'

WHEN '2' THEN '2'

WHEN '3' THEN '3'

WHEN '4' THEN '4'

WHEN '5' THEN '5'

END,`parent_id` = CASE `id`

WHEN '1' THEN '100'

WHEN '2' THEN '100'

WHEN '3' THEN '100'

WHEN '4' THEN '100'

WHEN '5' THEN '101'

END,`title` = CASE `id`

WHEN '1' THEN 'A'

WHEN '2' THEN 'A'

WHEN '3' THEN 'A'

WHEN '4' THEN 'B'

WHEN '5' THEN 'A'

END,`sort` = CASE `id`

WHEN '1' THEN '1'

WHEN '2' THEN '3'

WHEN '3' THEN '5'

WHEN '4' THEN '7'

WHEN '5' THEN '9'

END WHERE `id` IN ('1','2','3','4','5') AND `parent_id` = '100' AND `title` = 'A'

生成的SQL把所有的情况都列了出来。

不过因为有WHERE限定了条件,所以只有id为1、2、3这几条记录被更新。

如果只需要更新某一列,其他条件不限,那么传入的$data可以更简单:

$data = [

['id' => 1, 'sort' => 1],

['id' => 2, 'sort' => 3],

['id' => 3, 'sort' => 5],

];

echo batchUpdate($data, 'id');

这样的数据格式传入,就可以修改id从1~3的记录,将sort分别改为1、3、5。

得到SQL语句:

UPDATE `post` SET `id` = CASE `id`

WHEN '1' THEN '1'

WHEN '2' THEN '2'

WHEN '3' THEN '3'

END,`sort` = CASE `id`

WHEN '1' THEN '1'

WHEN '2' THEN '3'

WHEN '3' THEN '5'

END WHERE `id` IN ('1','2','3')

这种情况更加简单高效。


参考 网址:https://www.php.cn/php-weizijiaocheng-406104.html

 

【vue】 父子组件传值

Continue Read..
父组件
// ref : 为了引用只组件 updateData: 为了接收子组件的值
<companyAdd :source="source" ref="companyAdd" @updateData="updateData" :isShowEditVisible="isShowEditVisible"></companyAdd>

import companyAdd from "@/views/components/Company/index";
  components: {companyAdd },
    handleUpdate(row) {
//companyAdd =>  ref="companyAdd"
//handleUpdate => 子组件的方法
      this.$refs.companyAdd.handleUpdate(row);
    },
    updateData(data) {
      if (data.resultCode == 200) {
        this.isShowEditVisible = false
        const index = this.tableList.findIndex(n=> n.id == data.data.id)
        if (index == -1) {
          this.tableList.unshift(data.data)
        } else {
          //this.tableList[index] = data.data
          this.$set(this.tableList,[index],data.data)
        }
      }
    },

子组件
<template>
  <el-dialog append-to-body :close-on-click-modal="false" :destroy-on-close="true" :visible.sync="isShowEditVisible" title="新增客户" width="650px">
    <el-form ref="dataForm" :model="formdata.row" :rules="rules" label-width="65px">
      <el-col :span="24">
        <el-form-item label="名称" prop="title">
          <el-input v-model="formdata.row.title" />
        </el-form-item>
      </el-col>
      <el-col :span="11">
        <el-form-item v-model="formdata.row.invoice_type" label="发票类型" label-width="90px">
          <el-select v-model="formdata.row.invoice_type" placeholder="发票类型">
            <el-option v-for="(item, index) in formdata.option.invoice_type_list" :label="item" :value="index" :key="index" />
          </el-select>
        </el-form-item>
      </el-col>


    </el-form>
    <div slot="footer" class="dialog-footer">
      <el-button size="small" @click="_isShowEditVisible">取消</el-button>
      <el-button :loading="listLoading" size="small" type="primary" class="title1" @click="updateData">确定</el-button>
    </div>

  </el-dialog>
</template>

<script>
import { getList, ToDoAction } from "@/api/common";
export default {
  props: {
    isShowEditVisible: {
      type: Boolean,
      default: false
    },
    source: {
      type: String,
      default: 'list'
    }
  },
  data() {
    return {
      formdata: {
        row: {
          id: "",
          title: "",
          invoice_type: "",
        },
        option: {
          invoice_type_list: []
        },
      },

    }
  },
  methods: {
//这个方法为了子组件关闭弹窗
    _isShowEditVisible() {
      this.isShowEditVisible = false
      //this.$emit('update:isShowEditVisible', false)
    },

//这个方法是通过id , 请求接口获取数据
    handleUpdate(row) {
      console.log(1111, row)
      ToDoAction({ id: row.id, actiontype: 'company_add', action: 'add' }, {}).then(response => {
        if (response.resultCode == 200) {
          this.isShowEditVisible = true
          response.data.row.invoice_type = response.data.row.invoice_type.toString()
          this.formdata = Object.assign({}, response.data)
        } else {
          this.$message({
            message: response.data,
            type: 'error'
          })
        }
      })
    },

//这个方法是弹窗里面的确定按钮(提交数据)
    updateData() {
      const tempData = Object.assign({}, this.formdata);
      this.$refs["dataForm"].validate((valid) => {
        if (valid) {
          ToDoAction(
            { id: tempData.id, actiontype: "company_add", action: "save" },
            tempData.row
          ).then((response) => {
            if (response.resultCode == 200) {
              this.isShowEditVisible = false
              this.$emit('update:isShowEditVisible', false) //修改isShowEditVisible的值 传给父组件
              //this.$parent.fetchData();
              this.$emit('updateData', response) //父组件有个updateData方法,将response传递到父组件的方法里面

            } else {
              this.$message({
                message: response.data,
                type: "error",
              });
            }
          });
        }
      });
    },
  }
}
</script>



声明:此文系舞林cuznwww.wulinlw.org)原创稿件,转载请保留版权

【php】excel数据导入 日期格式化

Continue Read..
 /**
   * 判断字符串是否是日期格式
   * @param $date 
   * @param $format
   * @return bool
   */
  function is_date($date, $format = 'Y-m-d')
  {
    if (!$date || $date == '0000-00-00') return false;
    $unix_time_1 = strtotime($date);
    if (!is_numeric($unix_time_1)) return false; //非数字格式
    $format_date = date($format, $unix_time_1);
    $unix_time_2 = strtotime($format_date);
    return ($unix_time_1 == $unix_time_2);
  }

  /**
   * excel数据导入  日期格式化
   * @param $date
   * @return false|string
   */
  function get_date_by_excel($date)
  {
    if (!$date || $date == '0000-00-00') return null;

    $unix_time = \PHPExcel_Shared_Date::ExcelToPHP($date);

    return ($unix_time < 0) ? date('Y-m-d H:i:s', $unix_time) : date('Y-m-d H:i:s', strtotime(gmdate('Y-m-d H:i:s', $unix_time)));
  }

  /**
   * 获取excel日期格式化结果
   * @param $date string excel日期单元格字符串
   * @param $default string  $date未非日期时返回默认日期
   * @return string
   */
  function excel_date_format($date, $default = '')
  {
    if ($default == '') $default = date('Y-m-d H:i:s');

    if ($this->is_date($date)) return $date;

    return $this->get_date_by_excel($date) ?: $default;
  }






^ "44441.976770833"
^ "2021-09-02 23:26:33"
^ "2021-09-03 15:12:34"

声明:此文系舞林cuznwww.wulinlw.org)原创稿件,转载请保留版权

【VUE】 导出excel,Export2Excel样式修改,复杂表头,多级表头

Continue Read..
<el-form-item>
<el-button size="small" type="success" @click="outExe()"><i class="el-icon-search"/>导出</el-button>
</el-form-item>

outExe() {
  this.$confirm('此操作将导出excel文件, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
  }).then(() => {
this.listLoading = true
getList({ actiontype: 'order_count_exp',ctype:this.search.ctype,counttime:this.search.counttime}, this.listQuery).then(response => {
  if (response.resultCode == 200) {
import('@/vendor/Export2ExcelStyle').then(excel => {
  const multiHeader = response.data.multiHeader
  const tHeader = response.data.headArr
  const filterVal = response.data.filterVal
  const list = response.data.list
  if (list.length == 0) {
this.$message.error('没有数据,不能导出');
return;
  }
  const merges = ['A1:A2', 'B1:B2', 'C1:C2', 'D1:D2', 'E1:E2', 'F1:F2', 'G1:G2', 'H1:K1', 'L1:P1']
  // const title = 'titile'
  // console.log(filterVal, list);
  const data = this.formatJson(filterVal, list)
  excel.export_json_to_excel({
// title,
multiHeader,
header: tHeader, 
data: data,
filename: response.data.fileName,
merges, 
autoWidth: false,
bookType: 'xlsx',
  })
})
  }else{
this.$message({
  message: response.data,
  type: 'error'
})
  }
  this.listLoading = false
}).catch(error => {
  console.log(error)
})
  }).catch(() => {

  });
},
formatJson(filterVal, jsonData) {
  return jsonData.map(v => filterVal.map(j => {
if (j === 'timestamp') {
  return parseTime(v[j])
} else {
  return v[j]
}
  }))
},



$data['fileName'] = 'love_order_count_exp_' . date("Y-m-d");
$data['filterVal'] = ['id', 'ctype_name', 'counttime', 'orderfee', 'payfee', 'refundfee', 'truefee', 'otype_1', 'otype_2', 'otype_3', 'otype_4', 'ptype_1', 'ptype_2', 'ptype_3', 'ptype_4', 'ptype_5'];
$data['multiHeader'] = [['序号', '类型', '日期', '订单总额', '实收', '退款', '净收入', '类型', '',  '',  '', '来源']];
$data['headArr'] = ['', '', '', '', '', '', '', '活动', '会员', '认证', '一周CP', '微信', '小程序', '后台', '触屏', 'APP'];

这里要注意multiHeader数组中,类型后面空了3个,是因为类型这栏合并了4列,下面子类有4列,如果不空的话,会吧来源覆盖
headArr前面空了7列,是因为前7个不需要多级表头


点击查看原图

 

参考网址 

https://blog.csdn.net/weixin_43965143/article/details/106572755

https://www.jianshu.com/p/06521a9c75d8

 

js附件

Export2ExcelStyle.zip



声明:此文系舞林cuznwww.wulinlw.org)原创稿件,转载请保留版权

【nginx】得到IP地址

Continue Read..

nginx 

  proxy_set_header X-Real-IP $remote_addr;

  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

  proxy_set_header Host $host;

  real_ip_header    X-Forwarded-For;

  real_ip_recursive on;

 

php 

<?php

echo long2ip(_get_ip());

function _get_ip($full = false) {

        if (isset($_SERVER["HTTP_X_FORWARDED_FOR"])) {

            if ($full == true)

                return sprintf("%u\n", ip2long($_SERVER["HTTP_X_FORWARDED_FOR"]));

            $tmp_ips = explode(',', $_SERVER["HTTP_X_FORWARDED_FOR"]);

            $ip = array_shift($tmp_ips);

        }

        else if (isset($_SERVER["HTTP_CLIENT_IP"]))

            $ip = $_SERVER["HTTP_CLIENT_IP"];

        else if (isset($_SERVER["REMOTE_ADDR"]))

            $ip = $_SERVER["REMOTE_ADDR"];

        else if (getenv("HTTP_X_FORWARDED_FOR"))

            $ip = getenv("HTTP_X_FORWARDED_FOR");

        else if (getenv("HTTP_CLIENT_IP"))

            $ip = getenv("HTTP_CLIENT_IP");

        else if (getenv("REMOTE_ADDR"))

            $ip = getenv("REMOTE_ADDR");

        else

            $ip = "Unknown";

        return sprintf("%u\n", ip2long($ip));

    }


声明:此文系舞林cuznwww.wulinlw.org)原创稿件,转载请保留版权

【thinkphp5】ThinkPHP5如何使用build.php

Continue Read..

进入application

php ../think build --config ..\build.php

 

 

build.php里面写需要生成的配置

 

 

return [
    // 生成应用公共文件
    '__file__' => ['common.php''config.php''database.php'],

    // 定义demo模块的自动生成 (按照实际定义的文件名生成)
    'xxx'     => [
        '__file__'   => ['common.php'],
        '__dir__'    => ['behavior''controller''model''view'],
        'controller' => ['Index''Test''UserType'],
        'model'      => ['User''UserType'],
        'view'       => ['index/index'],
    ],
    // 其他更多的模块定义
];

声明:此文系舞林cuznwww.wulinlw.org)原创稿件,转载请保留版权

【php】RabbitMQ+supervisord+php消息队列

Continue Read..
CentOS7安装RabbitMQ

由于rabbitmq是基于erlang语言开发的,所以必须先安装erlang。
安装依赖
yum -y install gcc glibc-devel make ncurses-devel openssl-devel xmlto perl wget gtk2-devel binutils-devel

erlang官网:

https://www.erlang.org/downloads

下载(会比较慢,请耐心等待)

wget http://erlang.org/download/otp_src_22.0.tar.gz

移走

mv otp_src_22.0 /usr/local/

切换目录

cd /usr/local/otp_src_22.0/
 

创建即将安装的目录

mkdir ../erlang
 

配置安装路径

./configure --prefix=/usr/local/erlang

如果遇到这个错 你就假装没看到

点击查看原图
安装

make install

 

查看一下是否安装成功

ll /usr/local/erlang/bin
 

添加环境变量

echo 'export PATH=$PATH:/usr/local/erlang/bin' >> /etc/profile
 

刷新环境变量

source /etc/profile
 

甩一条命令

erl
 
点击查看原图
瞬间进入了一个未知的世界

在里面输入halt().命令退出来(那个点号别忘记)

点击查看原图



安装RabbitMQ
rabbitmq下载地址:

https://github.com/rabbitmq/rabbitmq-server/releases/tag/v3.7.15

 

下载

wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.7.15/rabbitmq-server-generic-unix-3.7.15.tar.xz
 

由于是tar.xz格式的所以需要用到xz,没有的话就先安装 

yum install -y xz
 

第一次解压

/bin/xz -d rabbitmq-server-generic-unix-3.7.15.tar.xz
 

第二次解压

tar -xvf rabbitmq-server-generic-unix-3.7.15.tar
 

移走

mv rabbitmq_server-3.7.15/ /usr/local/
 

改名

mv /usr/local/rabbitmq_server-3.7.15  rabbitmq
 

配置环境变量

echo 'export PATH=$PATH:/usr/local/rabbitmq/sbin' >> /etc/profile
 

刷新环境变量

source /etc/profile
 

创建配置目录

mkdir /etc/rabbitmq
 

回到顶部
启动命令
启动:

rabbitmq-server -detached
 

停止:

rabbitmqctl stop
 

状态:

rabbitmqctl status
 

防火墙之类的请自行处理(5672和15672端口),反正我是从来不开防火墙。

 

回到顶部
WEB管理
开启web插件

rabbitmq-plugins enable rabbitmq_management
 

访问:http://127.0.0.1:15672/
点击查看原图 

默认账号密码:guest guest(这个账号只允许本机访问)

 

回到顶部
用户管理
查看所有用户

rabbitmqctl list_users
 

添加一个用户

rabbitmqctl add_user admin 123456
 

配置权限

rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*"
 

查看用户权限

rabbitmqctl list_user_permissions admin
 

设置tag

rabbitmqctl set_user_tags admin administrator
 

删除用户(安全起见,删除默认用户)

rabbitmqctl delete_user guest
 

回到顶部
登陆
配置好用户之后重启一下rabbit

然后就可以用新账号进行登陆

点击查看原图

 

 

安装supervisord

yum install epel-release

yum install -y supervisor

 

#yum -y install python-setuptools zlib

easy_install supervisor

echo_supervisord_conf > /etc/supervisord.conf

 

mkdir -p /data/etc/supervisord/

mkdir -p /data2/logs/supervisord/

chmod 777 /data2/logs/supervisord/

 

修改 /etc/supervisord.conf

sed -i -e "s#logfile=/tmp/supervisord.log#logfile=/data2/logs/supervisord/supervisord.log#g" /etc/supervisord.conf

sed -i -e "s#file=/tmp/supervisor.sock#file=/var/run/supervisor.sock#g" /etc/supervisord.conf

sed -i -e "s#pidfile=/tmp/supervisord.pid#pidfile=/var/run/supervisord.pid#g" /etc/supervisord.conf

sed -i -e "s#serverurl=unix:///tmp/supervisor.sock#serverurl=unix:///var/run/supervisor.sock#g" /etc/supervisord.conf

echo "[include]" >> /etc/supervisord.conf

echo "files = /data/www/supervisord/*.ini" >> /etc/supervisord.conf

 

 

 

操作脚本:

vi /usr/lib/systemd/system/supervisord.service

 

#输入下面内容,并保存

[Unit]

Description=Supervisord

After=network.target

 

[Service]

Type=forking

PIDFile=/var/run/supervisord.pid

ExecStart=/usr/bin/supervisord -c /etc/supervisord.conf

ExecStop=/bin/kill -TERM $MAINPID

ExecReload=/bin/kill -HUP $MAINPID

Restart=always

 

[Install]

WantedBy=multi-user.target

保存

 

#修改权限

chmod +x /usr/lib/systemd/system/supervisord.service

 

systemctl enable supervisord.service

启用:systemctl start supervisord

 

#其它控制命令

systemctl stop supervisord

systemctl reload supervisord

 

查看进程列表:

systemctl status supervisord

#supervisorctl status

停止进程 mq_test_worker:

supervisorctl stop mq_test_worker:

开始进程 mq_test_worker::

supervisorctl start mq_test_worker:

 

 

启动程序如果提示:Starting supervisor: Error: Another program is already listening on a port that one of our HTTP servers is configured to use.  Shut this program down first before starting supervisord.

unlink /var/run/supervisor.sock

 

 

 

sudo chmod 777 /run

sudo chmod 777 /var/log

sudo touch /var/run/supervisor.sock

sudo chmod 777 /var/run/supervisor.sock

supervisord -c /etc/supervisord.conf

ps aux | grep supervisord

 

 

 

最后效果

supervisord -c /etc/supervisord.conf 开启supervisord服务

supervisorctl start mq_test_worker 开启需要常驻的脚本服务

执行脚本test.php

然后tail -f mq_test_worker.log 里面可以看到队列的数据

 

点击查看原图

 

 

代码附件 : msg_broker.zip

 

 参考网站

RabbitMQ:https://www.cnblogs.com/fengyumeng/p/11133924.html

supervisord(碰到的坑):

https://www.missshi.cn/api/view/blog/5aafcf405b925d681e000000

https://www.cnblogs.com/ruanraun/p/supervisor.html

https://blog.csdn.net/weixin_41762173/article/details/88901970

 

声明:此文系舞林cuznwww.wulinlw.org)原创稿件,转载请保留版权

【小程序】小程序页面定位(类似html锚点)

Continue Read..
goTo:function (id) {
        const q =wx.createSelectorQuery();
        q.select("#"+id).boundingClientRect();
        q.selectViewport().scrollOffset();
        q.exec((res)=>{
            if(res[0] && res[1]){
                console.log("跳转",res[0].top+res[1].scrollTop);
                wx.pageScrollTo({
                    scrollTop:res[0].top+res[1].scrollTop -100,
                    duration:300
                })
            }
        })
    },
    setToView:function (room_id, bed_id) {
        var toView = 'room_bed_'+ room_id + '_' + bed_id;
        console.log("toView===", toView);

        this.setData({
            toView: toView
        });
        var self = this;
        setTimeout(function () {
            console.log("self.data.toView===", self.data.toView);
            self.goTo(self.data.toView);
        }, 1000);

    }


声明:此文系舞林cuznwww.wulinlw.org)原创稿件,转载请保留版权

【php】win修改php-cgi.exe启动接口

Continue Read..
1、先要运行起php的cgi,由于本人用的win7系统,所以cmd先进的c盘(之前全扔c盘这就简单了~),访问到php路径中,输入
php-cgi.exe -b 127.0.0.1:9000
注意这里的-b 127.0.0.1:9000是指定cgi的监听端口,与上文中的Nginx配置要一致,如果有其他配置不记得之前php-cgi是那个端口,可以使用php-cgi.exe -h命令来查看配置(查看-b 后面的<address:port>)。想要查看所有被监听的端口则输入netstat -na

声明:此文系舞林cuznwww.wulinlw.org)原创稿件,转载请保留版权

【go】操作数据库

Continue Read..

目录结构

点击查看原图

 

@GOPATH

点击查看原图

 

 

CREATE TABLE `userinfo` (

  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,

  `name` varchar(20) NOT NULL DEFAULT '',

  `uid` int(10) unsigned NOT NULL DEFAULT '0',

  PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8


 

1.go

package main
 
import (
	"conf"
	"fmt"
	// 或者
	// myDbConf "conf"
)
 
func main() {
	opend, db := conf.OpenDB()
	//opend, db := myDbConf.OpenDB()
 
	fmt.Println(db)
	if opend {
		fmt.Println("open success")
	} else {
		fmt.Println("open faile:")
	}
	// DeleteFromDB(db, 10)
	//QueryFromDB(db)
	//DeleteFromDB(db, 1)
	//UpdateDB(db, 5)
	conf.InsertToDB(db)
	//myDbConf.InsertToDB(db)
 
	//UpdateUID(db, 5)T
	//UpdateTime(db, 4)
 
}

 
 
 
dbConf.go
package dbConf
 
import (
	"crypto/md5"
	"database/sql"
	"encoding/hex"
	"fmt"
	"strconv"
	"time"
 
	_ "github.com/go-sql-driver/mysql"
)
 
const (
	DB_Driver = "root:root@tcp(127.0.0.1:3306)/test?charset=utf8"
)
 
func OpenDB() (success bool, db *sql.DB) {
	var isOpen bool
	db, err := sql.Open("mysql", DB_Driver)
	// fmt.Println(db)
	if err != nil {
		isOpen = false
	} else {
		isOpen = true
	}
	CheckErr(err)
	return isOpen, db
}
 
func InsertToDB(db *sql.DB) {
	uid := GetNowtimeMD5()
	// nowTimeStr := GetTime()
	stmt, err := db.Prepare("insert userinfo set name=?,uid=?")
	CheckErr(err)
	res, err := stmt.Exec("wangbiao", uid)
	CheckErr(err)
	id, err := res.LastInsertId()
	CheckErr(err)
	if err != nil {
		fmt.Println("插入数据失败")
	} else {
		fmt.Println("插入数据成功:", id)
	}
}
 
func QueryFromDB(db *sql.DB) {
	rows, err := db.Query("SELECT * FROM userinfo")
	CheckErr(err)
	if err != nil {
		fmt.Println("error:", err)
	} else {
	}
	for rows.Next() {
		var uid string
		var name string
 
		CheckErr(err)
		err = rows.Scan(&uid, &name)
		fmt.Println(name)
		fmt.Println(uid)
	}
}
 
func UpdateDB(db *sql.DB, uid string) {
	stmt, err := db.Prepare("update userinfo set name=? where uid=?")
	CheckErr(err)
	res, err := stmt.Exec("zhangqi", uid)
	affect, err := res.RowsAffected()
	fmt.Println("更新数据:", affect)
	CheckErr(err)
}
func DeleteFromDB(db *sql.DB, id int) {
	stmt, err := db.Prepare("delete from userinfo where id=?")
	CheckErr(err)
	res, err := stmt.Exec(id)
	affect, err := res.RowsAffected()
	fmt.Println("删除数据:", affect)
}
 
func CheckErr(err error) {
	if err != nil {
		panic(err)
		fmt.Println("err:", err)
	}
}
 
func GetTime() string {
	const shortForm = "2006-01-02 15:04:05"
	t := time.Now()
	temp := time.Date(t.Year(), t.Month(), t.Day(), t.Hour(), t.Minute(), t.Second(), t.Nanosecond(), time.Local)
	str := temp.Format(shortForm)
	fmt.Println(t)
	return str
}
 
func GetMD5Hash(text string) string {
	haser := md5.New()
	haser.Write([]byte(text))
	return hex.EncodeToString(haser.Sum(nil))
}
 
func GetNowtimeMD5() string {
	t := time.Now()
	timestamp := strconv.FormatInt(t.UTC().UnixNano(), 10)
	return GetMD5Hash(timestamp)
}
 mysql.zip

 

声明:此文系舞林cuznwww.wulinlw.org)原创稿件,转载请保留版权