新浦京81707con > 首页 > php怎么把session保存到MySql数据库中,常见问题小

原标题:php怎么把session保存到MySql数据库中,常见问题小

浏览次数:124 时间:2019-08-28

读书 IBM developerWorks 的 PHP 项目能源中央,进一步询问 PHP。

DROP TABLE IF EXISTS users;
CREATE TABLE users (
id MEDIUMINT NOT NULL AUTO_INCREMENT,
login TEXT NOT NULL,
password TEXT NOT NULL,
PRIMARY KEY( id )
);

 public static function getInstance(){
  static $instance=null;
  if($instance==null){
   $instance=new CustomSession();
  }

首先种方法是利用专项使用的邮件队列系统。在这种模型中,数据库中的三个表包涵相应发送给各样客商的电子邮件音讯。Web 分界面使用 mailouts 类将电子邮件增添到队列中。电子邮件管理程序使用 mailouts 类检索未管理的电子邮件,然后重新行使它从队列中删除未管理的电子邮件。

return $id;
}

 public function gc($lifetime){
  $this->query("delete from `session` where UNIX_TIMESTAMP(UTC_TIMESTAMP())-`timestamp` > $lifetime");
 }

放弃数据库

$id = 1;

<?php
include('./CustomSession.class.php');

讨论

主题材料 2:不使用自动增量功效

1.建session表

学习

清单 5. Goodid.php

  mysql_close($this->conn);
 }

那么,cron 是怎么行事的?那重视于您所处的系统情形。笔者只谈谈老式轻松的 cron 的 UNIX 命令行版本,您能够向系统管理员咨询什么在投机的 Web 应用程序中落实它。

咱俩加多了 NOT NULL 标识来提醒字段必需无法为空。我们还增添了 AUTO_INCREMENT 标记来提醒字段是机动增量的,增加 P宝马7系IMA昂CoraY KEY 标记来提示极其字段是贰个 id。这几个变越发速了速度。清单 6 体现了履新后的 PHP 代码,就要客商插入表中。

  return $instance;
 }

清单 5. generic.sql
    DROP TABLE IF EXISTS processing_items;CREATE TABLE processing_items (  id MEDIUMINT NOT NULL AUTO_INCREMENT,  function TEXT NOT NULL,  PRIMARY KEY ( id ));DROP TABLE IF EXISTS processing_args;CREATE TABLE processing_args (  id MEDIUMINT NOT NULL AUTO_INCREMENT,  item_id MEDIUMINT NOT NULL,  key_name TEXT NOT NULL,  value TEXT NOT NULL,  PRIMARY KEY ( id ));

<?php
require_once("DB.php");

 代码如下

BatchFiles 类有多个首要措施:add()、get_all() 和 delete()。那几个类不访问数据库,而是读写 batch_items 目录中的文件。

利用 PEA安德拉 DB 的代表代码如下所示。

 代码如下

翻开 PEAEvoque -- PHP Extension and Application Repository,个中积存 Pear::DB。

