新鸟初入PHP行业6个月总结心得
1.$_SERVER['HTTP_HOST']返回phpsdudy中设置的服务器地址:127.0.0.1 hml.367edu.cn
如果没有使用代理服务器,
REMOTE_ADDR = 客户端IP HTTP_X_FORWARDED_FOR = 没数值或不显示
$ip = $_SERVER['REMOTE_ADDR'];
2.file_get_contents(“test.txt”)读取的结果是一个字符串;
file(“test.txt”)读取的结果是一个数组;
3.print_r($arr,true)返回一个包含完整数组内容的字符串.
4.file_put_contents(‘’test.txt’’,$arr)可以将数据库的数据写入一个文件中,可以只访问一次数据库,减少数据库压力.
5.通过对比,lock in share mode适用于两张表存在业务关系时的一致性要求,for update适用于操作同一张表时的一致性要求。
共享锁(S):SELECT * FROM table_name WHERE ... LOCK IN SHARE MODE
排他锁(X):SELECT * FROM table_name WHERE ... FOR UPDATE
6.include dirname(__FILE__).'/../hello.php';和
dirname( dirname(__FILE__)).‘/hello.php'; 相同。
7.导出数据库所有表:选中数据库psd1710,右键选择转储SQL文件,选择结构和数据(保留字段fields).
导入数据库所有表:新建一个本地数据库psd1709,右键选择运行SQL文件.
8.音频:audio
<audio controls>
<source src="horse.ogg" type="audio/ogg">
<source src="horse.mp3" type="audio/mpeg">
您的浏览器不支持 audio 元素。
</audio>
9.find() 方法返回被选元素的后代元素。如:$("ul").find("span").css({"color":"red","border":"2px solid red"}); html部分:
<ul>ul (直接父节点)
<li>li (子节点)
<span>span (孙节点)</span>
</li>
</ul>
10.readonly:html只读,输入框无法更改
<input type="text" name="country" value="Norway" readonly>
11.连接数据库:
@1.mysqli方式
define('DB_HOST', "192.168.0.20");
define('DB_PORT', "3306");
define('DB_USER', "367edu");
define('DB_PASS', "123456");
define('DB_NAME', "367edu");
$link = mysqli_connect(DB_HOST, DB_USER, DB_PASS, DB_NAME, DB_PORT);
$sql = "select * from sc_student_query_category";
$result = mysqli_query($link, $sql);
$queryCategory = mysqli_fetch_all($result,MYSQLI_ASSOC);
- 数据库数据格式主要有几种:数字(int)(tinyint)(decimal【适合于金额如decimal(10,2)】) 字符串(varchar)(char)(text)(LONGTEXT)等 时间(TIMESTAMP)一般使用int
- $(‘.class’).attr(属性,值)可以动态改变元素的属性的值,如下:
$(".shang_payimg img").attr("src","https://static.runoob.com/images/dashang/"+dataid+"img.png");
14、$(“#id”).text(值)可以动态改变元素内的值,如下:$("#shang_pay_txt").text(dataid=="alipay"?"支付宝":"微信");
15.跳转到顶部或者尾部:<
a href="#pos" style="color: red;font-size: 50px;
position: relative; left: 600px;">↓↓↓↓跳到底部↓↓↓↓</a>
<div style="height: 8000px;"></div>
<p id="pos"></p>
- HTTP状态码:
1xx:信息类
2xx:成功类
3xx:重定向类
4xx:客户端错误类
5xx:服务端错误类
- 由URL地址去找控制器,先找到后台,然后在去找前台页面. 如:
http://9469.367edu.com/?a=wap.article&uid=9469&id=179575先找后台,再去找前台. 没有前台则不会显示任何东西.
18.按照条件遍历整个表:
//主页视频加载
require_once $_SITE_PATH_."m/m_lib_users_media.php";
$m_lib_users_media = new m_lib_users_media();
$media = $m_lib_users_media->getArray($m_lib_users_media->startGet()->getByusers_id($__users_id__)->getByis_del(0)->setOrder('id desc')->limit(1)->query());
importDbModel("sc_wx_rule_app_users");
$m_sc_wx_rule_app_users = new m_sc_wx_rule_app_users($__users_id__);
$app_list = $m_sc_wx_rule_app_users->getPcAppList();
18.01增加数据
require_once str_replace('ucenter','default',$_SITE_PATH_)."m/m_oa_notice_record.php";
$m_oa_notice_record =new m_oa_notice_record();
$_data = array(
'users_id' => $__users_id__,
'notice_id' => $vals_id,
'teacher_id' => $tea_id,
'create_date' => time()
);
$result_row = $m_oa_notice_record->save($_data)->query();
模型中操作数据库
public function getResourceListzl(){
$this->_ssql = "select r.id,r.mycolor,st.id as teacher_id, r.title, r.status, r.category_id, r.reback_content, r.publish, r.create_date, st.name as teacher_name, ss.title as subject_title, category.title as category_title from $this->source r left join sc_teacher st on st.id=r.teacher_id left join sc_subject ss on ss.id=r.subject_id left join resource_category category on category.id=r.category_id where $where order by create_date desc LIMIT $offset, $obj->size";
$list = $this->getArray($this->query());
}
或者
$apply_list = $this->model->table("ls_property_apply", "apply")
->join("ls_property", "prop", "inner")->on("apply.prop_id=prop.id AND prop.is_del=0")
->join("ls_property_category", "cate", "inner")->on("prop.cate_id=cate.id AND cate.is_del=0")
->join("sc_teacher", "st", "inner")->on("apply.apply_teacher_id=st.id AND st.is_del=0")
->join("sc_teacher", "sst", "left")->on("apply.mg_teacher_id=sst.id AND sst.is_del=0")
->where($where_str, $parameter)
->order("apply.apply_time desc, apply.id desc")
->limit($offset, $size)
->findAll("apply.*, cate.title AS cate_title, prop.pnumber, prop.title AS prop_title, prop.company, prop.speci, st.name AS apply_teacher_name, sst.name AS mg_teacher_name");
$supplement_list = $this->model->table('oa_supplement_attend','attend')
->join("sc_teacher", "st", "left")->on('attend.teacher_id=st.id')
->where("attend.users_id = $__users_id__ and attend.is_del=0")
->order(' (case when attend.status=0 then 1 when attend.status=1 then 2 else 3 end),attend.create_date desc')
->findAll('st.name,attend.*');
return $supplement_list;
增加数据库记录
$descriptionObj = new stdClass();
$descriptionObj->articles_id = $articlesInfo->id;
$descriptionObj->content = trim($articleContent);
$descriptionInfo = $m_articles_description->saveExpend($descriptionObj);
- 轮播图不起作用的时候是因为jQuery 加载了两次,而且jQuery 只能加载于所有JS之前.
19.微网导航小图标加载带的CSS是:
<link rel="stylesheet" type="text/css" href="/sites/default/static/wap/css/font-awesome.css" media="all" /> web_3g_menu{数据库}如果该线上数据库中没有小图标字段,则不会显示.
- 账号:
东江广雅学校:ID:9479 账号:djgyxx 密码:djgyxx163
绵阳东辰教育集团有限公司:ID:9470 账号:mydcjyjt 密码:mydcjyjt163
- 数据采集如果走到了没有文章列表,肯定是本分类下文字列表头尾的标签没有写对.
//获取当前页面分类下的所有文章地址
$set_article_url_start = '<script language="javascript" src=';
$set_article_url_end = '<div align="center">';
$article_url = $Reptile->stringIntercept($typeweb,$set_article_url_start,$set_article_url_end);
- 数据采集如果没有页码,那么写成:
for($i=1; $i<=$value['web_page_number']; $i++){ //1
$typeurl = $config['typeurl'].$value['webId'].'.htm';
// var_dump($typeurl);exit;
如果网址上有页码则写成:
for($i=1; $i<=$value['web_page_number']; $i++){ //1
$typeurl = $config['typeurl'].$value['webId'].$i.'.htm';
// var_dump($typeurl);exit;
- FTP传东西时,必须两个都传,否则出现部分电脑网站样式显示不全.
23.如果没有列表数据说明:a标签的href属性有可能是单引号。
preg_match_all('/<a(.*?)href=\'(.*?)\'(.*?)>(.*?)<\/a>/i', $article_url,$article_url_arr);
24.下拉选框提交的值是value的值,如1或者2,不是显示的值class.如:
<select name="hml">
<option value="1">class</option>
<option value="2">555</option>
</select>
- PHP防止中文乱码:
header("Content-type: text/html; charset=utf-8");
26,获取当前网址,后面的参数可以手动添加:
$_SERVER['SERVER_NAME'].$_SERVER["REQUEST_URI"]
27.一个页面跳转到另一个页面的tab切换上时,按如下方法加:
- html
<a href="B.html#skip">
B.html
<div id="skip">B</div>该id应该加在tab上,而不是跳转的内容上
28.视频在iframe中播放https://blog.csdn.net/beyond__devil/article/details/52267077
优酷视频(只能全屏播放):
视频地址:http://v.youku.com/v_show/id_XNzExOTkwMjA0.html
视频ID:XNzExOTkwMjA0
嵌入地址:http://player.youku.com/embed/XODY3NDMzNjY4
复制通用代码
<iframe width="100%%" height="100%" frameborder="0" src="http://player.youku.com/embed/XODY3NDMzNjY4" allowfullscreen=""></iframe>
腾讯视频(微信里可以页面播放但不能全屏):
视频地址:http://v.qq.com/cover/k/khyb6moudi5fha4.html?vid=d0015bg8v6k
视频ID:d0015bg8v6k
嵌入地址:http://v.qq.com/iframe/player.html?vid=d0015bg8v6k&tiny=0&auto=0
其它参数:auto=0 不自动播放,去掉 auto=0则会自动放
复制通用代码
<iframe width="100%" height="100%" frameborder=0 src="http://v.qq.com/iframe/player.html?vid=d0015bg8v6k&tiny=0&auto=0" allowfullscreen=""></iframe>
29.小图标如果失去图标,可以使用代替的就代替,小图标一律使用的是css控制.如:<link rel="stylesheet" type="text/css" href="/sites/default/web/tpl/9470/css/zui.lite.css">
- ping +网址 找到服务器地址
31.http://119.29.37.67/?a=web.articles&uid=9327&id=13209佛山南海技师百度商桥代码:<
script>
var _hmt = _hmt || [];
(function() {
var hm = document.createElement("script");
hm.src = "https://hm.baidu.com/hm.js?d377926fdd203cffe45d46627493914e";
var s = document.getElementsByTagName("script")[0];
s.parentNode.insertBefore(hm, s);
})();
//统计代码
$(function(){
$("[name='search']").click(function(){
var keywords = $("[name=keyword]").val();
if(keywords == ''){
alert('搜索内容不能为空!');
return false;
}
window.location.href = '/?a=web.search&uid=9327&keywords='+keywords;
});
$('input[name="keyword"]').keyup(function(evt){
if (evt.keyCode == 13) {
var keywords = $('input[name=keyword]').val();
window.location.href = '/?a=web.search&uid=9327&keywords='+keywords;
}
});
});
</script>
32.动态加载左边栏js:
(function(){
var url = self.location.href;
/* var n = url.split("=").pop();
console.log(n);
if( !n ){ n=0 };*/
try {
$('#cont-ifr').attr('src', arr[0].list[0].src);
var str = '<h4><i class="+ arr[0].icon +"></i>'+ arr[0].title +'</h4>'+
'<ul class="p-list">';
for(var i=0;i<arr[0].list.length;i++){
var active = i==0?'class="active"':'';
str += '<li><a href="'+ arr[0].list[i].src +'" target="ifr" '+active+ '>'+ arr[0].list[i].name +'</a></li>'
}
str += '</ul>';
$(".cont-left").html(str);
console.log(str);
} catch (e) {
return false;
}
})();
33. html是替换,而append是追加
例如 <div id="div1">内容</div>
$(#div1").html("<div>这是内容</div>");
这样的最终结果就是 <div>这是内容</div> //也就是把原来的内容替换了
$(#div1").append("<div>这是内容</div>");
这样的最终结果就是 <div id="div1">内容</div><div>这是内容</div>
34.申明一个二维的空数组:
$in = array('roomid'=>array(''));
- 调试接口里面的数据是在network里面查看XHR里面
- attr("width","500");
- css({"background-color":"yellow","font-size":"200%"})
- <td><input type="checkbox" value="<?php echo $node->id;?>"></td>
- 选中所有多选框:
- $(":checkbox[name='ids']"),选中所有多选框$(":checkbox[name='ids']").prop("checked", this.checked); // this指代的你当前选择的这个元素的JS对象
39.选中所有ul下的li下的a标签:$('.cont-left .p-list').find("a")
40,腾讯云图片上传:
importClass('tencent_image');
$tencentImageClass = new tencentImage(); //云图上传
$yun_url = $tencentImageClass->upload($savePath, $__users_id__);
41.接口的正确写法:
$uploadPath = $_ROOT_PATH_."/cache/img/".$__users_id__.'/oa/';
$fname = basename($_FILES['file']['name']);
$f = explode(".", $fname);
$extname = strtolower($f[count($f)-1]);
$rand = rand(1000, 9999);
$fileName = substr(time(),5).$rand.".$extname";
$folder = date("Y-m-d");
$src = $folder."/$fileName";
$savePath = $uploadPath.$src;
importClass('tencent_image');
$tencent_image = new tencentImage();
$result = $tencent_image->upload($savePath,$__users_id__);//上传到腾讯云的图片
$obj = new stdClass();
if($result){
$obj->type = "success";
$obj->msg = "上传成功到云中";
$obj->url = $result;
}else{
$obj->type = "fail";
$obj->msg = "上传失败";
}
echo json_encode($obj);
exit;
父类中寻找后代元素:
42.$("#usersInfoForm").find("button[type='submit']").bind('click', function(){code...}
- 排除干扰CSS, 应该注释一些css,找到精确文件
44.unlink($savePath); //删除图片
rmdir($oldSavePath); //删除前一天的目录
45. shell上的定时任务,每分钟执行一次下面的PHP文件, 分时日月周
*/1 * * * * php /wwwroot/367edu.com/services/view_task.php
46.$.post('/ucenter.php?a=common.issentImg',{imgUrl:img}, function(data){
var rs = jQuery.parseJSON(data);
if(rs.type=='error'){
bootbox.alert(rs.msg);
}else{
$("#block").show();
}
});
- 根据某个分组的和的大小排序: order by field(sgi.teacher_id,16696,17181,15429,17202)
select sgi.rtime,sgi.integral,sgi.content,st.name,stg.title from sc_teacher_growing_record sgi join sc_teacher_growing_type stg on sgi.type_id=stg.id join sc_teacher st on st.id=sgi.teacher_id where sgi.users_id=9126 and sgi.is_del=0 and sgi.status=1 and sgi.teacher_id in (16696,17181,15429,17202) order by field(sgi.teacher_id,16696,17181,15429,17202), st.name asc,sgi.status asc,sgi.create_date desc;
48.trigger("click")自动执行一次点击事件
$("#QR_code").on("click",function () {
document.getElementById('vcode').src = '/?a=code&t='+Math.random();
})
$("#QR_code").trigger("click");//自动执行一次点击事件,即刷新该验证码
49
如果$_POST没有打印出值,肯定是名字相同造成的.微工具中的表单项不能使用重名的text.
50.新建文件夹,点击右键SVN导出.填地址和账号.
51. 给下拉选框设定高度的方法:
<select onmousedown="if(this.options.length>3){this.size=4}" onblur="this.size=0" onchange="this.size=0" >
52
当css的下拉选框中的内容显示不全时,应该找style="overflow:hidden/auto",当前级找不到时,找父元素,一直找到为止.万丰项目
53,定时任务发送 的消息存在sc_wxsms_quene sc_wxsms
中,或从这里拿消息.
54.万丰小学移动端制度审核->ajax:
$(document).on("click",'.heBtn1',function () {
var data_id = $(".h_id").attr('data-id');
$.ajax({
type: 'post',
url: globals.ajax_save_detail,
data: {data_id : data_id},
dataType: 'html',
success: function(data){
// callback(null,data);
// $.hideLoading();
},
error: function(xhr, type){
$.alert('请求失败!')
}
});
})
55.刷新当前页面:location.reload();
- 使用strpos时,两个参数都必须是字符串,否则函数将不运行.
- 按回车刷新当前页面函数:
$(document).on("keydown",function(e){
if(e.keyCode == 13){
window.location.reload();
}
})
- ajax常规写法:
$.ajax({
type: 'POST',
url: '/ucenter.php?a=systemSettings.ajax_changeFunction',
data: {module_ids:ids,teacher_id:<?php echo $__teacher_id__;?>,action:'add'},
success:function (result) {
var rs = jQuery.parseJSON(result);
bootbox.alert(rs.msg,function () {
window.location.reload();
});
// 按enter键时也刷新页面
$(document).on("keydown",function(e){
if(e.keyCode == 13){
window.location.reload();
}
})
}
});
- 更改数组中的某个值,并且以某个值排序:
function a($value){
if(is_string($value['create_date'])){
$value['create_date'] = strtotime($value['create_date']);
}
return $value;
}
$h_oa_inform = array_map('a',$h_oa_inform);
array_multisort(array_column($h_oa_inform,'create_date'),SORT_DESC,$h_oa_inform);
- 使用group_concat()和group by显示相同名字的人的id号:
- 采集文章开头标签一定要严格去写,尾部可以随便写:错误示例如下:
$categoryStart = '<div id="vsb_content';
造成文章内容在开头位置都带上了”>
- 如果一个变量为空,则有以下几种可能,空字符串,空数组,空对象,null,false,0以及”0”等.
$a = 0;
$b = '';
$c = array();
$d = null;
$e =FALSE;
$f = (object)null;全部返回空
- 直接给出(获得)一个遮罩层:
<style type="text/css">
#loading {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(0, 0, 0, 0.5);
z-index: 15000;
}
#loading div {
position: absolute;
top: 35%;
left: 45%;
width: 80px;
height: 80px;
margin-top: -15px;
margin-left: -15px;
}
</style>
<div id="loading">
<div style="width: 206px;height: 125px;border-radius: 6px;">
<div>设置成功!</div>
<div style="margin-top: 25px;margin-left: -83px;"><button style="width: 185px;color: white;" onclick="window.history.back(-1)" >返回</button></div>
</div>
</div>
- strtotime可以将中文日期如:2018-9-20转化为时间戳,还可以将英文日期字符转化为时间戳如:strtotime("-6 day")
- 按中文名字进行排序:ORDER BY CONVERT (NAME USING gbk) ASC
- 在本页面的现有表内进行搜索:(万丰小学通讯录移动端)
$('#search_user').submit(function() {
var keywords = $('#search_input').val();//搜索框的值
$(".con-l").find("li").hide();//隐藏所有列表
$(".con-l").find("li").each(function(i,th) {
var un = $(th).find("b").text();//单个li的值
if( un.toString().indexOf(keywords) >= 0 ) { //搜索的值第一次出现在
li中的位置如果大于0,说明搜出来了
$(th).show();//搜出来的列表展示出来
}
});
return false;
});
- a标签中添加相应属性可以在移动端打电话发短信:
<a href="tel:10086">10086</a> //点击后直接拨打10086
<a href="sms:10086?body=message_body">给 10086 发短信</a>//点击后直接给10086发信息,消息内容默认为message_body
- 点击a标签直接下载图片:(电脑端)
<a href="img/WC.png" download="WC.png">
- ios使用如下方法获得NaN,安卓手机则是正常计算,解决方法是换个这个时间的格式 new Date("2017-04-28 23:59:59").getTime() 1 换成如下方式就正常了,就是‘-’换成‘/’ new Date("2017/04/28 23:59:59").getTime()
增加树状组织架构图:万丰二期校历管理->新增活动中.重点是不能在弹出框中再加一个弹出层,要在网页中弹出一个,只能是弹出一个单层.
<div class="form-group">
<label class="col-sm-3 control-label" style="float: left; line-height: 40px;"> <b>*</b>查看权限</label>
<div class="col-sm-8" style="margin-left:10px; padding-left:0; padding-top: 10px;">
<button class="btn btn-default chooseTeacher" type="button"><span class="fileinput-new">选择教师</span></button>
<button class="btn btn-default clearTeacher" type="button"><span class="fileinput-new">重置教师</span></button>
</div>
<div class="alert alert-primary with-icon container" style="padding-left: 0">
<i class="icon-user"></i>
<div class="content">
<h4>教师:</h4>
<hr />
<ul id="teacherIDS">
<?php echo $teacher_str;?>
</ul>
</div>
</div>
<div class="clear"></div>
</div>
<script>
$('.chooseTeacher').structureAndPerson({person:'teacher',structure:'group,structure'}).backFunc(function(c, dom){
console.log(c);
showName(c);
});
//切换清空
$('.clearTeacher').on('click',function(){
$("#teacherIDS").find("li").remove();
$(".container").css("display","none");
});
//移除
$("#teacherIDS").on("click", ".removeItemButton", function(){
var li_count = $(this).parent().parent().parent().find("li").length;
if(li_count <= 1) {
$(this).parents(".container").css("display","none");
}
$(this).parent().parent().remove();
});
var showName = function(ids){
var html_str = '';
$.each(ids, function(i, o){
if( $("#teacherIDS").find('li[data-id="'+o.teacher_id+'"]').length == 0){
html_str += '<li style="display: inline;" data-id="'+o.teacher_id+'"><input type="hidden" name="teacher_ids[]" value="'+o.teacher_id+'"/><input type="hidden" name="teacher_names[]" value="'+o.teacher_name+'"/><span class="label label-badge">'+o.teacher_name+' <a href="javascript:void(0);" class="removeItemButton"><img src="/sites/default/static/images/cancel.png" width="26px" alt="取消" /></a></span></li>';
}
});
$("#teacherIDS").parent().parent().css("display","table");
$("#teacherIDS").append(html_str);
}
</script>
位置跳转:利用a标签的跳转特性<title>位置跳转</title>
<meta charset="UTF-8">
<div id="top"></div>
<a href="javascript:void(0);">点我没有反应的!</a>
<a href="#pos" style="color: red;font-size: 50px;position: relative; left: 600px;">↓↓↓↓跳到底部↓↓↓↓</a>
<div style="height: 8000px;"></div>
<p id="pos"></p>
<div><a href="#top" style="color: red;font-size: 50px;position: relative; left: 800px;">↑↑↑跳到顶部↑↑↑</a></div>
72.当变量为以下几种类型时,返回的就是空;
$a = 0;
$b = '';
$c = array();
$d = null;
$e =FALSE;
if (empty($a)) echo '$a 为空' . "<hr>";
if (empty($b)) echo '$b 为空' . "<hr>";
if (empty($c)) echo '$c 为空' . "<hr>";
if (empty($d)) echo '$d 为空' . "<hr>";
if (empty($e)) echo '$e 为空' . "<hr>";
73.一个神奇的获取中文字符的英文首字母的方法:(用于手机通讯录排序)
$str = "李刚";
echo getFirstCharter($str);//输出L
function getFirstCharter($str){
if(empty($str)){return '';}
$fchar=ord($str{0});
if($fchar>=ord('A')&&$fchar<=ord('z')) return strtoupper($str{0});
$s1=iconv('UTF-8','gbk',$str);
$s2=iconv('gbk','UTF-8',$s1);
$s=$s2==$str?$s1:$str;
$asc=ord($s{0})*256+ord($s{1})-65536;
if($asc>=-20319&&$asc<=-20284) return 'A';
if($asc>=-20283&&$asc<=-19776) return 'B';
if($asc>=-19775&&$asc<=-19219) return 'C';
if($asc>=-19218&&$asc<=-18711) return 'D';
if($asc>=-18710&&$asc<=-18527) return 'E';
if($asc>=-18526&&$asc<=-18240) return 'F';
if($asc>=-18239&&$asc<=-17923) return 'G';
if($asc>=-17922&&$asc<=-17418) return 'H';
if($asc>=-17417&&$asc<=-16475) return 'J';
if($asc>=-16474&&$asc<=-16213) return 'K';
if($asc>=-16212&&$asc<=-15641) return 'L';
if($asc>=-15640&&$asc<=-15166) return 'M';
if($asc>=-15165&&$asc<=-14923) return 'N';
if($asc>=-14922&&$asc<=-14915) return 'O';
if($asc>=-14914&&$asc<=-14631) return 'P';
if($asc>=-14630&&$asc<=-14150) return 'Q';
if($asc>=-14149&&$asc<=-14091) return 'R';
if($asc>=-14090&&$asc<=-13319) return 'S';
if($asc>=-13318&&$asc<=-12839) return 'T';
if($asc>=-12838&&$asc<=-12557) return 'W';
if($asc>=-12556&&$asc<=-11848) return 'X';
if($asc>=-11847&&$asc<=-11056) return 'Y';
if($asc>=-11055&&$asc<=-10247) return 'Z';
return '#';
}
//$allteacher 为一个二维数组
foreach($allteacher as $v){
$firstChar = getFirstCharter($v->name);//获取中文名字的首字母
$teacher_list[$firstChar][] = $v;
}
//以键值升序
ksort($teacher_list);
if(isset($teacher_list['#'])){
$jin = $teacher_list['#'];
unset($teacher_list['#']);
$teacher_list['#'] = $jin;
}
- 设置文字纵向居中的方法:line-height: 30px;vertical-align:middle,top,bottom
选取带有 type="submit" 的 <input> 和 <button> 元素:
$(":submit")
- 获取树形数组:(应用于导航,目录结构中)
/**
* 数组转化为多级树形结构
* @param array $list 需要转换的数组
* @param type $pk 主键id名
* @param type $pid 父级id名
* @param type $child 父级下子集的数组键名
* @param type $root 根级的pid的值
* @return type
*/
function list_to_tree($list, $pk = 'id', $pid = 'pid', $child = 'children', $root = 0) {
// 创建Tree
$tree = array();
if (is_array($list)) {
// 创建基于主键的数组引用
$refer = array();
foreach ($list as $key => $data) {
$refer[$data[$pk]] = & $list[$key];
}
foreach ($list as $key => $data) {
// 判断是否存在parent
$parentId = $data[$pid];
if ($root == $parentId) {
$tree[] = & $list[$key];
} else {
if (isset($refer[$parentId])) {
$parent = & $refer[$parentId];
$parent[$child][] = & $list[$key];
}
}
}
}
return $tree;
}
77在mysql中UNIX_TIMESTAMP可以将日期转化成时间戳
如:SELECT UNIX_TIMESTAMP("2016-07-11") 结果:-- 1468166400
order by UNIX_TIMESTAMP(update_date) desc;
78.FROM_UNIXTIME:表示把UNIX_TIMESTAMP还原成标准的时间格式
如:SELECT FROM_UNIXTIME(1468166400),FROM_UNIXTIME(1468771199)
结果:2016-07-11 00:00:00 2016-07-17 23:59:59
- FIND_IN_SET('35', sorder)对字段sorder进行搜索,前提是sorder字段必须是带逗号的字符串,其中35在里面.如:WHERE users_id = '9126' AND FIND_IN_SET('35', sorder)
- 按照要求排序,order by field(字段,字符串)
- 心知天气代码:(网址:https://www.seniverse.com/widget/get)
order by field(字段,值1,值2,值3)会自动按照值1,值2,值3进行排序,值1,值2,值3可以是一个字符串
ORDER BY
field(
sgi.teacher_id,
16696,
17181,
15429,
17202
),
<script>(function(T,h,i,n,k,P,a,g,e){g=function(){P=h.createElement(i);a=h.getElementsByTagName(i)[0];P.src=k;P.charset="utf-8";P.async=1;a.parentNode.insertBefore(P,a)};T["ThinkPageWeatherWidgetObject"]=n;T[n]||(T[n]=function(){(T[n].q=T[n].q||[]).push(arguments)});T[n].l=+new Date();if(T.attachEvent){T.attachEvent("onload",g)}else{T.addEventListener("load",g,false)}}(window,document,"script","tpwidget","//widget.seniverse.com/widget/chameleon.js"))</script>
<script>tpwidget("init", {
"flavor": "bubble",
"location": "WS10730EM8EV",
"geolocation": "disabled",
"position": "top-left",
"margin": "100px 100px",
"language": "zh-chs",
"unit": "c",
"theme": "chameleon",
"uid": "UCB1C36ED3",
"hash": "e440349d238d707c1d8f58f79ce7a61d"
});
tpwidget("show");
</script>
82.
a href="javascript:history.go(-1);" onclick="history.go(-1)"效果相同
83.
在form表单提交前,验证表单的输入项是否正确.可以在提交按钮或者form上绑定一个点击事件:onclick="return check(this.form)" 也可以绑定一个onsubmit()事件,如在form上:onsubmit="return check(this.form)" 请注意一定要带上return,否则即使验证失败也会提交的.
function check(form){
var startday=$("#gettime").val();
var endday=$("#getetime").val();
if(endday<startday){
alert("结束日期不能小于开始日期");
return false;
}
}
- 使用strpos时有一个大坑,判断位置时必须使用!== 或者=== ,否则将会误判.
$a = 'How are you?';
if (strpos($a, 'are') !== false) {
echo 'true';
} else {
echo 'false';
}
- 快速排除错误的方法是:使用全局搜索某个变量或者文件名,改 一点东西看是否有反应,有的话就定位在这个文件中,否则就返回,尝试下一个文件继续排查.
86.以下表示时间的两种方法是一致的:
date_default_timezone_set('prc');
$a = time()+3600*24*60;//表示两个月后的时间
echo date('Y-m-d H:i:s',$a);
echo date('Y年m-d',strtotime('+60 day'));
- parseInt将字符串解析成数字.如:parseInt("10")得数字10.
- 一个悬而未决的问题:请求ajax报404 未找到,说明请求的url是错误的 .就是这个URL错误所以导致未找到.看一下这里报的什么错.
- 迅速定位错误:先进行全局搜索,找到这个文件,然后再看其他文件引用这个文件.在 引用这个文件前截断它,如果有影响就说明是这个文件造成的.
- select选择器:选中下拉选框中选中的按钮的值
var $select_id = $('.h_select').find("option:selected").val();
var $select_text = $('.h_select').find("option:selected").text();
- 选中多选框checkbox所有被选中的元素:
var $check_length = $('input:checkbox[name="item_id[]"]:checked').length;
$("#editWxMenuForm").find("input[type='submit']").bind('click', function(){...}//选中提交按钮
91.input和change事件的不同之处:oninput 事件在用户输入时触发,它是在元素值发生变化时立即触发,适合于电脑端使用;change事件在输入框内容变化的时候不会触发change,当鼠标在其他地方点一下才会触发,适合于微信端使用;
$('.h_select').on('input||change',function(){}
- htmlspecialchars_decode将HTML实例转化为正常的字符.如将"转成引号”.
- On和bind方法的区别:
$(".child").bind("click",function () {//bind只是纯粹的绑定
$(".content1").on("click",".child",function () {//on绑定针对有多个相同的儿子,且第二个参数为儿子的class名或id名
- 点击增加相同选项时,可以如下写:
var trlength = $('#addInputs').find("tr").length;
var checkInputs = true, mess = '';
var inputs_json = '[';
$('#addInputs').find("tr").each(function(i){//获取tr,循环他,分别获取td的值
var input_label = $(this).find('[name=input_label]').val();
var input_field = $(this).find('[name=input_field]').val();
var input_type = $(this).find('[name=input_type]').val();
var input_values = $(this).find('[name=input_values]').val();
var input_must = $(this).find('[name=input_must]:checked').val()==undefined ? 0 : 1;
var input_sort = $(this).find('[name=input_sort]').val();
if( input_label == '' || input_field == '' || input_type == '' || input_sort == '' ) {
checkInputs = false;
mess = '请填写完整的输入项';
return false;//如果没有填入值,截断它
}
注意json的格式为:JSON 数据的书写格式是:名称/值对,必须保持都要双引号.{‘field’:’value’}
inputs_json += '{"input_label":"'+input_label+'","input_field":"'+input_field+'","input_type":"'+input_type+'","input_values":"'+input_values+'","input_must":"'+input_must+'","input_sort":"'+input_sort+'"}';
if( i < trlength-1 ) inputs_json += ',';//i代表的是tr的个数,当其个数小于现有个数时,则串联他
});
if( !checkInputs ){//如果为假
art.dialog.alert(mess);//
return false;
}
inputs_json += ']';
94. 网页可能暂时无法连接,或者它已永久性地移动到了新网址de 解决方法:重置本地域名:如将hml.367edu.cn设置为hml.367edu.com
- 双三元运算符:先运算括号内的,如果没有括号,则自左到右运算.
isset($_GET['action']) ? in($_GET['action']) : (isset($_GET['ajax_action']) ? in($_GET['ajax_action']) : 'index');
echo $type == 1 ? "一" : $type == 2 ? "二" : $type == 3 ? "三" : "四";//输出三;
echo $type == 1 ? "一" : ($type == 2 ? "二" : ($type == 3 ? "三" : "四"));//输出二;
96.eq()方法遍历元素,索引从0开始;
$('.h_level i').eq($('.h_level i').length-1).remove()
- 表单可以进行计算,但是不能编辑可以增加这个属性:
readonly="readonly"
- 针对有多个相同的儿子,且class名相同的输入框的验证:
$("#container").on('input','.the_number',function() {//使用on事件的好处是:on绑定针对有多个相同的儿子,且第二个参数为儿子的class名或id名
var data = $(this).attr('data');//获取最大值
var val = $(this).val();//获取输入的值
if(+val > +data){//使用加号自动转成整型,防止出错.
$(this).val(data);
}
if(+val < 0){
$(this).val(0)
}
- 键盘按下同时绑定点击事件:
$(document).on("keydown",function(e){
if(e.keyCode == 13 ){
$("#formSubmitButton").click();
}
});
$("#formSubmitButton").bind('click', function(){code..})
- 定义一个二维数组:使用方法,
status_arr[+v.status]['name']
var status_arr = [
{
name:'待审批',
color:'block'
},
{
name:'审批通过',
color:'green'
},
{
name:'拒绝审批',
color:'red'
}
];
var type = v.type == 1 ? "基础数据" : "扩展数据";
var dis = (v.status == 1 || v.status == 2) ? "disabled" : "";
- 微信端搜索功能的实现:ajax加载
$('.html_btn99').click(function(){//点击搜索按钮
var obj = {};
obj.html_input98 = $('.html_input98').val();
obj.html_input99 = $('.html_input99').val();//内容
obj.html_select98 = $('.html_select98').val();//数据类型
obj.html_select99 = $('.html_select99').val();//状态
$.ajax({
type: 'post',
url: '/edu.php?a=teacher.search_info',
data: obj,
success: function (result) {
var suc =jQuery.parseJSON(result);
if(suc.msg != 'success'){
return;
}
var html="";
var page = '';
$.each(suc.data.list,function(k,v) {
var type = v.type == 1 ? "基础数据" : "扩展数据";
var dis = (v.status == 1 || v.status == 2) ? "disabled" : "";
var status_arr = [
{
name:'待审批',
color:'block'
},
{
name:'审批通过',
color:'green'
},
{
name:'拒绝审批',
color:'red'
}
];
// console.log(status_arr);
html +=
'<tr>' +
'<td>' + v.id + '</td>' +
'<td class="gName">' + v.name + '</td>' +
'<td style="width: 830px;">' + v.msg + '</td>' +
'<td>' + type + '</td>' +
'<td>'+status_arr[+v.status]['name']+'</td>' +
'<td>' +
'<button class="btn approval" ' + dis + ' data-status="1" data-action="/edu.php?a=teacher.save_teacher_update_task&id=' + v.id + '" >' +
'<i class="icon icon-edit"></i> 批准' +
'</button>' +
'<button ' + dis + ' data-status="2" data-action="/edu.php?a=teacher.save_teacher_update_task&id=' + v.id + '" class="btn class-btn refuse_supplement">' +
'<i class="icon icon-repeat"></i> 拒绝' +
'</button></td></tr>'
})
page += ' <div class="pager-class">'+
'<ul class="pager">'+
suc.page_htmls+
'</ul>'+
'</div>';
$("tbody").html(html);
$('.pager-class').html(page);
- Ajax select下拉框的请求:
$.ajax({
type:'post',
url:'edu.php?a=score.comment.ajax_change_grade',
data:{h_grade:h_grade},
success:function (result) {
var list = jQuery.parseJSON(result);
$('.h_class').html('<option value="0">请选择班级</option>');
for(var i = 0; i < list.data.length; i++){
$('.h_class').append("<option value='"+list.data[i].class_id+"'>"+list.data[i].title+"</option>");
}
return false;
}
})
- 在使用form表单的时候,清除action和method="post"这两个属性可以使用ajax来提交表单 <button type="submit" class="btn btn-primary saveInfo">保存</button>必须处在</form>之内
$('.saveInfo').click(function (e) {
e.preventDefault();//阻止元素发生默认的行为。
// var data = new FormData($('.form_')[0]);
var form = $('.form_').serializeArray();
$.ajax({
type:'post',
url:'oa.php?a=admin.booking.info&action=update_config',
data:form,
success:function (result) {....}
})
- 文件上传获取文件的参数 :
<form id= "uploadForm" method= "post" enctype ="multipart/form-data">
<input type ="file" name="myfile[]" id="file" multiple="multiple"/>
</form>
var formData = new FormData($( "#uploadForm" )[0]);
$("#file").change(function(){
var formData = new FormData($( "#uploadForm" )[0]);
此方法是专用获取图片的方法
console.log(formData);
$.ajax({
type:'post',
url:'/oa.php?a=wap.wfxx_upload_file',
data:formData,
contentType: false, // 注意这里应设为false
processData: false,
cache: false,
success:function () {
}
})
})
- 所有checkbox的name属性都是category[],为什么要这样设置?这样设置是因为我们将所有checkbox复选框作为一个组,在php服务器端可以使用$_POST['category']来获取所有被选中的复选框的值。
<li><input type ="checkbox" name ="category[]" value ="php">php教程</li>
<li><input type ="checkbox" name ="category[]" value ="java">java教程</li>
<li><input type ="checkbox" name ="category[]" value ="mysql">mysql教程</li>
<li><input type ="checkbox" name ="category[]" value ="html">html教程</li>
- 获取access_token
通过code获取access_token(在自己服务器端做)
https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
$rs_data = http_request_json($url);//curl函数获取网址里面的内容,返回json字符串,使用json_decode函数转换
$rs = json_decode($rs_data);
模板消息获取access_token接口
$url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid='.$this->appid.'&secret='.$this->appsecret;
$result = json_decode(file_get_contents($url));
$access_token = $result->access_token;
发送模板消息接口
$url = 'https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=' . $Access_token;
return $this->http_request_json($url, $msg);
$msg = '{
"touser":"' . $openid . '",openid是发送消息的基础,发送给谁
"template_id":"'.$userTemplateInfo->wxmsg_id.'",模板id
"topcolor":"#E02510",顶部颜色
"url":"' . $url . '", 点击跳转地址
"data":{
"first":{
"value":"设备报修",
"color":"#333333"
},
"keyword1":{
"value":"' . $vals->repair_ren . '",
"color":"#333333"
},
"keyword2":{
"value":"' . $vals->repair_xq . '",
"color":"#333333"
},
"keyword3":{
"value":"' . $vals->repair_lx . '",
"color":"#333333"
},
"keyword4":{
"value":"' . $vals->repair_dz . '",
"color":"#333333"
},
"keyword5":{
"value":"' .date('Y-m-d H:i',time()) . '",
"color":"#333333"
},
"remark":{
"value":"点击查看详情",
"color":"#333333"
}
}
}';
这个地址可以获取如下信息:{
"access_token":"ACCESS_TOKEN", 接口调用凭证
"expires_in":7200, 接口调用凭证超时时间,单位(秒)
"refresh_token":"REFRESH_TOKEN",用户刷新access_token
"openid":"OPENID", 授权用户唯一标识
"scope":"SCOPE", 用户授权的作用域,使用逗号(,)分隔
"unionid":"o6_bmasdasdsad6_2sgVt7hMZOPfL"只有在用户将公众号绑定到微信开放平台帐号后,才会出现该字段。
}
- 联图网二维码接口:<img src="http://qr.liantu.com/api.php?text=x"/>x 必须用UTF8编码格式,x内容出现 & 符号时,请用 %26 代替,
换行符使用 %0A. 如:x=http://baidu.com
<img src="http://qr.liantu.com/api.php?bg=f3f3f3&fg=ff0000&gc=222222&el=l&w=200&m=10&text=http://baidu.com"/>
107.图片上传后台处理程序:
<?php
$rs = new stdClass();
//print_r($_FILES);
if(!$_SESSION['jxht'][$__users_id__]['member_id']){
$rs->type = 'error';
$rs->msg = "操作错误,请重新刷新操作";
echo json_encode($rs);
exit;
}
set_time_limit(0);
$fname=basename($_FILES['hml']['name']);
$fsize = $_FILES['hml']['size'];
$f=explode(".",$fname);
if(count($f)<2){
$rs->type = 'error';
$rs->msg = "上传文件格式不正确!";
echo json_encode($rs);
exit;
}
$extname= strtolower($f[count($f)-1]);
$ext = array('doc', 'docx', 'wps', 'wpt', 'ppt', 'pptx', 'xls', 'xlsx', 'et', 'ett', 'pdf', 'mp3', 'mp4', 'zip', 'rar', 'jpg', 'gif', 'png', 'jpeg', 'bmp'); // 允许文件
if(!in_array($extname,$ext)){
$rs->type = 'error';
$rs->msg = "上传文件格式不正确!";
echo json_encode($rs);
exit;
}
if(in_array($extname,array("tpl","html","js","php","php3"))){
$rs->type = 'error';
$rs->msg = "上传文件格式不正确!";
echo json_encode($rs);
exit;
}
$rand = rand(1000, 9999);
$fileName= substr(time(),5).$rand.".$extname";
$uploadPath = $_SITE_PATH_ . "upload/".$__users_id__."/oa/";
if(!is_dir($uploadPath)){
mkdir($uploadPath, 0777, true);
}
$folder = date("ymd");
if(!file_exists($uploadPath.$folder."/0.hide")){
mkdir($uploadPath.$folder, 0777, true);
file_put_contents($uploadPath.$folder."/0.hide", "");
}
$src=$folder."/$fileName";
$savePath=$uploadPath.$src;
$test = $uploadPath.$folder;
if (!move_uploaded_file($_FILES['hml']['tmp_name'], $savePath)) {
$rs->type = 'error';
$rs->msg = "文件上传出现错误";
echo json_encode($rs);
exit;
}
$data = new stdClass;
$data->download_url = "/sites/oa/upload/".$__users_id__."/oa/".$src;
$rs->type = 'succeed';
$rs->msg = "添加成功";
$rs->data = $data;
echo json_encode($rs);
exit;
107表单的提交获取值:
<form action="code.php" method="post">
<input type="text" name="input_name" value=""><br><br>
<select name="color" id="">
<option value="0">红色</option>
<option value="1">蓝色</option>
</select><br>
<input type="checkbox" name="vehicle[]" value="bike">bike<br>
<input type="checkbox" name="vehicle[]" value="car">car <br>
<input type="radio" name="sex" value="male">Male<br>
<input type="radio" name="sex" value="female">Female
<input type="submit" value="提交">
</form>
打印的值:Array
(
[input_name] =fsdfsdf
[color] =0
[vehicle] =Array
(
[0] =bike
[1] =car
)
[sex] =female
)