SQLSTATE[HY000] [1045] Access denied for user ''@'localhost' (using password: NO)

一般出现这个错误:

SQLSTATE[HY000] [1045] Access denied for user ''@'localhost' (using password: NO)

是密码空,但是在Phalcon中如果项目数据库有主从库,在事务中没有指定库:

use Phalcon\Mvc\Model\Transaction\Manager as TxManager;

$manager = new TxManager();
$transaction = $manager->get();

也会遇到上面的错误.这是因为Phalcon默认会从configdatabase配置字段去读取数据库配置.
所以只需要加一行代码:

$manager->setDbService('master');

如果你也遇到了这个问题,把上面的master换成你的库连接名称就好了.

System has not been booted with systemd as init system

windows 11中的Ubuntu里使用systemctl时遇到了这样的错误:

System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down

Ubuntu里,systemctl常常用于启用一个服务,但在WSL中常使用的应是:

sudo service <servicename> start

这个问题的主要原因是WSL不使用Systemd,如何它使用呢?在/etc/下加个配置文件wsl.conf,如果已经存在,编辑这个文件。

阅读全文

elasticsearch nested搜索

  • 在mapping中定义nested字段

定义一个学生信息的字段:

'properties' => [
    'student' => [
        'type' => 'nested',
        'properties' => [
            'id' => [
                'type' => 'integer'
            ],
            'name' => [
                'type' => 'text',
                // 下面两个可选
                'analyzer' => 'ik_smart',
                'search_analyzer' => 'ik_max_word'
            ],
            'gender' => [
                'type' => 'keyword'
            ]
        ]
    ]
]

nested也是可以嵌套的,比如再加上成绩:

'properties' => [
    'student' => [
        'type' => 'nested',
        'properties' => [
            'id' => [
                'type' => 'integer'
            ],
            'name' => [
                'type' => 'text',
                // 下面两个可选
                'analyzer' => 'ik_smart',
                'search_analyzer' => 'ik_max_word'
            ],
            'gender' => [
                'type' => 'keyword'
            ],
            'grade' => [
                'type' => 'nested',
                'properties' => [
                    'english' => [
                        'type' => 'float'
                    ],
                    'math' => [
                        'type' => 'float'
                    ]
                ]
            ]
        ]
    ]
]

阅读全文

php检查请求是否为https

检查请求是否为https,一般可以通过$_SEVER变量中HTTPS和端口是否是443判断:

