将Session写入数据库

Aug 08, 2016 am 09:26 AM
handler self session time

使用session_set_save_handler()函数,将Session的内容写入数据库

<span>  1</span> <span>php
</span><span>  2</span>     <span>/*</span>
<span>  3</span> <span>    *@author    Fahy
</span><span>  4</span> <span>    *@link    http://home.cnblogs.com/u/HuangWj
</span><span>  5</span> <span>    *数据库为mysql,
</span><span>  6</span> <span>    *数据库名为session,表名为session,
</span><span>  7</span> <span>    *表中字段包括PHPSESSID,update_time,client_ip,data
</span><span>  8</span>     <span>*/</span>
<span>  9</span>     <span>class</span><span> Session{
</span><span> 10</span>         <span>private</span> <span>static</span> <span>$handler</span> = <span>null</span><span>;
</span><span> 11</span>         <span>private</span> <span>static</span> <span>$ip</span> = <span>null</span><span>;
</span><span> 12</span>         <span>private</span> <span>static</span> <span>$lifetime</span> = <span>null</span><span>;
</span><span> 13</span>         <span>private</span> <span>static</span> <span>$time</span> = <span>null</span><span>;
</span><span> 14</span>         
<span> 15</span>         <span>//</span><span>配置静态变量</span>
<span> 16</span>         <span>private</span> <span>static</span> <span>function</span> init(<span>$handler</span><span>){
</span><span> 17</span>             self::<span>$handler</span> = <span>$handler</span>;        <span>//</span><span>获取数据库资源</span>
<span> 18</span>             self::<span>$ip</span> = !<span>empty</span>(<span>$_SERVER</span>["REMOTE_ADDR"])? <span>$_SERVER</span>["REMOTE_ADDR"]:'unkonw';        <span>//</span><span>获取客户端ip</span>
<span> 19</span>             self::<span>$lifetime</span> = <span>ini_get</span>('session.gc_maxlifetime');        <span>//</span><span>获取session生命周期</span>
<span> 20</span>             self::<span>$time</span> = <span>time</span>();        <span>//</span><span>获取当前时间</span>
<span> 21</span> <span>        }
</span><span> 22</span>         <span>//</span><span>调用session_set_save_handler()函数并开启session</span>
<span> 23</span>         <span>static</span> <span>function</span> start(<span>$pdo</span><span>){
</span><span> 24</span>             self::init(<span>$pdo</span><span>);
</span><span> 25</span>             <span>session_set_save_handler</span><span>(
</span><span> 26</span>                 <span>array</span>(<span>__CLASS__</span>,'open'),
<span> 27</span>                 <span>array</span>(<span>__CLASS__</span>,'close'),
<span> 28</span>                 <span>array</span>(<span>__CLASS__</span>,'read'),
<span> 29</span>                 <span>array</span>(<span>__CLASS__</span>,'write'),
<span> 30</span>                 <span>array</span>(<span>__CLASS__</span>,'destroy'),
<span> 31</span>                 <span>array</span>(<span>__CLASS__</span>,'gc'<span>)
</span><span> 32</span> <span>            );
</span><span> 33</span>             <span>session_start</span><span>();
</span><span> 34</span> <span>        }
</span><span> 35</span>         
<span> 36</span>         <span>public</span> <span>static</span> <span>function</span> open(<span>$path</span>,<span>$name</span><span>){
</span><span> 37</span>             <span>return</span> <span>true</span><span>;
</span><span> 38</span> <span>        }
</span><span> 39</span>         <span>public</span> <span>static</span> <span>function</span><span> close(){
</span><span> 40</span>             <span>return</span> <span>true</span><span>;
</span><span> 41</span> <span>        }
</span><span> 42</span>         
<span> 43</span>         <span>//</span><span>查询数据库中的数据</span>
<span> 44</span>         <span>public</span> <span>static</span> <span>function</span> read(<span>$PHPSESSID</span><span>){
</span><span> 45</span>              <span>$sql</span> = "select PHPSESSID,update_time,client_ip,data from session where PHPSESSID=?"<span>;
</span><span> 46</span>              <span>$stmt</span> = self::<span>$handler</span>->prepare(<span>$sql</span><span>);
</span><span> 47</span>              <span>$stmt</span>->execute(<span>array</span>(<span>$PHPSESSID</span><span>));
</span><span> 48</span>              <span>if</span>(!<span>$result</span> = <span>$stmt</span>->fetch(PDO::<span>FETCH_ASSOC)){
</span><span> 49</span>                  <span>return</span> ''<span>;
</span><span> 50</span> <span>             }
</span><span> 51</span>              <span>if</span>(self::<span>$ip</span> == <span>$result</span>['client_ip'<span>]){
</span><span> 52</span>                  self::destroy(<span>$PHPSESSID</span><span>);
</span><span> 53</span>                  <span>return</span> ''<span>;
</span><span> 54</span> <span>             }
</span><span> 55</span>              <span>if</span>((<span>$result</span>['update_time']+self::<span>$lifetime</span>)<:>$time<span>){
</span><span> 56</span>                  self::destroy(<span>$PHPSESSID</span><span>);
</span><span> 57</span>                  <span>return</span> ''<span>;
</span><span> 58</span> <span>             }
</span><span> 59</span>              <span>return</span> <span>$result</span>['data'<span>];
</span><span> 60</span> <span>        }
</span><span> 61</span>         <span>/*</span>
<span> 62</span> <span>         *首先查询该session是否存在数据,如果存在,则更新数据,如果不存在,则插入数据
</span><span> 63</span>          <span>*/</span>
<span> 64</span>         <span>//</span><span>将session写入数据库中,$data传入session中的keys和values数组</span>
<span> 65</span>         <span>public</span> <span>static</span> <span>function</span> write(<span>$PHPSESSID</span>,<span>$data</span><span>){
</span><span> 66</span>             <span>$sql</span> = "select PHPSESSID,update_time,client_ip,data from session where PHPSESSID=?"<span>;
</span><span> 67</span>              <span>$stmt</span> = self::<span>$handler</span>->prepare(<span>$sql</span><span>);
</span><span> 68</span>              <span>$stmt</span>->execute(<span>array</span>(<span>$PHPSESSID</span><span>));
</span><span> 69</span>              
<span> 70</span>              <span>if</span>(<span>$result</span>=<span>$stmt</span>->fetch(PDO::<span>FETCH_ASSOC)){                
</span><span> 71</span>                  <span>if</span>(<span>$result</span>['data'] != <span>$data</span> || self::<span>$time</span> > (<span>$result</span>['update_time']+30<span>)){
</span><span> 72</span>                      <span>$sql</span> = "update session set update_time=?,data=? where PHPSESSID = ?"<span>;
</span><span> 73</span>                      <span>$stmt</span> = self::<span>$handler</span>->prepare(<span>$sql</span><span>);
</span><span> 74</span>                      <span>$stmt</span>->execute(<span>array</span>(<span>$self</span>::<span>$time</span>,<span>$data</span>,<span>$PHPSESSID</span><span>));
</span><span> 75</span> <span>                }
</span><span> 76</span>              }<span>else</span><span>{
</span><span> 77</span>                  <span>if</span>(!<span>empty</span>(<span>$data</span><span>)){
</span><span> 78</span>                      <span>try</span><span>{
</span><span> 79</span>                          <span>$sql</span> = "insert into session(PHPSESSID,update_time,client_ip,data) values(?,?,?,?)"<span>;
</span><span> 80</span>                      }<span>catch</span>(PDOException <span>$e</span><span>){
</span><span> 81</span>                          <span>echo</span> <span>$e</span>-><span>getMessage();
</span><span> 82</span> <span>                     }
</span><span> 83</span>                      <span>$sth</span> = self::<span>$handler</span>->prepare(<span>$sql</span><span>);
</span><span> 84</span>                      <span>$sth</span>->execute(<span>array</span>(<span>$PHPSESSID</span>,self::<span>$time</span>,self::<span>$ip</span>,<span>$data</span><span>));
</span><span> 85</span> <span>                 }
</span><span> 86</span> <span>             }
</span><span> 87</span>              <span>return</span> <span>true</span><span>;
</span><span> 88</span> <span>        }
</span><span> 89</span>         
<span> 90</span>         <span>public</span> <span>static</span> <span>function</span> destroy(<span>$PHPSESSID</span><span>){
</span><span> 91</span>             <span>$sql</span> = "delete from session where PHPSESSID = ?"<span>;
</span><span> 92</span>             <span>$stmt</span> = self::<span>$handler</span>->prepare(<span>$sql</span><span>);
</span><span> 93</span>             <span>$stmt</span>->execute(<span>array</span>(<span>$PHPSESSID</span><span>));
</span><span> 94</span>             <span>return</span> <span>true</span><span>;
</span><span> 95</span> <span>        }
</span><span> 96</span>         <span>public</span> <span>static</span> <span>function</span> gc(<span>$lifetime</span><span>){
</span><span> 97</span>             <span>$sql</span> = "delete from session where update_time"<span>;
</span><span> 98</span>             <span>$stmt</span> = self::<span>$handler</span>->prepare(<span>$sql</span><span>);
</span><span> 99</span>             <span>$stmt</span>->execute(<span>array</span>(self::<span>$time</span>-<span>$lifetime</span><span>));
</span><span>100</span>             <span>return</span> <span>true</span><span>;
</span><span>101</span> <span>        }
</span><span>102</span> <span>    }
</span><span>103</span>     <span>//</span><span>使用PDO连接数据库</span>
<span>104</span>     <span>try</span><span>{
</span><span>105</span>         <span>$pdo</span> = <span>new</span> PDO("mysql:host=localhost;dbname=session","root","hwj193"<span>);
</span><span>106</span>     }<span>catch</span>(PDOException <span>$e</span><span>){
</span><span>107</span>         <span>echo</span> <span>$e</span>-><span>getMessage();
</span><span>108</span> <span>    }
</span><span>109</span>     <span>//</span><span>传递数据库资源</span>
<span>110</span>     Session::start(<span>$pdo</span>);</:>
Salin selepas log masuk

