php基础中个别需要注意的地方

unset()

<?php
​
$a="hello";
$b= &$a;
unset($b);
$b="world";
echo $a;
​
A:hello
B:world
C:NULL
D:unset

可以把“变量”看成一个容器,“变量名”相当于这个容器的标签!

unset相当于把这个标签名给撕了,但是只要这个盒子还有标签名贴着,那就不会被PHP的垃圾回收机制给回收掉!所以除非把所有标签给撕了,或者直接把容器里面的东西给拿出来,那么就成了空==>NULL了

多个变量指向同一个地址时,修改会同时改变多个变量的值,但删除其中一个变量 别的不受影响

mysql_num_fields ()返回结果集中字段的数目

strcmp ()— 二进制安全字符串比较 (ASCII )

<?php
​
$str = “LAMP”;
$str1 = “LAMPBrother”;
$strc = strcmp($str,$str1);
switch ($strc){
    case 1:
        echo“str > str1”;
    break;
    case –1:
        echo“str < str1”;
    break;
    case 0:
        echo“str=str1”;
    break;
    default:
        echo“str <> str1”;
}
正确答案: D
str > str1
str < str1
str = str1
str <> str1

官方解释:

如果 str1 小于 str2 返回 < 0; 如果 str1 大于 str2 返回 > 0;如果两者相等,返回 0。

当​str2时,返回0

当​str2时,返回<0(注意,没有说返回-1)

当​str2时,返回>0(注意,没有说返回1)

https://www.nowcoder.com/questionTerminal/60e159271e7c43f49643935dda5e1f1c

首先要理解strmp(,​str2)函数的意思,比较两个字符串的大小,比较时计算了两个字符串相差(不同)字符的个数一起作为返回

情况如下:

1、$str1==str2 返回 0

2、$str1 > str2 返回 1

3、$str1 < str2 返回 -1

注意:对于第2、3种情况,上面列出的只是返回结果的符号而已,并不是最终的结果

最终返回结果是: 所返回的符号乘上两个字符串相比不相同的字符个数

对于本题来说, ​str1 = “LAMPBrother”;

两个字符串不相同的字符有7个,且 ​str2,返回符号为 -1

所以最终返回的结果为 -7 (-1 * 7)

switch 条件判断case语句都没有匹配的,跳到default:所以执行 echo“str <> str1”;

在两个字符串比较的时候,如果在每个字符串 ’ 前 ‘ 有一定数量相同的字符(并且其中一个字符串完全在另一个中整体出现:),则比较的结果就是两个字符串长度的差值,没有则只进行比较

__call()方法

在调用类中不存在或无权法问的方法是触发

数据操作语言

DML(data manipulation language):  它们是SELECT、UPDATE、INSERT、DELETE,就象它的名字一样,这4条命令是用来对数据库里的数据进行操作的语言 

DDL(data definition language):  DDL比DML要多,主要的命令有CREATE、ALTER、DROP等,DDL主要是用在定义或改变表(TABLE)的结构,数据类型,表之间的链接和约束等初始化工作上,他们大多在建立表时使用

DCL(Data Control Language):  是数据库控制功能。是用来设置或更改数据库用户或角色权限的语句,包括(grant,deny,revoke等)语句。在默认状态下,只有sysadmin,dbcreator,db_owner或db_securityadmin等人员才有权力执行DCL

mysqli

MySQL目前只有InnoDB和BDB两个数据表类型才支持事务
MySQL是以自动提交(autocommit)模式运行的,必须执行mysqli对象中的autocommit(0)方法关闭MySQL事务机制的自动提交模式
调用mysqli类对象的commit()方法提交事务
调用mysqli类对象的rollback()方法撤销事务

mysql中的affected_rows

在操作mysql语句时,有时需要通过affected_rows来判断语句执行的情况。

例如在事务操作中,就可以通过affected_rows来判断事务是否执行成功,以进一步执行事务的提交或者回滚操作。

对于SELECT操作,mysql_affected_rows()等价于mysql_num_rows(),即查询结果的行数,但是显示使用mysql_num_rows()更加合适。

