Distinct 与 Group by 的比较

看了很多文章,这两个SQL语句在不同的数据库上面的实现上可能有相同或有不同,但是应当要明确它们在功能概念上的区别,最终得出结论:

GROUP BY 用来使用聚集函数获得值,比如 AVG, MAX, MIN, SUM 和 COUNT,而 DISTINCT 用于去除重复值。

要根据实际的应用场景来使用(即使它们有时候返回的结果是一样的)

2019/04/01 posted in  编程

CI框架入门笔记

当前(2019-03-22)CodeIgniter 框架的最新版本是 3.1.5,于2017年6月发布,距今快两年了也没有更新,这与 Laravel 的更新速度相比差距太大了。因为确实,它是一个很古老的框架了(第一个版本在2006年发布),当初的设计原则,开发环境与现在都已经大为不同。它有自己的设计原则,有相配套的一大堆工具、库,使用这些现有的工具就已经能很好地满足日常开发所需。

虽然已经是2019年了,但是公司用的框架是CI框架,所以我也应当快速适应CI框架的开发模式。本文就针对CI框架开发中的一些重点问题进行梳理和记录。CI框架的官网文档 很完善,但是我觉得仍然有必要整理出自己的一套实用规则。

Read more   2019/03/22 posted in  编程

Laravel 查询包括软删除的记录

查询结果包括已被软删除的记录:

Model::withTrashed()->get();

只查询软删除记录:

Model::onlyTrashed()->get();

这两个方法找了好久,特地记了下来。

2019/01/21 posted in  编程

Laravel 中的异常处理

这篇文章里,我们将研究 Laravel 框架中最重要也最少被讨论的功能 —— 异常处理。

Laravel 自带了一个异常处理类,它能够让你以简单、优雅的方式 report 和 render 异常。

文章的前半部分,我们将研究异常处理类(exception handler)提供的默认配置,然后研究异常处理类,并借此理解 Laravel 框架处理异常的过程。

文章的后半部分,我们将创建一个自定义的异常处理类,用于捕获自定义的异常。

Read more   2019/01/09 posted in  编程

PHP数组及其最佳实践

在这篇教程里,我将使用实际的例子来介绍一些常用的PHP数组及其最佳实践。每个PHP开发者都必须知道如何使用他们,并且组合使用这些数组函数写出可读性好、简洁的代码。

基本

让我们从最基本的处理数组键值的函数开始吧。首先是 array_combine(),它使用一个数组做键,一个数组做值,创建一个新的数组:

$keys = ['sky', 'grass', 'orange'];
$values = ['blue', 'green', 'orange'];
 
$array = array_combine($keys, $values);
print_r($array);
 
// Array
// (
//     [sky] => blue
//     [grass] => green
//     [orange] => orange
// )
Read more   2018/12/31 posted in  编程

PHP Generators

Overview

生成器提供了一种简易的方式来实现简单的迭代器,生成器就是简单的迭代器,相比较定义类实现Iterator接口的方式,其性能开销和复杂性大大降低。

一个生成器可以让你直接用foreach()迭代其中的一组数据。可以写一个生成器函数,和普通函数只返回一次不同的是,生成器可以根据需要产生(yield)多次返回。

EXAMPLE#1:使用生成器重新实现range()函数

Read more   2018/12/19 posted in  编程

Laravel Ioc 服务容器原理解析

Laravel 中的服务容器,其实就是一个全局的单例对象。通过入口文件可以清楚地知道,访问一个 Laravel 应用后台其实就是做了这几件事:1. 实例化一个服务容器(app)2. 服务容器处理请求,返回响应,所以说,服务容器就是一个全局环境。服务容器主要有两个作用,一个是提供程序所需要的各种资源、配置信息和服务,另一个是实现了控制反转(Ioc)容器。这篇文章深入讨论后者的源码实现。

服务容器是通过 Illuminate/Container/Container.php 类实现的。

文件 Illuminate/Container/Container.php

protected $bindings = [];

protected $instances = [];
Read more   2018/11/29 posted in  编程

理解 php new static

今天在看 Laravel 的容器(Container)实现时,发现了这么一段突然不能理解的代码:

**
* Set the globally available instance of the container.
*
* @return static
*/
public static function getInstance()
{
    if (is_null(static::$instance)) {
        static::$instance = new static;
    }

    return static::$instance;
}
Read more   2018/08/11 posted in  编程

Zend Framework 1 框架是如何被启动的?

