php session无法保存问题解决办法

 更新时间:2016年11月25日 15:33  点击:2039
session在php中用来跨页面记录用户信息了通用于服务器登录了,但今天配置的环境发现session无法正常的传递了,那么碰到php session无法保存问题如何来处理呢,具体的如下。

因为正确的验证码结果已经经过加密之后保存在了session中,所有用于输入的验证码会跟session中的进行比对,从而判断验证码是否输入有误!

既然老是显示:"验证码输入有误"

说明session中保存到结果可能有问题。然后,dump下session,发现结果为null......

解决办法:

使用phpinfo查看session信息,找出session的保存路径,然后给其设置写入的权限即可

如果无法解决可以参考下面

现在我们来抛开cookie使用session,主要途径有三条:

1、设置php.ini中的session.use_trans_sid = 1或者编译时打开打开了–enable-trans-sid选项,
让PHP自动跨页传递session id。
2、手动通过URL传值、隐藏表单传递session id。
3、用文件、数据库等形式保存session_id,在跨页过程中手动调用。

例子,php利用session登录退出的简单例子

登录

<?php
//使用会话内存储的变量值之前必须先开启会话
session_start();
//使用一个会话变量检查登录状态
if(isset($_SESSION['username'])){
    echo 'You are Logged as '.$_SESSION['username'].'<br/>';
    //点击“Log Out”,则转到logOut页面进行注销
    echo '<a href="logOut.php"> Log Out('.$_SESSION['username'].')</a>';
}
/**在已登录页面中,可以利用用户的session如$_SESSION['username']、
 * $_SESSION['user_id']对数据库进行查询,可以做好多好多事情*/
?>

退出

<?php
//即使是注销时,也必须首先开始会话才能访问会话变量
session_start();
//使用一个会话变量检查登录状态
if(isset($_SESSION['user_id'])){
    //要清除会话变量,将$_SESSION超级全局变量设置为一个空数组
    $_SESSION = array();
    //如果存在一个会话cookie,通过将到期时间设置为之前1个小时从而将其删除
    if(isset($_COOKIE[session_name()])){
        setcookie(session_name(),'',time()-3600);
    }
    //使用内置session_destroy()函数调用撤销会话
    session_destroy();
}
//location首部使浏览器重定向到另一个页面
$home_url = 'logIn.php';
header('Location:'.$home_url);
?>

php实现上一篇下一篇这个主要是通过sql来根据当前的id来进行判断然后筛选出当前ID之前的数据或ID之后的数据了就这么简单,具体的我们来看看。

实现网站文章里面上一篇和下一篇的sql语句的写法。

当前文章的id为 $article_id,当前文章对应分类的id是$cat_id,那么上一篇就应该是:
代码如下

SELECT max(article_id) FROM article WHERE article_id < $article_id AND cat_id=$cat_id;

执行这段sql语句后得到 $max_id,然后

SELECT article_id, title FROM article WHERE article_id = $max_id;

简化一下,转为子查询即:

SELECT article_id, title FROM article WHERE article_id = (SELECT max(article_id) FROM article WHERE article_id < $article_id AND cat_id=$cat_id);

下一篇为:

代码如下

SELECT min(article_id) FROM article WHERE article_id > $article_id AND cat_id=$cat_id;

执行这段sql语句后得到 $min_id,然后

SELECT article_id, title FROM article WHERE article_id = $min_id;

简化一下,转为子查询即:
代码如下

SELECT article_id, title FROM article WHERE article_id = (SELECT min(article_id) FROM article WHERE article_id > $article_id AND cat_id=$cat_id);

最后讲一下有很多朋友喜欢使用下面语句

上一篇:
代码如下

select id from table where id10 limit 0,1;

这样肯定没有问题,但是是性能感觉不怎么地。

sql语句优化

你可以使用union all来实现一条语句取3行数据,但是前提是3个查询的字段要相同

这个查询出来的结果第一行就是上一篇文章,第二行是当前文章,第三行是下一篇文章
代码如下

(select id from table where id < 10 order by id asc limit 1) union all (select id from table where id = 10) union all (select id from table where id > 10 order by id desc limit 1);

现在来看一些cms中的例子phpcms 实现上一篇下一篇

获取当前浏览文章id

$id = isset($_GET['id']) > 0 ? intval($_GET['id']) : "";
下一篇文章

$query = mysql_query("SELECT id,title FROM article WHERE id>'$id' ORDER BY id ASC LIMIT 1");
$next = mysql_fetch_array($query);

上一篇文章