以上就介绍了将Session写入数据库,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Mengapa NameResolutionError(self.host, self, e) daripada e dan cara menyelesaikannya Mengapa NameResolutionError(self.host, self, e) daripada e dan cara menyelesaikannya Mar 01, 2024 pm 01:20 PM

Sebab ralat adalah NameResolutionError(self.host,self,e)daripada, yang merupakan jenis pengecualian dalam pustaka urllib3 Sebab ralat ini adalah bahawa resolusi DNS gagal, iaitu nama hos atau alamat IP yang telah cuba diselesaikan tidak dapat ditemui. Ini mungkin disebabkan oleh alamat URL yang dimasukkan tidak betul atau pelayan DNS tidak tersedia buat sementara waktu. Bagaimana untuk menyelesaikan ralat ini Mungkin terdapat beberapa cara untuk menyelesaikan ralat ini: Semak sama ada alamat URL yang dimasukkan adalah betul dan pastikan ia boleh diakses Pastikan pelayan DNS tersedia, anda boleh cuba menggunakan arahan "ping" dalam baris arahan untuk menguji sama ada pelayan DNS tersedia Cuba akses tapak web menggunakan alamat IP dan bukannya nama hos jika di belakang proksi

Bagaimana untuk menetapkan tamat masa sesi dalam Sesi SpringBoot Bagaimana untuk menetapkan tamat masa sesi dalam Sesi SpringBoot May 15, 2023 pm 02:37 PM

