原创:商城开发中,真正唯一订单雏形-插入订单,获得订单的id,把订单id拼装到自定义订单号中

@$mysql = mysql_connect('localhost','root','root');
mysql_query('set names utf8');
mysql_select_db('test');

//$sql="insert into ddd2 set uid='".$str."'";
//ddd2表模拟订单表,字段uid模拟订单号字段
$sql="insert into ddd2 set addtime='".date("Y-m-d H:i:s")."'";
mysql_query($sql);
//$id=mysql_insert_id();
$idrs=mysql_fetch_array(mysql_query("SELECT LAST_INSERT_ID()"));//用此代替mysql_insert_id()就可以解决非int型自增长取值不准的bug问题。
$id=$idrs[0];
//我们可以在更新前对$iddiy进行拼装。
$iddiy=$id;
$sql="update ddd2 set uid='".$iddiy."' where id=".$id;//uid模拟订单号字段
mysql_query($sql);
//apache下自带的ab.exe并发高压测试
//ab.exe -c 100 -n 100 http://127.0.0.1/a1.php

附上测试表结构:

CREATE TABLE `ddd2` (
  `id` bigint(11) NOT NULL AUTO_INCREMENT,
  `uid` varchar(100) DEFAULT NULL,
  `addtime` datetime DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uid` (`uid`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

 

$idrs=mysql_fetch_array(mysql_query("SELECT LAST_INSERT_ID()")); 有人会问为什么这样写呢?因为mysql_insert_id()是有bug的。在int型下是可以在的,在非int型如:bigint下,mysql_insert_id()取值就不准了。

本文章由:徐多蔚  徐老师 xuduowei原著。转载请注明来源,谢谢。

 


关注公众号,了解更多it技术(it问答网

2个自定义的PHP in_array 函数,解决大量数据判断in_array的效率问题

大家可能都用过in_array来判断一个数据是否在一个数组中,一般我们的数组可能数据都比较小,对性能没什么影响,所以也就不会太在意。

但是如果数组比较大的时候,性能就会下降,运行的就会久一点,那如果针对在大数组情况下做优化呢,下面说两种方法(都是通过自定义函数来实现):

1.数组key与value翻转,通过isset判断key是否存在于数组中

/**
 * in_array is too slow when array is large
 */
function inArray($item, $array) {
    $flipArray = array_flip($array);
    return isset($flipArray[$item]);
}

大家可能也会问为什么不用 array_key_exists 来做判断二用isset呢? 下面看下array_key_exists() 与 isset() 的对比:
isset()对于数组中为NULL的值不会返回TRUE,而array_key_exists()会。

<?php
$search_array = array('first' => null, 'second' => 4);
// returns false
isset($search_array['first']);
// returns true
array_key_exists('first', $search_array);
?>

2.用implode连接,直接用strpos判断

用implode函数+逗号连起来,直接用strpos判断。php里面字符串取位置速度非常快,尤其是在大数据量的情况下。不过需要注意的是首尾都要加”,” ,这样比较严谨。如: ,user1,user2,user3, 查找的时候,查,user1,。还有strpos要用!== false,因为第一个会返回0。示例如下:

return strpos($str,(string)$item)==false?false:true;**
 * in_array is too slow when array is large
 */
function inArray($item, $array) {
    $str = implode(',', $array);    
    return strpos($str,(string)$item)==false?false:true;
}

提示:以上2个函数均有bug!方法一数组翻转中,若原始数组值有null的,是会出问题的;方法二的只能验证字符串类型的。无法验证整形数字。总结:还是in_array($str,$arr,true) 验证方式最安全可靠。虽然性能相对底一点。

 

 

 


关注公众号,了解更多it技术(it问答网

sql中的正则

//REGEXP 是sql中的正则。

select * from infos where tuijian REGEXP ‘[1]’;

SELECT * FROM infos WHERE CONCAT(“,”,tuijian,”,”) REGEXP “,[13],”;//检索1或者3的
SELECT * FROM infos WHERE CONCAT(“,”,tuijian,”,”) REGEXP “,(13),”;//检索13的。

//检索,1,3或者13的。
SELECT * FROM infos WHERE CONCAT(“,”,tuijian,”,”) REGEXP “,[13],” or CONCAT(“,”,tuijian,”,”) REGEXP “,(13),”
SELECT * FROM infos WHERE CONCAT(“,”,tuijian,”,”) REGEXP “,(13)|[13],”


关注公众号,了解更多it技术(it问答网

tp5快速上手笔记-徐多蔚,合肥php老师

tp5:
项目开发中,tp5线上手册路径:
https://www.kancloud.cn/manual/thinkphp5/118003
文件夹命名是小写
控制器文件名:驼峰法【首字母大写规则】
命名更精简:如Index.php
单独口文件,默认是index模块,index控制器中的index方法。
tp5中默认只支持pathinfo url路径;入口文件在站点根目录的public/index.php
tp5/public/index.php/模块名/控制器名/方法名
tp5/public/index.php/index/index/index
如何渲染视图?
开启debug模式方便我们调试。 app项目文件夹下的config.php
‘app_debug’              => true,
1、继承核心控制器类;【导入核心类】
use think\Controller;
2、使用return函数;
3、使用$this->fetch(参数)渲染视图。
参数若省略:默认找的视图路径是模块下的view文件夹中的和控制器同名的文件夹中的文件【和方法同名的文件】
视图中默认的扩展名.html
打开配置项搜索: // 模板后缀
 ‘view_suffix’  => ‘html’,
若我们希望修改默认的渲染视图路径,我们可以把参数修改。
如:/a   含义就是view文件夹下的a.html
/a/a  含义就是view文件下的a文件夹中的a.html
tp5视图中,数组的循环推荐2种写法。
写法一:
{foreach $xdw as $k=>$v}
{$k}
{/foreach}
 
写法二:
{foreach name="list" item="vo" key="k" }
   {$k}|{$vo}
{/foreach}

 

公共视图文件的包含:
{include file=”head” /}
如何创建自己的方法,又如何访问?
tp5中用户自定义函数存放:
tp5\application\common.php
 
public function abc(){
//echo 666;
//echo $_GET['aaa'];
$arr=$this->request->param();
var_dump($arr);
}

 

访问的路径写法,默认只支持pathinfo模式
index.php/模块名/控制器名/方法名
若在访问的时候,需要进行传值。传值写法格式如下:
格式一:
index.php/模块名/控制器名/方法名/?aaa=1&bbb=2
格式二:
index.php/模块名/控制器名/方法名/aaa/1/bbb/2
我们可以使用tp5中内置的取值函数获取传递过来的参数。
$this->request->param();
tp5中$_GET[] 不太好用。提示:若是上方格式二传值,则get不到值。
提示:
tp5中,没有U方法了,我们用url实现。
没有I方法了,我们用input实现。
input('get.id'); // I('get.id');
input('post.name'); // I('post.name');

提示:tp5中的input(“get.”)只能获得表单提交过来的数据,不能得到url get传值哦。

tp5中用url代替了U方法。
{:url(‘模块名/控制器名/方法名’)}
tp5中数据库的操作【增、删、改、查】
1、配置数据库的参数;
项目文件夹[application]/database.php 文件中。
2、在控制器中先把Db类文件导入到页面命名空间中。如 :
use think\Db;
3、执行增、删、改、查
查询操作:
$data=Db::name(‘user’)->find();
print_r($data);
$data=Db::name(‘users’)->where(‘id=88’)->select();
$data=Db::name(‘users’)->query($sql);//提示$sql是自己定义的
提示:在自定义sql定义中,有可能涉及到表前缀,如何获得配置文件中的表前缀呢?    config(‘database.prefix’)
    删除:
$data=Db::name(‘users’)->where(‘id=88’)->delete();//删除,返回影响的实际记录数。
   tp5增加:
$data=Db::name(‘users’)->insert($data);//插入记录,insert ;//$data是实际影响的记录数。
   更新:
//更新用update
$data=Db::name(‘users’)->where(‘id’, 86)->update($data);//$data是实际影响的记录数。

tp5获取插入的数据的自增id

insertGetId方法新增数据并返回主键值使用getLastInsID方法:

Db::name(‘user’)->insert($data);

 $userId = Db::name(‘user’)->getLastInsID();

// 使用insertGetId方法

Db::name(‘user’)->insertGetId($data);

经典子查询+分页:
	$a=config("database.prefix")."administrators";
	$b=config("database.prefix")."administrators_groups";
			
	//https://www.kancloud.cn/manual/thinkphp5/118083
	$arr=$this->db->table($a)->alias('a')->join("$b b",'a.gid = b.id','left')->where($tj)->paginate(config('admin888.pagesizenum'),false, [
                'query' => Request::instance()->param(),//不丢失已存在的url参数
            ]);

 

tp5中 $this->success 跳转时间默认是3S【注:tp3中成功默认时间是1s】
tp3修改时间格式:
$this->success(“登录ok”,url(“Admin/Index/succ”),10);
tp5修改格式:
$this->success(“登录ok”,url(“Admin/Index/succ”),”,10);
tp5中,session的使用。不能使用默认的$_SESSION来定义和取值了,我们需要使用框架中内置的session类来处理。
使用之前记得先导入。
use think\Session;
设置session Session::set(“username”,$name);
获得session值 Session::get(“username”);
tp5中的视图魔术常量 __ROOT__  代替了tp3.2.3中 __PUBLIC__
TP5使用验证码的方法:
方案一:tp5框架内置的验证码
1、{:captcha_src()} 这个是验证码的路径;在视图可直接引用即可。
2、控制器验证:
if(!captcha_check($yzm)){
$this->error(“验证码错误”,url(‘index/index’));
}
方案二:自定义类文件方法
如何自定义类文件。
核心文件夹:www\tp5.171219\thinkphp\library\think
提示:
1、类文件内容中的命名空间不能省略:
namespace think;
2、类名和对应的文件名必须保持一致。
文件名:Yzm.php
class Yzm{
}
控制器中如何使用用户自定义的类?
1、导入  use think\Yzm;
2、$obj=new Yzm();
   $obj->CreateImg();
3、验证码中值的传递,使用session传值。
Session::set(“code”,$cm);
Session::get(“code”);
提示:验证码类文件中可以直接使用Session::set(“code”,$cm);原因是我们在控制器那里已经导入了Session类。
另外,我们也可以灵活使用扩展类的方式实现。

1、在根目录 extend 中创建 Mess.php类文件;
code:

<?php
class Mess{

	function xdw(){
		echo "xuduowei";
	}
}
?>

2、在对应的引用的控制器中
use Mess;
$Mess=new Mess();
$Mess->xdw();

 

=============================================
一:模拟线上站点,创建虚拟域名;
a: 【baidu.com】
phpstudy->其他选项菜单->站点域名管理->
站点管理->设置好后->新增->保存设置并生成配置文件
b:确保服务重新启动;
c:修改host
C:\Windows\System32\drivers\etc\hosts
确保去掉只读属性;
使用编辑器打开。
按照如下格式写入配置信息:
127.0.0.1       baidu.com
提示:若线下开发的搬到线上运营,有可能会出现样式丢失问题【路径惹的祸】。
\tp5\application\config.php
更前曾经的模板替换字符串:如
 ‘view_replace_str’       => [ ‘__ROOT__’ => ‘http://www.xuduowei.com/’,],
防跳墙的构架:
class Index extends Common{
}
Common:
<?php
namespace app\admin\controller;
use think\Controller;
class Common extends Controller
{
    public function _initialize(){
echo 666;
}
}
=======================
tp5中获得当前模块,控制器,方法的写法和tp3是不一样的。
1、导入 use think\Request;
2、方法中实例化 $request= Request::instance();
3、使用实例化对象中的方法。
echo $request->module();//这个是模块的;
echo $request->controller();//控制器名的。
echo $request->action();//得到方法的。
tp5中的分页:
1、不需要我们传递总记录数;
$arr=$obj->where($tj)->paginate(2);
2、搜索分页
use think\Request;
$arr=$obj->where($tj)->paginate(2,false, [
                ‘query’ => Request::instance()->param(),//不丢失已存在的url参数
            ]);
用户删除传值[get方式]:
<a class=”button border-red” href=”javascript:void(0)” onclick=”return del(‘<?php echo url(‘admin/Users/del?id=’.$rs[‘id’]);?>’)”><span class=”icon-trash-o”></span> 删除</a>
url(‘admin/Users/del?id=’.$rs[‘id’]) 这个是ok的。
url(‘admin/Users/del/id/’.$rs[‘id’]) 这个是不对的。
其他扩展:调用其他模块或者控制器的方法:
    action(‘admin/Common/auto’);//注意这个不推荐在后台模块开发中使用,因为后台模块开发涉及到权限问题,这个action是控制器层面的,所以在控制器相互调用中有可能无权限操作。这个应用场景更多的再前端模块使用。

tp5中:
1、模型的载入;

方法一:直接在控制器中实例化:
$obj=new \app\admin\model\Index2; //提示第一个\是不能省略的。否则报错!
echo $obj->index();

方法二:use 导入,后实例化。

use \app\admin\model\Index2;
控制方法中:

$obj=new Index2;
echo $obj->index();

===============================
tp5高级:

TP5隐藏后台方法【目的是希望后台模块不在url中暴露模块名,这样更安全;第一步是定义单入口模式,绑定对应模块;第二步就是即使暴露出来了,也禁止访问。】

一、增加后台模块入口文件public/boss.php

// 定义应用目录
define('APP_PATH', __DIR__ . '/../application/');
define('BIND_MODULE','admin');
// 加载框架引导文件
require __DIR__ . '/../thinkphp/start.php';

二、修改配置文件禁用后台模块访问application/config.php

// 禁止访问模块
    'deny_module_list'       => ['common','admin'],

thinkphp修改数据表时怎么实现字段自加1-PHP框架开发

$User->where('id=5')->setInc('score',3); // 用户的积分加3
$User->where('id=5')->setInc('score'); // 用户的积分加1
$User->where('id=5')->setDec('score',5); // 用户的积分减5
$User->where('id=5')->setDec('score'); // 用户的积分减1

 


关注公众号,了解更多it技术(it问答网

最简单的方法得到数组的最大值和最小值

<?php
//最简单的方法得到数组的最大值和最小值。
$a=array('1','3','55','99');
echo max($a);
echo min($a);
//对数据进行大小排序
$b=Array(1,3,7,65,9,4,6);
function cc($v1,$v2){
if($v1>$v2){
return 1;
}else{
return 0;
}
}
usort($b,'cc');
print_r($b);
?>

 

===================================================
xuduowei  徐多蔚  合肥php老师

关注公众号,了解更多it技术(it问答网

获取文件名的3种方法

1、
$arr_f=explode(“/”,$_SERVER[‘SCRIPT_FILENAME’]);
echo $arr_f[count($arr_f)-1];

2、$arr= pathinfo($_SERVER[‘SCRIPT_FILENAME’]);
//print_r($arr[‘basename’]);

3、basename($_SERVER[‘SCRIPT_FILENAME’]);

以上3中,对应的操作文件均可以是:E:/phpStudy/www/tc/php1/admin888/user_edit.php 格式
提示:1可以有磁盘url,也可以无,但是2,3必须是完整的文件路径【带有磁盘url的】

整理:徐多蔚 合肥php老师


关注公众号,了解更多it技术(it问答网

similar_text()计算相似度、basename得到文件名【不要扩展名】,项目中有时候需要得到文件名和数据库中的字段进行匹配,整理:徐老师,徐多蔚,xuduowei

项目中有时候需要得到文件名和数据库中的字段进行匹配。我们就可以按若下2个函数作为核心函数进行业务逻辑处理。

similar_text() 函数计算两个字符串的匹配字符的数目。

该函数也可以计算两个字符串的相似度(以百分比计)。

代码如下:

similar_text(‘你好啊,早上好’, ‘你好啊’, $percent);
echo $percent;
die;

//得到文件名【不要扩展名】
$f=”aaaa.gif”;
$ext_arr=explode(“.”,$f);
$extString=$ext_arr[count($ext_arr)-1];
echo basename($f, “.”.$extString);

作者:徐多蔚【徐老师】 xuduowei.com


关注公众号,了解更多it技术(it问答网