Zend Framework 1 是一个十年前的老框架了,我接触它也有两年了,现在来写这篇文章,主要原因是最近要写入职培训教程。公司项目基本上都是基于Zend1框架,即使现在要转 Laravel 也肯定要有好长一段时间的过渡过程,而且基本上是新项目用 Laravel,老项目基本不会再重构了。因此,新人入职的话,还是需要培训一下 Zend Framework 1 的,之前把Zend官方文档的提供的一个入门教程翻译整理了一遍,作为入门教程,但这次又看了一遍之后发现,那篇教程只是教你如何做,是什么,却没有讲关于整个框架的整体的逻辑,所以,这篇文章就是为了解决这个问题的。阅读完本文之后,你将加深理解Zend1框架的启动、运行的完整流程。只有理解了这个完整的流程,才能在使用时或遇到问题时迅速解决问题,找到解决方案。

Read more   2018/06/12 posted in  编程

PHP新版本变化

世界变化真快,突然听闻 PHP 都到 7.3 版本了,7.2 还没仔细了解过呢。看到我司面试时会问到php新版本有什么特性,美名其曰考察其学习新技术的能力,我有点汗颜,自己都没有主动去了解过,实在不应该。因此,在这里立下一贴,用于记录新版本的PHP的变化,以及对实际工作的影响。

PHP 7.0

PHP7.0 号称是性能提升上革命性的一个版本。面对 Facebook 家的 HHVM 引擎带来的压力,开发团队重写了底层的 Zend Engine,名为 Zend Engine 2。

虽然是大版本的更新(直接从PHP5.6跳到了7,中间省略了不存在的6),但是几乎不会遇到兼容性的问题,不会像 Python 那样陷入 2.7 或 3.7 的选择困境。我们自己在评估测试了实际项目运行情况之后,直接升到了 7.1。

下面讲一讲主要的变化:

Read more   2018/06/01 posted in  编程

理解希尔排序

最近回顾了一下 The C Programming Language,其中提到了一个用来演示 for 循环的小例子,如下:

/** shell sort */
void shellsort(int[], int);

int main()
{
    int a[] = {1,23,34,24,32,25,31,3,36,40};
    int b[] = {32,31,30,29,28,27,26,25,24,23};
    shellsort(b, 10);
}

void shellsort(int v[], int n)
{
    int gap, i, j, temp;

    for(gap = n/2; gap > 0; gap /= 2) {
        for(i = gap; i<n; i++) {
            for(j=i-gap; j>=0 && v[j] > v[j+gap]; j-=gap) {
                temp = v[j];
                v[j] = v[j+gap];
                v[j+gap] = temp;
            }
        }
    }
}
Read more   2018/05/24 posted in  编程

PHP之外观模式

外观(Facade)模式
当使用子系统的代码时,你也许会发现自己过于深入地调用子系统的逻辑代码。如果子系统代码总是在不断变化,而你的代码却又在许多不同地方与子系统代码交互,那么随着子系统的发展,你也许会发现维护代码变得非常困难。

在项目中集成复杂的第三方代码,或在系统中逐渐形成大量仅在系统自身内部有用的代码,在这些情况下,你总可以应用外观模式,为复杂的系统创建一个简单、清晰的接口。

Read more   2017/12/19 posted in  编程

《SQL必知必会》

很适合入门的一本SQL书,虽相见已晚,但看完了,总要记录点什么。

Read more   2017/08/23 posted in  编程

JavaScript 禁止表单提交

有时我们需要在表单真正提交之前,做一些检查工作,检查通过之后再进行提交。

<form name="myForm" onsubmit = "validateMyForm(event);">

<script type="text/javacript">
function validateMyForm(event)
{
    event.preventDefault();
    if (条件) {
        alert("验证失败!");
        return false;
    }

    return true;
}
</script>

直接 return false 和 preventDefualt() 的区别在于,return false 其实做了三件事:

  1. 调用 event.preventDefualt() 停止浏览器的默认行为(表单提交),
  2. 调用 event.stopPropagation() 阻止事件继续传播,
  3. 立即停止脚本执行,立即返回。
    在大多数我们使用 return false 的地方,其实只需要 preventDefualt()。
2017/03/08 posted in  编程

AngularJS 解决 SEO 问题

由于 AngularJS 返回的是HTML模板,实际的内容需要执行JS以后才会填充进去,导致百度抓取蜘蛛抓不到,因此产生了 AngularJS 的 SEO 问题。经过几天的研究试验,我们的解决方案是这样的:在后台弄一个 PhantomJS 服务,判断是百度蜘蛛的请求后,就把请求转发给 PhantomJS,由它来解释执行JS,并返回输出给百度蜘蛛。
下面详细说一下具体实现:
后端的项目使用PHP的Zend1框架写的,只用于提供数据接口,前端使用AngularJS1。项目部署在Ubuntu上的Apache上面的。

Read more   2017/03/03 posted in  编程