$query = mysql_query("SELECT id,title FROM article WHERE id <'$id' ORDER BY id DESC LIMIT 1");
$prev = mysql_fetch_array($query);


   


        "><?php echo="">        
   


   


        "><?php echo=""> 
   


分页对于做开发的朋友来讲肯定是非常的有用了,今天我们一起来看一篇关于PHP生成分页下标生成例子 ,希望文章能够帮助到各位朋友。

例子一

网页的分页选择效果直接影响用户的使用体验。类似功能的方法有很多,我在这里写的方法主要是的优势在于前后端分离,可以自己定义长度和分页的行数。


 
测试图例:
11111
 


 
效果图:
截图1453701874

例子

 /**
 
     *
 
     * @param $page     页码(1至正无穷)
 
     * @param $num      数据中多上行为一页
 
     * @param $rows     数据的总行数
 
     * @param $length   下标的最大长度
 
     * @return array
 
     */
 
    public function PageDate($page, $num , $rows , $length){
 
        //初始化数据
 
        $MaxPage = 0;                  //最大页码
 
        $MinPage = 0;                  //最小页码
 
        $ServerPage = 0;               //下拉框中显示的页码
 
        $PageData = array();           //全部的页码集合(用户下拉框选择)
 
        $PageShowData = array();       //用于显示下标的页码集合
 
        $page = intval($page);
 
 
 
        if($rows == 0){
 
            return $data = array(
 
                'page' => $page,
 
                'MaxPage' => $MaxPage,
 
                'MinPage' => $MinPage,
 
                'ServerPage' => $ServerPage,
 
                'PageData' => $PageData,
 
                'PageShowData' => $PageShowData
 
            );
 
        }
 
 
 
        //得到最大分页和最小分页
 
        $MaxPage = intval($rows / $num);
 
        $double = $rows % $num;
 
        if($double > 0.000000001)
 
        {
 
            $MaxPage += 1;
 
        }
 
        $MinPage = 1;
 
        $ServerPage = 1;
 
        //得到页码的全部项目
 
        for($i = 1; $i <= $MaxPage; $i++ ){
 
            $PageData[$i] = $i;
 
        }
 
        //对页码进行正确性改正
 
        if($page < $MinPage){
 
            $page = 1;
 
        }
 
 
 
        if($page > $MaxPage){
 
            $page = 1;
 
        }
 
        /*生成显示的页码标签*/
 
            //生成左侧的代码快
 
            if($page == $MinPage){
 
                $PageShowData[1] = $page;
 
            }
 
            if($page > $MinPage){
 
                $PageShowData[1] = $MinPage;
 
//                $PageShowData[2] = $page - 1; // <<
 
                $PageShowData[2] = '<<'; // <<
 
                if($page -2 > $MinPage ){
 
                    $PageShowData[3] = $page - 2;
 
                    $PageShowData[4] = $page - 1;
 
                }elseif($page -2 == $MinPage){
 
                    $PageShowData[3] = $page - 1;
 
                }
 
                //确定选中的页码代码快
 
                $PageShowData[count($PageShowData) + 1] = $page;
 
            }
 
        $COUNT = count($PageShowData) + 1;
 
        //生成右侧的代码块
 
            if($page == $MaxPage){
 
                return $data = array(
 
                    'page' => $page,
 
                    'MaxPage' => $MaxPage,
 
                    'MinPage' => $MinPage,
 
                    'ServerPage' => $ServerPage,
 
                    'PageData' => $PageData,
 
                    'PageShowData' => $PageShowData
 
                );
 
            }
 
            if($page < $MaxPage) {
 
                if($MaxPage - $page >= 2){
 
                    $j = 1;
 
                    for($i = $COUNT; $i <= $length ; $i++){
 
                        $PageShowData[$i] = $page + $j;
 
                        $j ++;
                        if($PageShowData[$i] == $MaxPage -1){
                                 break;
                            }
                    }
 
                }
 
 
 
                $COUNT = count($PageShowData) + 1;
 
//                $PageShowData[$COUNT] = $page + 1; //>>
 
                $PageShowData[$COUNT] = '>>';
 
                $PageShowData[$COUNT + 1] = $MaxPage;
 
 
 
                //得到选中的参数
 
                $ServerPage = $PageShowData[$COUNT-1] + 1;
 
                if($ServerPage > $MaxPage){
 
                    $ServerPage = 1;
 
                }
 
 
 
                return $data = array(
 
                    'page' => $page,
 
                    'MaxPage' => $MaxPage,
 
                    'MinPage' => $MinPage,
 
                    'ServerPage' => $ServerPage,
 
                    'PageData' => $PageData,
 
                    'PageShowData' => $PageShowData
 
                );
 
            }
 
    }