Masalah ditemui dalam masa tamat masa pengeluaran projek springboot Masalahnya diterangkan di bawah: Dalam persekitaran ujian, sesi keluar telah dikonfigurasikan dengan menukar aplikasi.yaml Selepas menetapkan masa yang berbeza untuk mengesahkan bahawa konfigurasi keluar sesi berkuat kuasa, masa tamat tempoh ditetapkan terus kepada 8 jam untuk dilepaskan. Walau bagaimanapun, saya menerima maklum balas daripada pelanggan pada waktu tengah hari bahawa masa tamat projek ditetapkan menjadi singkat Jika tiada operasi dilakukan selama setengah jam, sesi akan tamat tempoh dan memerlukan log masuk berulang. Selesaikan masalah pengendalian persekitaran pembangunan: projek springboot mempunyai Tomcat terbina dalam, jadi sesi keluar yang dikonfigurasikan dalam application.yaml dalam projek adalah berkesan. Persekitaran pengeluaran: Keluaran persekitaran pengeluaran ialah

Bagaimana untuk menyelesaikan kegagalan sesi Bagaimana untuk menyelesaikan kegagalan sesi Oct 18, 2023 pm 05:19 PM

Kegagalan sesi biasanya disebabkan oleh tamat tempoh seumur hidup sesi atau penutupan pelayan. Penyelesaian: 1. Memanjangkan hayat sesi; 2. Gunakan storan berterusan;