function isHttps(){
    return (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off')
        || $_SERVER['SERVER_PORT'] == 443;
}

前面工作中遇到微信分享失败(没有缩略图的样式),检查原因是签名失败。通过日志发现签名计算的url地址是http开头的,并非https,但我访问的地址是https。将$_SERVER加入日志中查看,

发现$_SERVER中没有HTTPS变量,SERVER_PORT也是80端口,但看到了另外两个值为https的变量:HTTP_X_FORWARDED_PROTOHTTP_X_CLIENT_PROTO。在搜索引擎中检索HTTP_X_FORWARDED_PROTO, 可以在MDN中看到X_FORWARDED_PROTO的解释:

阅读全文

elasticsearch同时搜索多个字段

在使用es做全文检索时,可以使用match来查询某个字段,如要查询标题中含有elasticsearch相关的内容:

$client->search(
    [
        'index' => 'test',
        'body' => [
            'query' => [
                'bool' => [
                    'must' => [
                        [
                            'match' => [
                                'title' => [
                                    'query' => 'elasticsearch'
                                ]
                            ]
                        ]
                    ]
                ]
            ]
        ]
    ]
);

现在需要检索标题、副标题、内容都含有elasticsearch相关的内容就可以使用multi_match:

$client->search(
    [
        'index' => 'test',
        'body' => [
            'query' => [
                'bool' => [
                    'must' => [
                        [
                            'multi_match' => [
                                'query' => 'elasticsearch',
                                'fields' => [
                                    'title',
                                    'subtitle',
                                    'content'
                                ]
                            ]
                        ]
                    ]
                ]
            ]
        ]
    ]
);

css中5种居中方式

如上图,没有给任何位置设置.

// css
<style>
    .big {
        width: 400px;
        height: 300px;
        background-color: #1edcff;
    }

    .small {
        width: 70px;
        height: 70px;
        background-color: #3ca217;
    }
</style>

// html
<div class="big">
    <div class="small"></div>
</div>

要是小的div在大div里居中,有5种方式.

  1. flex
.big {
    width: 400px;
    height: 300px;
    background-color: #1edcff;

    display: flex;
    align-items: center;
    justify-content: center;
}
  1. grid
.big {
    width: 400px;
    height: 300px;
    background-color: #1edcff;

    display: grid;
    place-content: center;
}

阅读全文

CSS minmax()

  • 认识minmax

看看MDN上对minmax的定义:

The minmax() CSS function defines a size range greater than or equal to min and less than or equal to max. It is used with CSS Grids

可以得出3点:

  1. minmaxCSS中的一个函数
  2. 定义了一个范围:大于等于最小值并且小于等于最大值
  3. 在CSS的grid中使用

现在来使用它:

<style>
    .box {
        display: grid;
        grid-template-columns: minmax(200px, 500px) 1fr 1fr;
        grid-gap: 10px;
    }

    .box div {
        height: 78px;
        background-color: #c2c;
    }
</style>
<div class="box">
    <div>A</div>
    <div>B</div>
    <div>C</div>
    <div>D</div>
    <div>E</div>
    <div>F</div>
    <div>G</div>
    <div>H</div>
    <div>I</div>
</div>

在页面中可以看到:

阅读全文

SimpleAjaxUploader上传后赋值失败问题

项目中有这样一段关于上传图片的代码:

<label class="label required">频道icon:</label>
            <div class="form-item mb-0">
                <input class="form-control" readonly name="img" value="{{data['img']}}"/>
                <button type="button" class="btn btn-primary" id="uploadImage">上传</button>
            </div>
            <div class="form-text help-block">图片的最佳尺寸:100*100,其他尺寸会影响页面效果,格式png,jpg,gif。大小不超过2M</div>
            <div class="form-item mb-4">
                <div class="col-4">
                    <img src="{{data['img']|default(default_image)}}" id="imgPreview" class="img-responsive"/>
                </div>
            </div>

上传插件使用的是Simple Ajax Uploader,在上传完成后对input和img赋值:

onComplete: function(filename, res, uploadBtn) {
                if(res.error_code != 0){
                    // error msg
                }else{
                    $('input[name=img]').val(res.thumb[0].url);
                    $('#imgPreview').prop('src', res.thumb[0].url);
                }
            },

这时候,问题出现了,input框赋值成功,但是img的src值没有改变,控制台也没有任何错误信息.将两行赋值代码交换顺序:

$('#imgPreview').prop('src', res.thumb[0].url);
$('input[name=img]').val(res.thumb[0].url);

img的src正常复制,input正常复制.这就非常奇怪了.

阅读全文

leetcode:Valid Parentheses

  • 问题

Given a string s containing just the characters ‘(‘, ‘)’, ‘{‘, ‘}’, ‘[‘ and ‘]’, determine if the input string is valid.

An input string is valid if:

  1. Open brackets must be closed by the same type of brackets.
  2. Open brackets must be closed in the correct order.
  • 解决
class Solution {

    /**
     * @param String $s
     * @return Boolean
     */
    function isValid($s) {
        if(strlen($s) % 2) {
            return false;
        }

        while(true){
            $c = $s[0];
            $s = substr($s, 1);
            $i = $this->match($c, $s);
            if($i === false){
                return false;
            }

            $s = substr($s, 0, $i) . substr($s, $i + 1);
            if(empty($s)){
                break;
            }
        }

        return true;
    }

    function match($c, $s)
    {
        $map = [
            '(' => ')',
            '{' => '}',
            '[' => ']'
        ];

        if($s[0] === $map[$c]) {
            return 0;
        }

        $offset = 0;
        for($i = 0, $len = strlen($s); $i < $len; $i++) {
            if(in_array($s[$i], ['(', '{', '['], true)) {
                $offset += 2;
            }

            if($s[$i] === $map[$c] && $offset === $i) {
                return $offset;
            }
        }

        return false;
    }
}

主要找到对应位置,然后比较对应位置是否正确并不断将正确的从字符串中移除.运行效率很低,500ms~900ms之间.
看社区排名前面的解决方法(python,java,c++)都是通过栈来解决–先进后出.修改如下:

阅读全文