例子二

这样在某些情况下会严重影响页面的布局,而且文章页面过多全部显示出来的话 ,也会影响用户体验,因此这篇教程围绕dede分页数量无法控制的问题,以修改{dede:pagebreak/}标签为主进行讲解。

情况如下:


dede系统的pagebreak文章页面分页数量控制方法 - 第1张  | 前端开拓者
这是分了15页,假如更多呢,不感想象,自己辛苦花钱做出来的模板就完全走样了!
改后效果:
1
dede系统的pagebreak文章页面分页数量控制方法 - 第2张  | 前端开拓者
2
dede系统的pagebreak文章页面分页数量控制方法 - 第3张  | 前端开拓者
3
dede系统的pagebreak文章页面分页数量控制方法 - 第4张  | 前端开拓者
修改方法:
在include/arc.archives.class.php这个类,这个主是来解析文章内容的类
找到
function GetPagebreak($totalPage,$nowPage,$aid)
这是一个静态分页解析的一个方法,在这个方法里找到:for($i=1;$i<=$totalPage$i++)
在这个循环前面加上 :
if($totalPage>=8){//这个是在分页数量大于的情况下执行下面的语句
$totallist=7+$nowPage;//这里是要显示几页,如果是10页就写9
if($totallist>$totalPage){
$totallist=$totalPage;
}
$d=$nowPage;
$dqys=$totallist-($d-1);
if($dqys<8){
$d=$totalPage-7;
}
}else{
$totallist=$totalPage;
$d=1;
}
然后再改
for($i=1;$i<=$totalPage;$i++)为for($i=$d;$i<=$totallist;$i++)
这个是静态页面分页的修改,动态的和这个方法一样
Cookie我们经常使用了可以记录到用户的行为并且保存信息在用户本地了,下次访问还可以直接调用这些Cookie信息了,下面我们来看一个利用PHP Cookie记录用户历史浏览信息例子,希望文章对各位有帮助。


购物类网站有时候需要了解用户最近的需求,收集和推送用户的查看记录成为了大部分此类的网站不可缺少的功能,下面是本人在开发项目中自己写的方法,一来留有保存,二来和大家分享!

【基础】

Cookie常用方法:

$_COOKIE[‘RecordLuHuiDUDU’] 得到Cookie
setcookie(‘RecordLuHuiDUDU’,”,time()-3600*24*30); setcookie(字段名,数据,过期时间); 设置Cookie

【注意】

重新设置Cookie需要使之前的Cookie失效,删除Cookie也是同样的方法:

setcookie(‘RecordLuHuiDUDU’,”,time()-3600*24*30);

【代码示例】

/**
     * 将用品id存入Cookie中
     *
     * @param $id
     * @return bool
     */
    public function setCookieRecord($id){
        $data = null;
        if(!isset($_COOKIE['RecordLuHuiDUDU'])){
            if(!empty($id)) {
                $data[0] = array(
                    'id' = $id,
                    'time' = date('Y-m-d H:i:s', time())
                );
            }else{
                return false;
            }
        }else{
            if(!empty($id)) {
                $data = $_COOKIE['RecordLuHuiDUDU'];
                setcookie('RecordLuHuiDUDU','',time()-3600*24*30);
                $data = json_decode($data, true);
                $num = count($data);
                //判断是否重复
                $judge = false;
                foreach($data as $index =&gt; $value){
                    if($data[$index]['id'] == $id){
                        $data[$index]['time'] = date('Y-m-d H:i:s', time());
                        $judge = true;
                    }
                }
 
                if($judge){
                    setcookie('RecordLuHuiDUDU',json_encode($data),time()+3600*24*30);
                    return true;
                }
 
                if($num == 10){
                    for($i = 0; $i &lt; 9; $i++){ $data[$i] = $data[$i+1]; } $data[9] = array( 'id' =&gt; $id,
                        'time' =&gt; date('Y-m-d H:i:s', time())
                    );
                }
                if($num &lt;10){ $data[$num] = array( 'id' =&gt; $id,
                        'time' =&gt; date('Y-m-d H:i:s', time())
                    );
                }else {
                    return false;
                }
            }
        }
        setcookie('RecordLuHuiDUDU',json_encode($data),time()+3600*24*30);
        return true;
}