Penyelesaian kepada masalah merentas domain Sesi PHP Penyelesaian kepada masalah merentas domain Sesi PHP Oct 12, 2023 pm 03:00 PM

Penyelesaian kepada masalah silang domain PHPSession Dalam pembangunan pemisahan front-end dan back-end, permintaan merentas domain telah menjadi kebiasaan. Apabila menangani isu merentas domain, kami biasanya melibatkan penggunaan dan pengurusan sesi. Walau bagaimanapun, disebabkan oleh sekatan dasar asal penyemak imbas, sesi tidak boleh dikongsi secara lalai merentas domain. Untuk menyelesaikan masalah ini, kita perlu menggunakan beberapa teknik dan kaedah untuk mencapai perkongsian sesi merentas domain. 1. Penggunaan kuki yang paling biasa untuk berkongsi sesi merentas domain

Apakah yang perlu saya lakukan jika sesi php hilang selepas menyegarkan? Apakah yang perlu saya lakukan jika sesi php hilang selepas menyegarkan? Jan 18, 2023 pm 01:39 PM

Penyelesaian kepada masalah bahawa sesi php hilang selepas menyegarkan: 1. Buka sesi melalui "session_start();" 2. Tulis semua konfigurasi awam dalam fail php 3. Nama pembolehubah tidak boleh sama dengan subskrip tatasusunan; 4. Dalam Hanya semak laluan penyimpanan data sesi dalam phpinfo dan semak sama ada sesio dalam direktori fail berjaya disimpan.

Apakah masa tamat lalai sesi php? Apakah masa tamat lalai sesi php? Nov 01, 2022 am 09:14 AM

Masa tamat lalai PHP sesi ialah 1440 saat, iaitu 24 minit, yang bermaksud bahawa jika pelanggan tidak memuat semula selama lebih daripada 24 minit, sesi semasa akan tamat tempoh jika pengguna menutup penyemak imbas, sesi akan tamat dan Sesi tidak akan wujud lagi.

Bagaimana untuk menyelesaikan masalah bahawa tetapan tamat masa sesi Springboot2 adalah tidak sah Bagaimana untuk menyelesaikan masalah bahawa tetapan tamat masa sesi Springboot2 adalah tidak sah May 22, 2023 pm 01:49 PM

Masalah: Hari ini, kami menghadapi masalah tamat masa tetapan dalam projek kami dan perubahan pada application.properties SpringBoot2 tidak pernah berkuat kuasa. Penyelesaian: Pelayan.* sifat digunakan untuk mengawal bekas terbenam yang digunakan oleh SpringBoot. SpringBoot akan mencipta contoh bekas servlet menggunakan salah satu contoh ServletWebServerFactory. Kelas ini menggunakan sifat pelayan.* untuk mengkonfigurasi bekas servlet terkawal (tomcat, jeti, dsb.). Apabila aplikasi digunakan sebagai fail perang kepada contoh Tomcat, pelayan.* sifat tidak digunakan. Mereka tidak memohon,

Pemprosesan jam monotonik pakej masa Pemprosesan jam monotonik pakej masa Aug 04, 2023 pm 05:45 PM

Hari ini kita akan melihat kaedah penggunaan masa pakej masa golang. Peraturan umum antara kedua-duanya ialah "masa dinding" digunakan untuk memberitahu masa, dan "jam monotonik" digunakan untuk mengukur masa terdapat kaedah pemprosesan jam lain.

See all articles