所有由zhufenghua发布的文章

为什么有时不使用ajax?而是动态页面?

在一些情况下,应该减少使用js生成页面。

这种情况通常是指增加搜索引擎的收录。

搜索引擎抓取页面时,只抓取html标签而不会抓取对应的js。

如果使用 js 动态生成html,则搜索引擎并不能正常抓取,这个问题不单单体现在 ajax,中,也体现在最近几年比较火的 vue 框架。

为什么有时使用jquery而不是vue?又或者直接使用后端模板引擎直接生成html页面,都是为了在一定程度上增强seo。

网站前台推荐动态模板引擎直接返回html或配合少量的js,而网站后台则推荐用 js 模板引擎框架,如vue。

sql 之 where 1=1 或者 where 1=2

假如后续有 0 个、一个、多个 and 条件时,一般使用 where 1=1

因为不知道第一个 and 条件是什么,where 1=1例子:

        $where = " where 1=1";
        // 指定订单状态
        if($state!=""){
            $where .= " and o.orderstate=$state";
        }
        // 指定类型
        if($type!=""){
            $where .= " and o.type='$type'";
        }

where 1=2,可用在拼接 or 条件、且个数不定时使用。

因为不知道第一个 or 条件是什么,where 1=2例子:

        // 关键字
        if($skword!=""){
            $where .= " and (1=2";
            if(is_numeric($skword)){
                $where .= " or o.`proid`=$skword";
            }
            $where .= " or l.`title` like '%$skword%'";
            $where .= ")";
        }

毕业论文查重通过后能不能修改?

能修改。

查重率不能过高是学校要求的,而在查重通过后发现有部分不太通顺此时可以修改,修改后可以再查重或不查重。

如果不再次查重,可以直接提交上次的查重报告,学校会有5%的几率进行抽查,如果学校抽中你的论文进行查重且重复率高于指标,则可能会面临很大问题。

综上,如果查重通过,进行少量修改可以不进行再次查重,如果进行大变动为保险起见可以进行再次查重。

mysql计算表大小、数据库大小、获取表名、表中行数、索引大小、引擎等基本信息。

只需要一个函数即可:

show table status;

你将得到一个多列的信息,包含了上述数据,每一行包含了一个表信息、如表名、数据大小、索引大小、引擎、行数等

再通过程序计算相加,可得到数据库总大小。

简单命令,例如:

show tables;  // 表名

show databases; // 数据库名

show index from tables_name;  // 查询一个表的索引

其他:

1. show tables或show tables from database_name; — 显示当前数据库中所有表的名称。
2. show databases; — 显示mysql中所有数据库的名称。
3. show columns from table_name from database_name; 或show columns from database_name.table_name; — 显示表中列名称。
4. show grants for user_name; — 显示一个用户的权限,显示结果类似于grant 命令。
5. show index from table_name; — 显示表的索引。
6. show status; — 显示一些系统特定资源的信息,例如,正在运行的线程数量。
7. show variables; — 显示系统变量的名称和值。
8. show processlist; — 显示系统中正在运行的所有进程,也就是当前正在执行的查询。大多数用户可以查看他们自己的进程,但是如果他们拥有process权限,就可以查看所有人的进程,包括密码。
9. show table status; — 显示当前使用或者指定的database中的每个表的信息。信息包括表类型和表的最新更新时间。
10. show privileges; — 显示服务器所支持的不同权限。
11. show create database database_name; — 显示create database 语句是否能够创建指定的数据库。
12. show create table table_name; — 显示create database 语句是否能够创建指定的数据库。
13. show engines; — 显示安装以后可用的存储引擎和默认引擎。
14. show innodb status; — 显示innoDB存储引擎的状态。
15. show logs; — 显示BDB存储引擎的日志。
16. show warnings; — 显示最后一个执行的语句所产生的错误、警告和通知。
17. show errors; — 只显示最后一个执行语句所产生的错误。
18. show [storage] engines; –显示安装后的可用存储引擎和默认引擎。

PDO::ATTR_CASE

pdo的一个连接属性

  • PDO::ATTR_CASE:强制列名为指定的大小写。
    • PDO::CASE_LOWER:强制列名小写。(值为2)
    • PDO::CASE_NATURAL:保留数据库驱动返回的列名。(默认,值为0)
    • PDO::CASE_UPPER:强制列名大写。(值为1)

创建一个pdo实例,并设置或读取其属性

$DB = DB::getConn();
echo $DB->getAttribute(PDO::ATTR_CASE);

sql之update语句返回0

在命令行,或navicat,或php pdo中执行 update语句时,如果更新的值和原来的值相同,则返回0。

