mysql 和 php的一些备忘

本文详细解读了MySQL与PHP在处理字符串与数字比较时的内部逻辑,包括如何将字符串转换为数值进行比较,以及不同语言环境中比较行为的差异。此外,还介绍了PHP中的引用传递、常量与定义的区别、对象复制方式以及如何通过设置mysql变量防止误操作等关键概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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.

资源下载链接为: https://pan.quark.cn/s/1bfadf00ae14 华为移动服务(Huawei Mobile Services,简称 HMS)是一个全面开放的移动服务生态系统,为企业开发者提供了丰富的工具 API,助力他们构建、运营推广应用。其中,HMS Scankit 是华为推出的一款扫描服务 SDK,支持快速集成到安卓应用中,能够提供高效且稳定的二维码条形码扫描功能,适用于商品扫码、支付验证、信息获取等多种场景。 集成 HMS Scankit SDK 主要包括以下步骤:首先,在项目的 build.gradle 文件中添加 HMS Core 库 Scankit 依赖;其次,在 AndroidManifest.xml 文件中添加相机访问互联网访问权限;然后,在应用程序的 onCreate 方法中调用 HmsClient 进行初始化;接着,可以选择自定义扫描界面或使用 Scankit 提供的默认扫描界面;最后,实现 ScanCallback 接口以处理扫描成功失败的回调。 HMS Scankit 内部集成了开源的 Zxing(Zebra Crossing)库,这是一个功能强大的条码二维码处理库,提供了解码、生成、解析等多种功能,既可以单独使用,也可以与其他扫描框架结合使用。在 HMS Scankit 中,Zxing 经过优化,以更好地适应华为设备,从而提升扫描性能。 通常,ScanKitDemoGuide 包含了集成 HMS Scankit 的示例代码,涵盖扫描界面的布局、扫描操作的启动停止以及扫描结果的处理等内容。开发者可以参考这些代码,快速掌握在自己的应用中实现扫码功能的方法。例如,启动扫描的方法如下: 处理扫描结果的回调如下: HMS Scankit 支持所有安卓手机,但在华为设备上能够提供最佳性能体验,因为它针对华为硬件进行了
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值