legend---六、php脚本变量的生命周期是怎样的
一、总结
一句话总结:应该是脚本结束变量的生命周期就完了
1、外部js找不到元素是怎么回事?
1 function myDailyTaskFinish() {
2 //alert('11'); 3 $(document).ready(function () { 4 alert($('#my_dayly_task_unfinished_content').length); 5 }); 6 7 } 8 myDailyTaskFinish();
a、方法未执行 myDailyTaskFinish();
8 myDailyTaskFinish();
b、给循环中的元素加了id 比如完成任务的button
c、在开头引入的js,但是没有声明文档加载完再执行 $(document).ready(function () {
2、页面的部分循环的时候,外部调js不是很方便,传递的参数获取不到怎么办?
1 /*每日任务完成*/
2 function myDailyTaskFinish() { 3 //alert('11'); 4 $(document).ready(function () { 5 //alert($('#my_dayly_task_unfinished_content > ul > li > section > dl > dt > span > button').length); 6 $('#my_dayly_task_unfinished_content > ul > li > section > dl > dt > span > button').click(function () { 7 $.post("task/finishDailyTask", { tdr_id: "John", td_id: "2pm", dailyTaskDate: "2pm" }, 8 function(data){ 9 alert("Data Loaded: " + data); 10 }); 11 alert('111'); 12 }); 13 }); 14 15 } 16 //myDailyTaskFinish();
1 <h2>每日任务(未完成)</h2> 2 <span class="am-list-news-more am-fr">更多 »</span> 3 </a> 4 </div> 5 6 <div class="am-list-news-bd" id="my_dayly_task_unfinished_content"> 7 <ul class="am-list"> 8 {volist name="dailyTaskData" id="vo"} 9 <?php if($vo['t_d_r_isfinish']=='1') continue; ?> 10 <li class="am-g am-list-item-dated"> 11 <section data-am-widget="accordion" style="background: #fff;margin: 0px;box-shadow: none;" class="am-accordion am-accordion-default" data-am-accordion='{ "multiple": true }' > 12 <dl class="am-accordion-item" > 13 <dt class="am-accordion-title my_ellipsis" style="padding-left:2px ;"> 14 <a class="am-list-item-hd " style="display:inline;"><span class="task_title">{$vo.t_day_name}</span></a> 15 <span class="am-list-date" style="float: right;margin-right: 0px;"><button class="task_finish" onclick="document.location='{:url(\'task/finishDailyTask\',array(\'tdr_id\'=>$vo.t_d_r_id,\'td_id\'=>$vo.t_d_r__id))}';event.stopPropagation();">完成任务</button></span> 16 <div class="am-cf"></div> 17 </dt>
3、为什么ajax可以传送数据给php(因为{})?
因为thinkphp的模板当中也是用{}来表示变量或者函数的
1 $.post("test.php", { name: "John", time: "2pm" },
2 function(data){ 3 alert("Data Loaded: " + data); 4 });
4、thinkphp区间查询如何实现?
区间查询是一种同一字段多个查询条件的简化写法,例如:
Db::table('think_user')
->where('name',['like','thinkphp%'],['like','%thinkphp']) ->where('id',['>',0],['<>',10],'or') ->find();
生成的SQL语句为:
SELECT * FROM `think_user` WHERE ( `name` LIKE 'thinkphp%' AND `name` LIKE '%thinkphp' ) AND ( `id` > 0 OR `id` <> 10 ) LIMIT 1
区间查询的查询条件必须使用数组定义方式,支持所有的查询表达式。
1 //1、获取n等级到m等级的什么类型的随机物品(多少数量的话我在外面多调用几次这个函数就好了)
2 public function getRandomGoods($n,$m,$type){ 3 //在这个函数里面找到等级,找到类型 4 //先连表,再选,就好了 5 $shopGoodss=db('shop_goods')->alias('sg')-> 6 order('sg_classifyid,sg_gradeid desc,sg_id asc')-> 7 join('shop_classify sc','sg.sg_classifyid=sc.sc_id','LEFT')-> 8 join('shop_grade sgr','sg.sg_gradeid=sgr.sgr_id','LEFT')-> 9 where('sgr_num',['>',$n-1],['<',$m+1])->select(); 10 dump($shopGoodss);die; 11 }
5、一组代码中的两个foreach循环变量重名会有莫名其妙的错误的(因为是指针)原因是什么?
1 //3、根据数据库里面的一条博客记录生成题目
2 public function createPerBlogQuestion($perBlogData){ 3 //dump($perBlogData);die; 4 $question=[]; 5 $content=htmlspecialchars_decode($perBlogData['b_content']); 6 $pattern='/<\/h2>(.*?)<h2>/us'; 7 preg_match_all($pattern, $content, $out); 8 $summary=$out[1][0]; 9 //去掉总结总多余的<p> </p> 10 $pattern='/<p> <\/p>|\n+|\s+/us'; 11 $summary=preg_replace($pattern,'', $summary); 12 //以<h3>和</h3>做分割,就能把这个拆成我们想要的那些段 13 $pattern='/<h3>|<\/h3>/us'; 14 $summaryArr=preg_split($pattern, $summary); 15 16 array_unshift($summaryArr,$perBlogData['b_title'].'?'); 17 foreach ($summaryArr as $key => &$val){ 18 if(!strlen($val)){ 19 $val=null; 20 } 21 } 22 23 $summaryArr = array_diff($summaryArr, [null]); 24 25 $summaryArr = array_values($summaryArr); 26 27 $question_stem=[]; 28 $question_ans=[]; 29 $first=true; 30 foreach ($summaryArr as $key1=>$val1){ 31 if($first){ 32 $question_stem[]=$val1; 33 $first=false; 34 }else{ 35 $a=$val1[0]; 36 if(is_numeric($a)){ 37 $question_stem[]=$val1; 38 }else{ 39 $question_ans[]=$val1; 40 } 41 } 42 } 43 44 dump($summaryArr);die; 45 46 }
6、get方式用?链接参数的错误是什么?
get方式连接的话前面是?接参数,后面参数之间是&符号,不是全是?号
写成全是问号就错了
在浏览器地址栏中输入某个URL地址或单击网页上的一个超链接时,浏览器发出的HTTP请求消息的请求方式为GET。如果网页中的<form>表单元素的method属性被设置为“GET”,浏览器提交这个FORM表单时生成的HTTP请求消息的请求方式也为GET。
使用GET请求方式给WEB服务器传递参数的格式:
http://www.it315.org/counter.jsp?name=zhangsan&password=123
使用GET方式传送的数据量一般限制在1KB以下。
7、在写模型方法的时候循环里面可能有错怎么处理?
循环里面可以忽略中间某个数据的问题,不然后面的就不执行了
比如第9行的return false不要就比较好,但是,小逻辑里面,要及时return false,避免语法错误。
前面对后面有影响,前面出错,return false;
前面对后面没有影响,每个都是独立的一条, 那就没必要 return false;
1 //2、做根据数据库里面的博客生成题目的操作,一段时间
2 public function createQuestion_interval($str_begin,$str_end){ 3 $commonFunctionModel=new CommonFunction(); 4 $beginDateTS=$commonFunctionModel->getDateTimeStamp_date($str_begin); 5 $endDateTS=$commonFunctionModel->getDateTimeStamp_date($str_end); 6 $perdayTS=24*60*60; 7 for($i=$beginDateTS;$i<=$endDateTS;$i+=$perdayTS){ 8 $ans=$this->createQuestion($i); 9 //if($ans===false) return false; 10 } 11 return true; 12 13 }
8、thinkphp的field排除字段如何实现?
字段排除
如果我希望获取排除数据表中的content
字段(文本字段的值非常耗内存)之外的所有字段值,我们就可以使用field方法的排除功能,例如下面的方式就可以实现所说的功能:
Db::table('think_user')->field('content',true)->select();
则表示获取除了content之外的所有字段,要排除更多的字段也可以:
Db::table('think_user')->field('user_id,content',true)->select(); //或者用 Db::table('think_user')->field(['user_id','content'],true)->select();
9、从数据表中随机抽取n条数据有哪几种方法(join实现可以先查数据然后再拼接)?
1 //3、一个完完全全随机的从题库中获取题目的函数
2 public function battle_entirely_random_question(){ 3 //可以先拼接数据,也可以后拼接数据,完全都ok的 4 $data=Db::query("SELECT * FROM lg_blog_question WHERE bq_id >= (((SELECT MAX(bq_id) FROM lg_blog_question)-(SELECT MIN(bq_id) FROM lg_blog_question)) * RAND() + (SELECT MIN(bq_id) FROM lg_blog_question)) LIMIT ?",[5]); 5 //dump($data);die; 6 if($data){ 7 shuffle($data); 8 if(isset($data[0])){ 9 $blogModle=new Blog(); 10 $blogData=$blogModle->getBlogDateById($data[0]['bq_b_id']); 11 if(!$blogData) return false; 12 $result=array_merge($data[0],$blogData); 13 dump($result);die; 14 //拼接 15 return $data[0]; 16 } 17 return false; 18 }else{ 19 return false; 20 } 21 }
10、如何实现答题正确和答题错误的post方式提交?
用隐藏域传答题正确或者答题错误的参数,如果正确的话,就把错误隐藏域设置为disabled,那么错误隐藏域就传递不过去数据,只有正确隐藏域能够传递过去数据
1 <!--隐藏域-->
2 <input type="hidden" name="questionNum" value="{$questionNum}"> 3 <input type="hidden" name="type" value="{$type}"> 4 <input id="answer_right" type="hidden" name="answer" value="right"> 5 <input id="answer_wrong" type="hidden" name="answer" value="wrong"> 6 <!--END 隐藏域-->
1 <script>
2 /************1、提交表单:正确或者错误方式*************/ 3 function submitForm(){ 4 $('#battle_submit_wrong').click(function () { 5 $('#answer_right').attr('disabled',true); 6 $('form').submit(); 7 }); 8 $('#battle_submit_right').click(function () { 9 $('#answer_wrong').attr('disabled',true); 10 $('form').submit(); 11 }); 12 } 13 submitForm(); 14 15 </script>
11、复杂控制器的业务逻辑是怎样的?
控制器再复杂的业务 逻辑,也就两块,申请业务逻辑和持续业务逻辑
这里是试题挑战:分为请求试题挑战 和 试题挑战页面下的下一题
1 //1、战斗主页
2 public function index(){ 3 /**************************1、向页面传递数据**************************/ 4 /**1、像页面分配任务分类数据**************************/ 5 $blogModel=new Blog(); 6 $blogCategorys=$blogModel->getBlogCategory(); 7 if($blogCategorys!==false) $this->assign('blogCategorys',$blogCategorys); 8 9 return view(); 10 } 11 12 //2、战斗的战斗页面,一题一题的来就好,根据传过来的参数选择题目 13 public function battle(){ 14 $modelBattle=new ModelBattle(); 15 16 /**************************1、处理战斗请求页面的逻辑**************************/ 17 $question=null; 18 $type=input('type'); 19 $questionNum=input('questionNum'); 20 if(!$questionNum) $questionNum=1; 21 else $questionNum++; 22 23 //dump($questionNum);die; 24 //1、随机战斗--完全随机战斗 25 if($type=='battle2_random'){ 26 //dump($type);die; 27 $question=$modelBattle->battle_entirely_random_question(); 28 29 }else if($type=='battle2_right'){ //2、随机战斗--根据对的次数随机战斗 30 $question=$modelBattle->battle_random_question(); 31 32 }else if($type=='today'){ 33 //取昨天的数据 34 dump($type);die; 35 } 36 else if($type=='yesterday'){ 37 dump($type);die; 38 } 39 else if($type=='2daybefore'){ 40 dump($type);die; 41 } 42 else if($type=='3daybefore'){ 43 dump($type);die; 44 } 45 else if($type=='date'){ 46 $date=input('date'); 47 dump($date);die; 48 } 49 //5、向页面分配数据 50 //dump($question);die; 51 if($question){ 52 $question['bq_answer']=htmlspecialchars_decode($question['bq_answer']); 53 $this->assign([ 54 'question'=>$question, 55 'questionNum'=>$questionNum, 56 'type'=>$type 57 ]); 58 }else{ 59 $this->error('没有试题数据!!!'); 60 } 61 62 63 64 /**************************2、处理具体战斗中的的逻辑**************************/ 65 if (request()->isPost()){ 66 //1、处理输入的数据 67 $dataIn=input('post.'); 68 $question=null; 69 $type=$dataIn['type']; 70 $questionNum=$dataIn['questionNum']+1; 71 72 //2、根据答题情况获取奖励 73 $muid=base64_decode(session('muid')); 74 $questionRewardModel=new QuestionReward(); 75 switch ($dataIn['answer']){ 76 case 'right': 77 if (intval($dataIn['bq_diff'])>99){ 78 $questionRewardModel->giveQuestionReward($muid,'right','blog',$dataIn['questionNum']); 79 }else{ 80 $questionRewardModel->giveQuestionReward($muid,'right','blog_question',$dataIn['questionNum']); 81 } 82 break; 83 case 'wrong': 84 if (intval($dataIn['bq_diff'])>99){ 85 $questionRewardModel->giveQuestionReward($muid,'wrong','blog',$dataIn['questionNum']); 86 }else{ 87 $questionRewardModel->giveQuestionReward($muid,'wrong','blog_question',$dataIn['questionNum']); 88 } 89 break; 90 } 91 //dump($dataIn);die; 92 93 //4、修改题目的作对做错情况,也就是做的次数情况 94 $mapID['bq_id']=['=',$dataIn['bq_id']]; 95 $ans_bq_times=db('blog_question')->where($mapID)->setInc('bq_times'); 96 if(!$ans_bq_times) $this->error('更新做题次数失败!!'); 97 switch ($dataIn['answer']){ 98 case 'right': 99 $ans_bq_right=db('blog_question')->where($mapID)->setInc('bq_right'); 100 if(!$ans_bq_right) $this->error('更新做题作对次数失败!!'); 101 break; 102 case 'wrong': 103 $ans_bq_wrong=db('blog_question')->where($mapID)->setInc('bq_wrong'); 104 if(!$ans_bq_wrong) $this->error('更新做题作错次数失败!!'); 105 break; 106 } 107 108 109 //3、处理提交上来的题目难度和博客分类 110 //3.1、处理提交上来的题目难度 111 $ans_bq_diff=db('blog_question')->where($mapID)->update(['bq_diff'=>$dataIn['bq_diff']]); 112 if($ans_bq_diff===false) $this->error('更新题目难度失败!!'); 113 //dump($question);die; 114 //3.2、处理提交上来的博客分类 115 $mapBlogID['b_id']=['=',$dataIn['b_id']]; 116 if(is_numeric($dataIn['b_c_id'])){ 117 $ans_b_c_id=db('blog')->where($mapBlogID)->update(['b_c_id'=>$dataIn['b_c_id']]); 118 if($ans_b_c_id===false) $this->error('更新博客分类失败!!'); 119 } 120 121 122 123 /****-----------------------------------------------------------------------****/ 124 //4、选择类型,根据类型向页面中返回题目 125 switch ($type){ 126 //可以判断是否已经做过,没做过的话就直接从数据库中取,做过的话就根据id取出做过的题目 127 case 'battle2_random': 128 $question=$modelBattle->battle_entirely_random_question(); 129 break; 130 case 'battle2_right': 131 $question=$modelBattle->battle_random_question(); 132 break; 133 } 134 135 //5、向页面分配数据 136 $this->assign([ 137 'question'=>$question, 138 'questionNum'=>$questionNum, 139 'type'=>$type 140 ]); 141 142 143 } 144 //dump($_POST);die; 145 146 147 /**************************3、向战斗页面分配数据**************************/ 148 //1、把博客分类数据传递到页面 149 $blogModel=new Blog(); 150 $blogCategorys=$blogModel->getBlogCategory(); 151 $this->assign('blogCategorys',$blogCategorys); 152 153 return view(); 154 }
12、如何知道当前做了多少个题?
用session肯定是可以的
用类的属性说不定也可以,
我采取的是把数据带到页面去,再从页面带回来,再带过去,以此重复,从而实现数据的持久
13、做题奖励数据怎么呈现到页面?
实现很简单,直接是把数据分配到页面就可以了
14、如何判断数组里面有没有值?
是用count(array)或者array.length来判断,而不是判断if(array)
就是要判断数组的长度
15、如何实现回到上一题?
把所有的访问过的题目都记忆在历史记录数组里面,所以就能够点击回到上一题
16、php脚本变量的注意事项是什么?
php中的脚本变量真的不好用,因为php一旦执行完全,里面的变量就被销毁了
17、抽奖界面如何将获奖物品的物品id传到后台?
用自定义属性获取物品id,用ajax将物品id传到后台
<div class="personal_goods_item" style="border-color:{$lottery_type1_low[$itemNum]['sgr_color']}; " goodsid="{$lottery_type1_low[$itemNum]['sg_id']}">
lottery.prezeGoodsId=$lottery.find(".lottery-unit-"+index).find(".personal_goods_item").attr('goodsid');
二、内容在总结中