因此mysql_affected_rows()一般用来在DELETE, INSERT , REPLACE , UPDATE语句执行完成之后判断数据表中变化的行数(如果数据表没有变化,则行数为0)。

  1. DELETE语句执行成功,返回删除的行数,INSERT INTO TABLE VALUES 或者 INSERT INTO TABLES SET 都是返回插入成功的行数,这些是比较明确的。

  2. UPDATE语句执行成功时,则有可能也为0。如果要更新的值与原来的值相同,则affected_rows为0;否则,为更新的行数。

  3. INSERT INTO TABLE VALUES 或者 INSERT INTO TABLES SET 都是返回插入成功的行数,插入成功则返回1,否则返回0 。

  4. INSERT INTO TABLE VALUES … ON DUPLICATE KEY UPDATE … 语句执行成功后,则会有3种情况,当不存在唯一索引冲突时,执行INSERT操作,affected_rows结果为1;当存在主键冲突时,执行UPDATE操作,如果要更新的值与原来的相同,则affected_rows为0,否则为2。

  5. REPLACE INTO TABLE VALUES执行成功 ,如果没有存在唯一索引的冲突,则与INSERT操作没有什么区别affected_rows为1 ;如果存在主键冲突,则会DELETE再INSERT,所以affected_rows的值为2 。


INSERT INTO TABLE VALUES … ON DUPLICATE KEY UPDATE ,当存在唯一索引重复,并成功更新数据之后,受到影响的行数实际上是1,但是affected_rows的值为2。这个数值是mysql手册上规定的,个人猜测应该是因为该语句直接INSERT操作时的affected_rows是1,为了区分两种情况。

Notice: Undefined offset 的解决方法

调试程序的时候总是出现错误提示:

Notice: Undefined offset: 1 in xxx.php on line 48 Notice: Undefined offset: 2 in xxx.php on line 48

Notice: Undefined offset: 3 in xxx.php on line 48

Notice: Undefined offset: 4 in xxx.php on line 48

这问题很常出现在数组中的,程序是能正确地运行下去,但是在屏幕上总会出现这样的提示:Notice: Undefined offset: ….. 网上普遍是采用抑制其显示的方法,即更改php.ini文件中error_repoting的参数为”EALL & Notice “,这样屏幕就能正常显示了.

问题是解决了,但是总想不透offset:接下去的数字(如 Notice: Undefined offset: 4 ….)是什么意思.还有,句子里的语法明明是正确的,为什么会出现警告.冷静地思考了好几遍并尝试了每种可能,终于找到了答案.offset:接下去的数字是出错的数组下标,一般是超出了数组的取值范围,如定义了数组有个元数如果出现了​A[10]就会出现错误(Notice: Undefined offset: 10 ….),因为数组的下标是从0开始的,所以这个数组的下标就只能是0~9.因此在出现这类问题时,不要急于用抑制显示的方法(更简单的可以在当前文件的最前面加上一句”error_reporting(填offset:接下去的那个数字);,一定要注意你所用的数组下标,仔细思考一下,问题一定会很快得到解决的 !也有可能是unset数组后再尝试读取其内容,php手册中有:

字符集编码问题

$str = "qimai东方红是老江湖";
echo strlen($str);
echo '<br/>';
echo mb_strlen($str,'gbk');
//这时上面的strlen($str)输出26,因为utf-8中一个汉字站3个字符
//mb_strlen($str,'gbk')输出16
$str = "东方红是老江湖qimai";
echo strlen($str);
echo '<br/>';
echo mb_strlen($str,'gbk');
//这时strlen($str)输出不变,mb_strlen($str,'gbk')输出15,
$str = "东方红是qimai老江湖";
echo strlen($str);
echo '<br/>';
echo mb_strlen($str,'gbk');
//这时strlen($str)输出不变,mb_strlen($str,'gbk')输出16,
//因为字符串中英文出现的位置不同mb_strlen()函数的结果会受到影响,
//这个影响只有在字符集是gbk的时候才会出现,
//如果mb_strlen($str,'utf-8')中是utf-8字符编码则结果都是12
​

猜你喜欢

转载自blog.csdn.net/ljd914040633/article/details/82182663