m_Orchestrate learning system---二十九、什么情况下用数据库做配置字段,什么情况下用配置文件做配置
一、总结
一句话总结:
配置文件 开发人员 重置
数据库 非开发人员 重启
配置文件做配置的特点:方便开发人员修改配置,服务器重启的话配置重置。
数据库做配置的特点:方便非开发人员修改配置,服务器重启的话配置不会受到影响。
1、填写表单(比如增加修改)后的history.go(-1)会跳到跳转页面,使后台的代码再执行一遍,这样会给用户及其不好的用户体验,如何解决?
分治
统一解决是不行的,history的后退机制就是这样,比如删除某一项功能,后台的delete函数和跳转页面组成的页面是客观存在的html页面,也客观存在于history对象的url中,因为我们无法查看history对象的url(出于安全),而且修改引擎(或者说框架)也不可行,那就只有每个页面单独指定,因为页面不多,倒是也负担不大,也就多了小几行代码。
因为页面有限,所以可以分而治之。
后退逻辑其实和面包屑逻辑是一样的
2、thinkphp文件的多图上传之后,修改操作的陷阱?
特判
单图上传修改时候传回来的内容,称为“内容1“”
1 ["a_content_pic2"] => array(5) { 2 ["name"] => string(0) "" 3 ["type"] => string(0) "" 4 ["tmp_name"] => string(0) "" 5 ["error"] => int(4) 6 ["size"] => int(0) 7 }
多图上传修改时候传回来的内容,称为“内容2”
["a_content_pic3"] => array(5) { ["name"] => array(1) { [0] => string(0) "" } ["type"] => array(1) { [0] => string(0) "" } ["tmp_name"] => array(1) { [0] => string(0) "" } ["error"] => array(1) { [0] => int(4) } ["size"] => array(1) { [0] => int(0) } }
我的问题是因为我的内容2做了特判,所以导致修改的时候修改别的会让内容2的内容没有
1 foreach ($_FILES as $key=>$val){ 2 if($_FILES[$key]['tmp_name']){ 3 // 获取表单上传文件 例如上传了001.jpg 4 $file = request()->file($key); 5 if($key=='a_content_pic3'){//多图上传的情况 6 //不用拆,官方文档有怎么用 7 //修改的時候a_content_pic3有更新 8 if($_FILES[$key]['size'][0]!=0){ 9 $files=$file; 10 $data[$key]=null; 11 foreach($files as $perFile){ 12 // 移动到框架应用根目录/public/uploads/ 目录下 13 $info = $perFile->move(ROOT_PATH . 'public' . DS . 'static/uploads/student/note'."/{$jieduanStr}"); 14 $data[$key].='/static/uploads/student/note/'."{$jieduanStr}/".$info->getSaveName().',,'; 15 } 16 } 17 18 }else{ 19 // 移动到框架应用根目录/public/uploads/ 目录下 20 $info = $file->move(ROOT_PATH . 'public' . DS . 'static/uploads/student/note'."/{$jieduanStr}"); 21 // 已经上传成功,我们要把文件的路径写进数据库 22 $data[$key]='/static/uploads/student/note/'."{$jieduanStr}/".$info->getSaveName(); 23 } 24 } 25 }
加第8行代码就做判断那就好了,那么第10行代码就不会在没有更新的情况下起作用了
3、title和select标签的option标签中不支持如下方式的js实现的语言切换功能,如何解决?
php
用php就轻松搞定了
1 <select data-am-selected="{btnSize: 'sm'}" name="a_type" id="student_note_type_choose"> 2 <option value="1" note_type="student_note_type_article"> 3 <span class="fry_language_item fry_language_hk">文章類</span><span class="fry_language_item fry_language_en">Article</span> 4 </option> 5 </select>
对应的语言选择的js:
1 <!--语言选择的js--> 2 <script> 3 function chooseLanguage(){ 4 $('.fry_language_item').hide(); 5 $('.fry_language_hk').show(); 6 var fry_language_type="fry_language_en"; 7 //console.log(fry_language_type); 8 if(fry_language_type=="fry_language_hk"){ 9 $('.fry_language_item').hide(); 10 $('.fry_language_hk').show(); 11 }else if(fry_language_type=="fry_language_cn"){ 12 $('.fry_language_item').hide(); 13 $('.fry_language_cn').show(); 14 }else if(fry_language_type=="fry_language_en"){ 15 $('.fry_language_item').hide(); 16 $('.fry_language_en').show(); 17 } 18 } 19 chooseLanguage(); 20 </script> 21 <!--END 语言选择的js-->
select标签的option标签不支持这样方式的原因:span被覆盖了,或者被重写了,或者是不知名的操作
4、网页源码查看js代码可能出现的误导是什么?
动 静
动态代码会被误当成静态代码
会看不到php,从而形成一定的误导
看到fry_language_type="fry_language_en"的时候,我会犹豫哪fry_language_type="fry_language_hk"的情况跑哪去了,
然后疑惑
所以看代码逻辑最好是看源码,而不是看网页源码,不过看网页源码可以知道这个页面到底运行了哪些代码
源码:
var fry_language_type="{$Think.session.fry_language_type}";
网页源代码:
var fry_language_type="fry_language_en";
5、百度echart图表的toolbox和legend重叠问题?
设置 位置
toolbox:工具箱,每个图表最多仅有一个工具箱。(也就是样例中几个工具图标)
legend:图例,每个图表最多仅有一个图例。(也就是样例中的最顶端的第几组 第几组的那个)
最后效果:
对应代码:
1 option = { 2 toolbox: { 3 x:'center', 4 y:'bottom', 5 feature: { 6 dataView: {show: true, readOnly: false}, 7 magicType: {show: true, type: ['line', 'bar']}, 8 restore: {show: true,title:'restore'}, 9 saveAsImage: {show: true} 10 } 11 }, 12 }
主要是第3行第4行代码的作用
对应的参考手册的位置:ECharts · Doc
http://echarts.baidu.com/echarts2/doc/doc.html
因为这些部分都是可以设置位置的,所以设置一下位置就OK了。
6、thinkphp中配置文件如何使用?
config 助手函数
加载配置文件:
$fry_config=Config::load(APP_PATH.'fry_config.php'); dump($fry_config);die;
APP_PATH对应的路径为:define('APP_PATH', __DIR__ . '/../application/');
完全不用这样麻烦,
读取配置和修改配置如下:
echo config('配置参数1');
config('配置参数','配置值');
我们自己写的配置文件也会被系统默认读取:
$fry_config=Config::load(APP_PATH.'fry_config.php');
这样读取的配置不仅包括fry_config.php里面的,还包括系统默认自带的config.php里面的
7、什么情况下用数据库做配置字段,什么情况下用配置文件做配置?
配置文件 开发人员 重置
数据库 非开发人员 重启
配置文件做配置的特点:方便开发人员修改配置,服务器重启的话配置重置。
数据库做配置的特点:方便非开发人员修改配置,服务器重启的话配置不会受到影响。
8、php数据类型装换?
目标类型 转换函数
PHP的数据类型转换属于强制转换,允许转换的PHP数据类型有:
- (int)、(integer):转换成整形
- (float)、(double)、(real):转换成浮点型
- (string):转换成字符串
- (bool)、(boolean):转换成布尔类型
- (array):转换成数组
- (object):转换成对象
PHP数据类型有三种转换方式:
- 在要转换的变量之前加上用括号括起来的目标类型
- 使用3个具体类型的转换函数,intval()、floatval()、strval() 【记忆:想转换的目的类型+val()】
- 使用通用类型转换函数settype(mixed var,string type)
第一种转换方式: (int) (bool) (float) (string) (array) (object)
- <?php
- $num1=3.14;
- $num2=(int)$num1;
- var_dump($num1); //输出float(3.14)
- var_dump($num2); //输出int(3)
- ?>
第二种转换方式: intval() floatval() strval()
- <?php
- $str="123.9abc";
- $int=intval($str); //转换后数值:123
- $float=floatval($str); //转换后数值:123.9
- $str=strval($float); //转换后字符串:"123.9"
- ?>
第三种转换方式: settype();
- <?php
- $num4=12.8;
- $flg=settype($num4,"int");
- var_dump($flg); //输出bool(true)
- var_dump($num4); //输出int(12)
- ?>
9、数据库做更新操作时:“缺少更新条件”是哪种类型的错误?
主键
整表
update 那一行
a、没指明更新的主键
b、内容没有发生更新(这种情况不会报“缺少更新条件”的错误)
1 //是否允許不同小組之間互相查看 2 public function canDifGroupCheckAns(){ 3 if(request()->isAjax()){ 4 $state=input('state'); 5 $fry_database_config=db('1config')->select(); 6 7 if($state){ 8 $fry_database_config[0]['config_val']=strval(1); 9 }else{ 10 $fry_database_config[0]['config_val']=strval(2); 11 } 12 //die; 13 $ans=db('1config')->update($fry_database_config); 14 if($ans===false) return false; 15 return true; 16 } 17 }
这是整表更新,也就是多维数据,不能直接用update
如果用update的话,那就更新你修改了的那一行
$ans=db('1config')->update($fry_database_config[0]);
10、配置文件变量的特点是什么?
全局变量
配置文件应该要是全局变量,这点无论是从thinkphp的配置的特点和工作方面的需求都可以发现
所以数据库做配置的那部分,要给它整成全局的,用父级控制器base即可
二、内容在总结中