PHP聊天室以前做时都是通过ajax与PHP来实现的,今天我们就一起来看一个PHP聊天室WebSocket技术实战例子。

最近在研究聊天室技术,因为我是做php的,肯定想要从php入手,偶的一个聊天室,下载地址:

http://pan.baidu.com/s/1dDWsbip

密码:i2qz

正在修行当中,准备以此为基础做一款php的聊天室系统出来,php的东西比较容易看懂,但是我遇到的一个问题是前台文件如何发送信息到后台服务器呢,后来研究发现是用的js 的WebSocket技术,如下是常用js WebSocket 常用操作:

var socket = new WebSocket('ws://localhost:8080');
// 打开Socket
socket.onopen = function(event) {
}
// 发送一个初始化消息
 socket.send('I am the client and I\'m listening!');
// 监听消息
 socket.onmessage = function(event) {
    console.log('Client received a message',event);
  };
 // 监听Socket的关闭
  socket.onclose = function(event) {
    console.log('Client notified socket has closed',event);
  };
  // 关闭Socket....
 socket.close()
 socket.onerror = function(evt){console.log(“WebSocketError!”);}; 

这里给大家下载的版本是window版本的php聊天室,需要大家配置如何cmd运行php的环境,
很简单,网上有很多教程,搜搜即可,我只说我遇到的一点疑惑,就是按照教程配置完环境变量path之后,按道理来说,应该是可以cmd运行php了,但是就是不行,过了一天,发现居然能用了,后来才想明白是,配置完后,需要重启电脑才能生效的缘故。

以前也用过 node.js 开发过一些小功能,觉得这里的php技术和node.js 功能都是类似的,都是不需要运行环境,自身就是运行环境的一种方式,聊天室技术,其实我觉得最大的一个突破点是,服务器可以主动给用户发送信息,以控制用户端的浏览器,我觉得这一点的意义很大。这样不用再用ajax不停的访问服务器来获得最新的技术了,极大的减小了服务器的压力,而且提高了用户体验,但是发现用此技术还是没有很好的普遍使用起来,所以以后会陆续发一些此方面的相关视频教程出来,童鞋们可以互相学习交流。
下载到源码之后直接双击目录下面的 start_for_win.bat 文件 即可启动 聊天室服务,
然后访问:http://127.0.0.1:55151/  即可进入聊天室
当然也可以用如下命令控制服务:
启动
以debug方式启动
php /var/www/workerman/start.php start

以daemon方式启动                           

php /var/www/workerman/start.php start -d
停止
php /var/www/workerman/start.php stop
重启
php /var/www/workerman/start.php restart
平滑重启
php /var/www/workerman/start.php reload
查看状态
php /var/www/workerman/start.php status


我只说重要的一点,debug方式启动,会在你关闭cmd窗口的时候 聊天室服务就关闭了,而以以daemon方式启动,就算cmd窗口关闭了,聊天室服务还是运行的

 

[!--infotagslink--]