清单 6. Add_user_good.php

 public function close(){

*/1 3-23 * * * jack /usr/bin/php /users/home/jack/myscript.php

$id = add_user( 'jerry', 'pass' );

uid 是保留字段

为了演示这种效用,大家看看在命令行上产生了何等:

$res = $db->query( "SELECT max(id) FROM users" );
$id = null;
while( $res->fetchInto( $row ) ) { $id = $row[0]; }

 public function open(){
  $this->conn=mysql_connect(CustomSession::$db_host,CustomSession::$db_user,CustomSession::$db_password);
  mysql_select_db(CustomSession::$database,$this->conn);
 }

清单 10. batch_by_file_test_add.php
    <?phprequire_once 'batch_by_file.php';BatchFiles::add( "printvalue", array( 'value' => 'foo' ) );?>

$sth = $db->prepare( "INSERT INTO users VALUES(null,?,?)" );
$db->execute( $sth, array( $name, $pass ) );

print_r($_SESSION);

分流的不二等秘书诀与 cron

您能够用比很多的点子开创数据库设计、数据库访谈和依赖数据库的 PHP 业务逻辑代码,但最终一般以错误告终。本文注脚了数据库设计和访问数据库的 PHP 代码中冒出的八个广泛难点,以及在遭受这个难题时怎么着修复它们。

CustomSession::getInstance();

一旦 Web 应用程序中的贰脾本性须求超过 1 秒或 2 秒本领做到,那么相应咋办?需求某种离线管理应用方案。学习三种对 PHP 应用程序中长期运作的课业进展离线服务的秘诀。
重型的加盟店有叁个大难题。每日,在每家店肆会生出数千次交易。公司实践官希望对那么些多少开展开采。哪些产品卖得好?哪些倒霉?有机产品在哪个地方卖得好?冰淇淋的行销景况怎么着? 

INSERT INTO users VALUES ( null, 'jack', 'pass' );
INSERT INTO users VALUES ( null, 'joan', 'pass' );
INSERT INTO users VALUES ( null, 'jane', 'pass' );

2.自定义session类

上边是二个粗略的 cron 配置,它在每日上午 11 点运转八个 PHP 脚本:

清单 2. Access/get_good.php
留意,全数直接用到 MySQL 的地点都清除了,唯有 $dsn 中的数据库连接字符串除却。另外,大家透过 ? 操作符在 SQL 中采纳 $name 变量。然后,查询的多少通过 query() 方法末尾的 array 被发送进来。

CREATE TABLE `session` (
  `sessionid` varchar(128) NOT NULL,
  `uid` int(11) NOT NULL,
  `data` mediumblob NOT NULL,
  `timestamp` int(11) NOT NULL,
  `ip` varchar(15) NOT NULL,
  PRIMARY KEY  (`sessionid`),
  KEY `time_session` (`timestamp`,`sessionid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

输出并十分少,可是你能够见到要点。通过这种机制,能够将其他 PHP 函数的拍卖推迟。

那么替代方案是什么吧?使用 MySQL 中的自动增量特性来机关地为各类插入成立惟一的 ID。更新后的格局如下所示。

 public function write($id,$data){
  $query="replace into `session` (`sessionid`,`data`,`ip`,`timestamp`) values ('%s','%s','%s',UNIX_TIMESTAMP(UTC_TIMESTAMP()))";
  $this->query(sprintf($query,mysql_escape_string($id),mysql_escape_string($data),$_SERVER["REMOTE_ADDR"]));//www.111cn.net
 }

与 mailouts 表同样,那八个表也由 PHP 类包装,这几个类称为 ProcessingItems。

以下为引用的内容:

<?php
function get_user_id( $name )
{
$db = mysql_connect( 'localhost', 'root', 'password' );
mysql_select_db( 'users' );

$res = mysql_query( "SELECT id FROM users WHERE login='".$name."'" );
while( $row = mysql_fetch_array( $res ) ) { $id = $row[0]; }

return $id;
}

var_dump( get_user_id( 'jack' ) );
?>

运作测量试验程序后,查看数据库能够窥见session表中曾经扩展了session记录

 回页首 

$res = $db->query( "SELECT last_insert_id()" );
$id = null;
while( $res->fetchInto( $row ) ) { $id = $row[0]; }

 private $conn;

这段时间,倘诺您不希罕将 PHP 函数名和参数放进数据库中,那么另一种办法是在 PHP 代码中创设数据库中的 “管理作业项目” 名称和骨子里 PHP 管理函数之间的照耀。遵照这种方法,假使之后决定修改 PHP 后端,那么一旦 “管理作业项目” 字符串相配,系统就好像故可以干活。

123下一页读书全文

 public function __construct(){
  session_set_save_handler(
  array($this,"open"),
  array($this,"close"),
  array($this,"read"),
  array($this,"write"),
  array($this,"destroy"),
  array($this,"gc")
  );
 }

清单 7. generic_test_add.php
    <?phprequire_once 'generic.php';ProcessingItems::add( 'printvalue', array( 'value' => 'foo' ) );?>

以下为引用的内容:

<?php
require_once("DB.php");

function get_user_id( $name )
{
$dsn = 'mysql://root:password@localhost/users';
$db =& DB::Connect( $dsn, array() );
if (PEAR::isError($db)) { die($db->getMessage()); }

$res = $db->query( 'SELECT id FROM users WHERE login=?',
array( $name ) );
$id = null;
while( $res->fetchInto( $row ) ) { $id = $row[0]; }

return $id;
}

var_dump( get_user_id( 'jack' ) );
?>

php中session暗中认可的寄存方式是硬盘,php也足以退换私下认可的积累格局。
要害行使到session_set_save_handler方法,下边分享下怎么样将session保存到MySql数据库中的具体代码。

批处理类别布局的基础知识

<?php
require_once("DB.php");

session_start();

选拔 cron 守护进度定时运维那一个剧本。运转那些本子的功用取决于你的应用程序的需求。

叁个分布难题是较老的 PHP 代码直接利用 mysql_ 函数来做客数据库。清单 1 浮现了何等直接待上访谈数据库。

3.测量检验程序

前 5 个字段定义应该运营脚本的流年。然后是相应用来运营那些剧本的客户名。其他的通令是要实施的命令行。时间字段分别是分、小时、月首的日、月和周中的日。上边是多少个示范。

复制代码 代码如下:

?>

清单 4. mailout_send.php
    <?phprequire_once 'mailout.php';function process( $from, $to, $subject, $email ) {  mail( $to, $subject, $email, "From: $from" );}$messages = Mailouts::get_all();foreach( $messages as $msg ) {  process( $msg[1], $msg[2], $msg[3], $msg[4] );  Mailouts::delete( $msg[0] );}?>

复制代码 代码如下:

?>

 回页首 

function add_user( $name, $pass )
{
$rows = array();

 public function query($query){
  $res=mysql_query($query,$this->conn);
  return $res;
 }
}

有关作者

DROP TABLE IF EXISTS users;
CREATE TABLE users (
id MEDIUMINT,
login TEXT,
password TEXT
);
INSERT INTO users VALUES ( 1, 'jack', 'pass' );
INSERT INTO users VALUES ( 2, 'joan', 'pass' );
INSERT INTO users VALUES ( 1, 'jane', 'pass' );

 代码如下

本文的其他部分演示在 Web 应用程序前端和批管理后端之间分享数据的各类措施。

复制代码 代码如下:

<?php
class CustomSession{
 private static $db_host="localhost";
 private static $db_user="root";
 private static $db_password="";
 private static $database="session";

在每一种小时的第 15 分钟运营脚本。 

复制代码 代码如下:

 public function destroy($id){
  $escaped_id=mysql_escape_string($id);
  $res=$this->query("delete from `session` where `id`='$escaped_id'");
  return (mysql_affected_rows($res)==1);
 }

下一步是编写三个大概的测量试验脚本,这些剧本将多少个条文增添到行列中。

清单 3. Badid.sql

 public function __destruct(){
  session_write_close();
 }

清单 1. mailout.sql
    DROP TABLE IF EXISTS mailouts;CREATE TABLE mailouts (  id MEDIUMINT NOT NULL AUTO_INCREMENT,  from_address TEXT NOT NULL,  to_address TEXT NOT NULL,  subject TEXT NOT NULL,  content TEXT NOT NULL,  PRIMARY KEY ( id ));

function add_user( $name, $pass )
{
$dsn = 'mysql://root:password@localhost/good_genid';
$db =& DB::Connect( $dsn, array() );
if (PEAR::isError($db)) { die($db->getMessage()); }

$_SESSION['username']='feng';

在那么些示例中,小编加多三个 mailout,那个音信要发送给某市廛的 Molly,当中满含核心 “Test Subject” 和电子邮件主体。能够在指令行上运营这些本子:php mailout_test_add.php。

清单 4. Add_user.php

 public function read($id){
  $escaped_id=mysql_escape_string($id);
  $res=$this->query("select * from `session` where `sessionid`='$escaped_id'");
  if($row=mysql_fetch_assoc($res)){
   $this->query("update `session` set `timetamp`=UTC_TIMESTAMP() where `sessionid`='$escaped_id'");
   return $row['data'];
  }
  return "";
 }

清单 2. mailouts.php
    <?phprequire_once('DB.php');class Mailouts{  public static function get_db()  {    $dsn = 'mysql://root:@localhost/mailout';    $db =& DB::Connect( $dsn, array() );    if (PEAR::isError($db)) { die($db->getMessage()); }    return $db;  }  public static function delete( $id )  {    $db = Mailouts::get_db();    $sth = $db->prepare( 'DELETE FROM mailouts WHERE id=?' );    $db->execute( $sth, $id );    return true;  }  public static function add( $from, $to, $subject, $content )  {    $db = Mailouts::get_db();    $sth = $db->prepare( 'INSERT INTO mailouts VALUES (null,?,?,?,?)' );    $db->execute( $sth, array( $from, $to, $subject, $content ) );    return true;  }  public static function get_all()  {    $db = Mailouts::get_db();    $res = $db->query( "SELECT * FROM mailouts" );    $rows = array();    while( $res->fetchInto( $row ) ) { $rows []= $row; }    return $rows;  }}?>

这里的 id 字段被轻便地内定为整数。所以,即便它应当是独步一时的,大家照旧得以拉长另外值,如 CREATE 语句前边的多少个 INSERT 语句中所示。清单 4 展示了将客商增加到那体系型的形式的 PHP 代码。

有点索要留神:除了类名(BatchFiles)之外,实际上未有任何迹象能够表明作业是怎样存款和储蓄的。所以,以往很轻易将它改为数据库风格的蕴藏格局,而没有须求修改接口。

清单 1. Access/get.php
留神利用了 mysql_connect 函数来探望数据库。还要小心查询,在那之中使用字符串连接来向查询增添 $name 参数。

最终是管理程序的代码。

var_dump( $id );
?>

  Jack D. Herrington 是一名高端软件技术员,具有 20 多年的办事经验。他编著过三本书: Code Generation in Action 、 Podcasting 哈克s 和 PHP 哈克s,还创作了 30 多篇小说。

与大多数现代数据库一样,MySQL 能够在每记录的根底上创造机关增量惟一标志符。除了那一个之外,大家依然会看出那般的代码,即首先运营一个SELECT 语句来找到最大的 id,然后将该 id 增 1,并找到三个新记录。清单 3 展现了二个示范坏情势。

本文由新浦京81707con发布于首页,转载请注明出处:php怎么把session保存到MySql数据库中,常见问题小

关键词: 新浦京81707con

上一篇:2应用的8个主要构造块有哪些,angular应用构造

下一篇:没有了