如果使用java的jdbc执行,则返回1。

两者的不同的原因是,jdbc计算的是匹配(match)到的行,而pdo计算的是收影响(affect)的行。

这个属性是在获取连接对象时指定的。

例如java指定连接参数:

jdbc:mysql://ip:port/db? useAffectedRows=true&…

或者pdo指定连接信息:(php5.3开始)

<? php
    $p = new PDO($dsn, $u, $p, array(PDO::MYSQL_ATTR_FOUND_ROWS => true));  //使用found_rows
?>

使用 found_rows 只能在创建连接时使用,然后就可以在update语句中忽略update相同值带来返回0的影响。

    /**
     * 新增、更新、删除语句
     * @param string $sql
     * @return mixed
     */
    public static function update(string $sql){
        $DB = self::getConn();
        $pre = $DB->prepare($sql);
        $pre->execute();
        return $pre->rowCount();
    }

此时,php的rowCount()无论在update是否重复值,均会返回非零值。

此时,在判断sql是否执行成功,只需要 if($res) 即可。

sql查询结果集工具封装

sql查询结果集,无非有4种格式。

单行单列,也就是一个数据。(用作比较值)

单行多列,也就是一行。

多行单列,简单来说是一列。(用in语句)

多行多列,也就是一张新表。(实际上前几种也可看做表)

对于结果集的封装,推荐强制校验数据格式,以php为例,:

getOne:单行单列封装为一个变量。

getArr:单行多列或多行单列封装为一个数组。

getArrList:多行多列,封装为二维数组。

其他常用:

getPage:分页,封装为数组,其中list为数据,pageInfo为页面info

getLastId:获取最后一个生成的主键。

update:一些insert、update、delete操作,返回影响条数

getNames:获取返回的字段名,封装为数组。

getDbSize:获取数据库大小

getTableSize:获取指定表大小。

showTables:获取数据库所有的表,封装为数组

showCteateTable:获取指定表的建表语句。

getVersion:获取数据库版本

setErrLevel:设置错误等级,针对错误进行不同级别的处理。

mysql、oracle自动分页

查询分页需要2个sql,一个是取得分页数据, 另一个是获取总条数

参数传递为:page,pageSize,sql

mysql分页

分页 sql 通过自动拼接 limit m, n 得到。

原sql limit m,n

总数 sql 通过套一层 select count(*) total from ( 原sql ) as temp_count ;即可得到。

select count(*) total from (原sql) as temp_count

对数据量极大的情况下性能未优化,但好在通用,小项目足矣。

在sql的优化中,对总数sql可以尝试智能解析sql,比如检测是否存在order by以及能否去除,这样可以加快count速度,总之是对sql的各种自动检测。

oracle分页

原理和mysql分页几乎是一致的,就是没有limit这么简单,稍微复杂一点点

SELECT * FROM ( 
 SELECT TMP_PAGE.*, ROWNUM PAGEHELPER_ROW_ID FROM ( 

原sql

 ) TMP_PAGE)
 WHERE PAGEHELPER_ROW_ID <= ? AND PAGEHELPER_ROW_ID > ?

而总数sql 和 mysql 总数实现是一致的,都通过套上 count(*) 。

mysql 语句执行顺序

一般执行顺序

  1. from =》 判断从哪些表取数据
  2. ON =》 临时表条件(虚拟表)
  3. JOIN =》 连接多表
  4. where =》判定条件,得出结果集
  5. group by=》对结果集分组
  6. having =》 对结果集过滤
  7. select =》 查询字段(这里可再进行聚合函数)
  8. DISTINCT =》 唯一筛选
  9. order by =》排序
  10. limit =》限定条数

查询拍卖出价表中,每个用户最高出价。(一个表中用户多次出价, 只取出每个用户记录最高的一条)

解题思路:首先必须要max(price),取得最大值。但在此之前要分组,按照用户ID进行分组。

如果没有 group by,只使用 max 的时候如下:

select max(price) max_price,uid from paimai_order_record;

上面只有最高的一条,而在 表名后添加 group by uid 反而变成多条了。

select max(price) max_price,uid from paimai_order_record group by uid;

另外 limit n,m 的方式中效率是非常低的,这时可以通过在 where 中增加条件,从而提高效率。

例如在ID连续的情况下:

select * from t_user where id between 9000000 and 9000100 limit 100;

如果ID不连续,但一般至少也是递增的,通过子查询查出最小 ID,然后限定为 > min_id,然后再 limit 查询数量,例如:

select * from user where type = 8 and id >= (
    select id from user where type = 8 limit 100000,1
) limit 100;