相关文章

  • PHP session_start()很慢问题分析与解决办法

    本文章来给各位同学介绍一下关于PHP session_start()很慢问题分析与解决办法,希望碰到此问题的同学可进入参考。 最近在做东西的时候发现一个问题 有一个接口挂...2016-11-25
  • php中json_decode()和json_encode()用法与中文不显示解决办法

    本文章介绍了关于php中json_decode()和json_encode()用法与中文不显示解决办法,有需要的朋友可以参考一下下。 php中json_decode()和json_encode() 1.json_decode(...2016-11-25
  • phpexcel导出数据身份证后四位0000解决办法

    在php中我们如果要导入excel数据我们通常会使用phpexcel插件了,但是有朋友会发与使用phpexcel导出数据出现身份证后四位是0000情况了,下面我们就来看解决办法。 最...2016-11-25
  • 401错误码代表什么 401错误解决办法

    401是HTTP状态码的一种,属于“请示错误”,表示请求可能出错,已妨碍了服务器对请求的处理。具体的401错误是指:未授权,请求要求进行身份验证。登录后,服务器可能会返回对页面...2017-01-22
  • apache网站提示503错误解决办法

    Apache status 503 的原因大致有如下几种情况 : 1、 CPU 负载过高,服务器响应不过来,返回503 2、 系统连接数超限,超过MaxVhostClients的上限,返回503 3、 单IP连接数超限,超过M...2016-01-28
  • Perl CPAN::Modulelist的解决办法

    今天用CPAN安装Term::ReadLine,报了个这样的错误 Going to read /root/.cpan/sources/modules/03modlist.data.gz Can't locate object method "data" via package "C...2016-11-25
  • phpStudy访问速度慢和启动失败的解决办法

    下面给大家介绍phpstudy访问速度慢的解决办法。1、修改mysql数据库链接地址为ip地址127.0.0.1。2、使用最新版本,这个坑了我好久时间。下面一段内容是关于phpstudy启动失败的解决办法。php5.3、5.4和apache都是用vc9编...2015-11-24
  • js修改input的type属性问题探讨

    js修改input的type属性有些限制。当input元素还未插入文档流之前,是可以修改它的值的,在ie和ff下都没问题。但如果input已经存在于页面,其type属性在ie下就成了只读属性了,不可以修改。...2013-10-19
  • PHP传值到不同页面的三种常见方式及php和html之间传值问题

    在项目开发中经常见到不同页面之间传值在web工作中,本篇文章给大家列出了三种常见的方式。接触PHP也有几个月了,本文总结一下这段日子中,在编程过程里常用的3种不同页面传值方法,希望可以给大家参考。有什么意见也希望大...2015-11-24
  • Mysql常见问题集锦

    1,utf8_bin跟utf8_general_ci的区别 ci是 case insensitive, 即 "大小写不敏感", a 和 A 会在字符判断中会被当做一样的; bin 是二进制, a 和 A 会别区别对待. 例如你运行: SELECT * FROM table WHERE txt = 'a'...2013-10-04
  • PHP Curl出现403错误的解决办法

    自己用的小PHP应用,使用curl抓网页下来处理,为了穿墙方便,使用Privoxy作为代理,便于选择哪些网站使用proxy、哪些不用。但今天却遇到了奇怪的问题,访问google baidu这些网站居然都返回403错误,而访问其他的一些网站没事,如果...2014-05-31
  • Mysql大小写敏感的问题

    一、1 CREATE TABLE NAME(name VARCHAR(10)); 对这个表,缺省情况下,下面两个查询的结果是一样的:复制代码 代码如下: SELECT * FROM TABLE NAME WHERE name='clip'; SELECT * FROM TABLE NAME WH...2015-03-15
  • linux mint 下mysql中文支持问题

    一.mysql默认不支持中文,它的server和db默认是latin1编码.所以我们要将其改变为utf-8编码,因为utf-8包含了地球上大部分语言的二进制编码 1.关闭mysql服务 sudo /etc/init.d/mysql stop 2.修改mysql配置文件 mysql配...2015-10-21
  • PHP判断上传文件类型的解决办法

    分享给大家php判断上传文件类型的方法,大家一起学习学习。/** * 读取文件前几个字节 判断文件类型 * @return String */ function checkTitle($filename){ $file=fopen($filename, "rb"); $bin=fread($file, 2); /...2015-10-21
  • PHP分布式框架如何使用Memcache同步SESSION教程

    本教程主要讲解PHP项目如何用实现memcache分布式,配置使用memcache存储session数据,以及memcache的SESSION数据如何同步。 至于Memcache的安装配置,我们就不讲了,以前...2016-11-25
  • android.os.BinderProxy cannot be cast to com解决办法

    本文章来给大家介绍关于android.os.BinderProxy cannot be cast to com解决办法,希望此文章对各位有帮助呀。 Android在绑定服务的时候出现java.lang.ClassCastExc...2016-09-20
  • MYSQL数据库使用UTF-8中文编码乱码的解决办法

    1.用phpmyadmin创建数据库和数据表 创建数据库的时候,请将“整理”设置为:“utf8_general_ci” 或执行语句: 复制代码 代码如下:CREATE DATABASE `dbname` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; 创...2015-10-21
  • php的mail函数发送UTF-8编码中文邮件时标题乱码的解决办法

    最近遇到一个问题,就是在使用php的mail函数发送utf-8编码的中文邮件时标题出现乱码现象,而邮件正文却是正确的。最初以为是页面编码的问题,发现页面编码utf-8没有问题啊,找了半天原因,最后找到了问题所在。 1.使用 PEAR 的...2015-10-21
  • PHP页面转UTF-8中文编码乱码的解决办法

    对于乱码这个问题php开发者几乎都会有碰到过,我们下面主要是介绍了php文件乱码和页面乱码。PHP页面转UTF-8编码问题 1.在代码开始出加入一行: header("Content-Type: text/html;charset=utf-8"); 2.PHP文件编码问题...2015-10-21
  • 详解C#中的session用法

    这篇文章主要介绍了C#中的session用法 ,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下...2020-06-25