1.mysql 字符串和0比较结果为真
select 'string'=0; //结果为
+------------+
| 'string'=0 |
+------------+
| 1 |
+------------+
大概意思就是说,在mysql里面用字符串和数字比较的话,会先把字符串转换成数字 因为“string”这个字符串里面不是以数字开头的,所以转化成了0,0当然是等于0的,所以就返回为true了
2.php里面的字符串和0值比较,也是true的。
var_dump('abc'==0) 为true,也是因为比较的时候做了转换
3.php的函数名是大小写不敏感的 也就是说
function aa(){echo 'aa'};
echo aa(); // aa
echo AA();//不会出错,也是aa
但是php得变量是大小写敏感的
4.在php里面const和define的区别
http://stackoverflow.com/questions/2447791/define-vs-const/3193704#3193704
php引用
1.引用传递的时候只要函数声明的时候加上&符号就可以,调用函数时写的实参并不需要加上&符号也可
function foo(&$var){ $var++;}
$a=5;foo($a);
2.引用返回的时候如果要想期望运行正常 则函数定义和函数调用的时候都必须加&符,接受函数返回的变量和返回的变量并不引用同一个地址
function &func(){
static $static = 0;
$static++;
return $static;
}
$var1 =& func();
echo "var1:", $var1; // 1
func();
func();
echo "var1:", $var1; // 3
$var2 = func(); // assignment without the &
echo "var2:", $var2; // 4
func();
func();
echo "var1:", $var1; // 6
echo "var2:", $var2; // still 4
php对象复制是通过引用传递的,如果想拷贝一个副本,使得修改原来的对象不会影响的副本的值 使用clone关键字
class person{
public $name;
public $age;
public function toString(){
echo "姓名是:".$name;
echo "年龄是:".$age;
}
}
//引用传递 修改了p1,p2也自动被修改了
$p1=new person();
$p2= $p1;
var_dump($p1);
var_dump($p2);
$p1->name="zhangsan";
$p1->age=14;
var_dump($p1);
var_dump($p2);
$p3= clone $p1;
var_dump($p1);
var_dump($p3);
$p1->name="lisi";
$p1->age=15;
var_dump($p1);
var_dump($p3);
mysql 限制没有where语句的时候禁止执行update 和delete语句
相信很多人都遇到过不小心update的时候没有写where语句就误碰到了回车的问题,教训之惨痛不言而喻,我甚至见过有人把线上的数据全部update成了一样的值
那么预防这种问题的办法是什么呢,其中之一就是限制那些没有where子句的mysql执行
这里需要一个mysql变量的配合 sql_safe_updates
| sql_safe_updates | OFF |
这是一个mysql session变量,可以动态修改它的值,但是只限于当前回话,该值无法设置为全局的
所以要使其生效需要在每个mysql链接中执行 set sql_safe_updates=on; 来进行启用
效果为:只有在拥有where子句的情况下,并且where子句里面的字段是主键的情况下才能执行通过
或者
只有在拥有where子句的情况下,如果where子句里面的字段不是主键的情况下则需要配合limit 子句才能执行通过
php的交互式命令行环境
有些时候有一些小的php代码片段需要测试,每次都写一个php文件然后通过web运行起来有点略显麻烦
这时候就可以通过php的交互式环境来执行这些代码片段
启用php的交互式模式的命令为
php -a
使用这个功能需要编译的时候开启了readline选项,否则无法使用
php在函数里面想使用函数外面的变量:
1.在函数里面使用global 声明变量 比如:global $a;
2.在函数里面使用超级全局变量引用 比如:$GLOBALS['a']
查看某一个字符的unicode代码点和utf8存储编码或者gbk存储编码
set names utf8
select hex(convert('中’ using ucs2)); //查看’中‘字的unicode代码点
select hex(convert('中' using utf8));//查看’中‘字的utf8存储编码 E4B8AD
select hex(convert('中' using gbk));//查看’中‘字的gbk存储编码
select convert(0xE4B8AD using utf8); //转换'中'字的存储编码‘E4B8AD’到‘中’字
mysql的虚拟表 dual
如果想永远获取一个空集可以使用sql
select 1 from dual where false;
php去除非bmp(Basic Multilingual Plane)字符
1.根据字符长度取出 (bmp字符占用3个字符 supplementary planes字符占用4个字节 )
//remove non-BMP characters
function trimOutsideBMP($str) {
if (empty($str)) return $str;
$len = mb_strlen($str);
$str1 = '';
for ($i = 0; $i < $len; $i++) {
$c = mb_substr($str, $i, 1,'utf8');
$str1 .= strlen($c) <= 3 ? $c : '';
}
return $str1;
}
2.根据正则范围
Since 4-byte UTF-8 sequences always start with the bytes 0xF0-0xF7
, the following should work:
$str = preg_replace('/[\xF0-\xF7].../s', '', $str);
Alternatively, you could use preg_replace
in UTF-8 mode but this will probably be slower:
$str = preg_replace('/[\x{10000}-\x{10FFFF}]/u', '', $str);
This works because 4-byte UTF-8 sequences are used for code points in the supplementary Unicode planes starting from 0x10000
.