MySQL kullanan Session Sınıfı

Unutmadan yazmak istediğim bir kaç husus var. O yüzden de yarım birşey bırakmayım diye, tez çalışmamın içinden oturum sınıfımı çıkarıp, kullanılabilir hale getirdim. Bundan önceki yazımda mysql'in nasıl session için araç olacağını anlatmıştım. Şimdi ise bunu nasıl sınıf aracılığı ile yapacağımızı anlatalım.


PHP kodu
  1. <?php
  2.  
  3. /**
  4. Class oturum
  5. Copyright (C) 2009 Gündüz Can YILMAZ
  6. This program is free software: you can redistribute it and/or modify
  7. it under the terms of the GNU General Public License as published by
  8. the Free Software Foundation, either version 3 of the License, or
  9. (at your option) any later version.
  10. This program is distributed in the hope that it will be useful,
  11. but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. GNU General Public License for more details.
  14. You should have received a copy of the GNU General Public License
  15. along with this program. If not, see <http://www.gnu.org/licenses/>.
  16. * @author Gündüz Can YILMAZ
  17. * @copyright 2010
  18. * @version 1.0.0
  19. * @access public
  20. * @site http://www.baglanti.net
  21. */
  22.  
  23. class oturum {
  24. function __construct(){
  25. ini_set('session.save_handler', 'user');
  26. /* Session yöntemini değiştirmemize izin verdiriyoruz. İzinliyse kaldırabilirsiniz */
  27. array('oturum', 'kapat'),
  28. array('oturum', 'oku'),
  29. array('oturum', 'yaz'),
  30. array('oturum', 'yoket'),
  31. array('oturum', 'temizlik')
  32. );
  33. /* Oturum dizinin ilk parametresi sınıfı, ikincisi ise fonksiyonu belirtiyor */
  34. register_shutdown_function('session_write_close');
  35. /* PHP 5.0.5 ten bu yana, oturum bilgisi sınıflar yok edildikten sonra kaydediliyor.
  36. O yüzden eğer bu fonksiyonu kullanıp da sonlanmadan önce yapılacak şiler arasına oturumun kaydedilmesini eklemezsek
  37. sınıfımızı kullanamıyoruz */
  38. }
  39.  
  40. function oturum_ac($depo,$oturum_ismi){
  41. /* depo dosyaların tutulduğu klasör
  42. oturum ismi de PHPSESSID ama biz bunları kullanmayacaz */
  43. global $baglanti;
  44. if(!is_resource($baglanti)){
  45. include('db_ayarlari.php.inc');
  46. $baglanti = @mysql_connect($adres, $kullanici, $sifre);
  47. if($baglanti)
  48. {
  49. $dbselect = @mysql_select_db($veritabani);
  50. if(!$dbselect)
  51. {
  52. @mysql_close($baglanti);
  53. $baglanti = $dbselect;
  54. }
  55. return $baglanti;
  56. }
  57. return false;
  58. }
  59. return $baglanti;
  60. }
  61.  
  62. function kapat() {
  63. return true;
  64. }
  65. function oku($sessid) {
  66. global $baglanti;
  67. $sorgu = mysql_query("SELECT veri FROM oturum WHERE sessid = '".mysql_real_escape_string($sessid)."' LIMIT 1",$baglanti);
  68. if($sorgu!==false) {
  69. $veridb=mysql_fetch_assoc($sorgu);
  70.  
  71. // veri okunduğunda da oturum süresi uzatılması istenirse
  72. mysql_query("UPDATE oturum SET sonerisim=".time()." WHERE sessid = '".mysql_real_escape_string($sessid)."' LIMIT 1",$baglanti);
  73. return $veridb['veri'];
  74. }
  75. return false;
  76. }
  77. function yaz($sessid,$veri){
  78. global $baglanti;
  79. mysql_query("REPLACE INTO oturum SET sessid = '".mysql_real_escape_string($sessid)."', sonerisim = ".time().", veri = '".mysql_real_escape_string($veri)."'",$baglanti);
  80. return (mysql_effected_rows()) ? true : false;
  81. }
  82. function yoket($sessid) {
  83. global $baglanti;
  84. mysql_query("DELETE FROM oturum WHERE sessid='".mysql_real_escape_string($sessid)."'");
  85. return (mysql_effected_rows()) ? true : false;
  86. }
  87. function temizlik($gecerlilik_suresi){
  88. global $baglanti;
  89. mysql_query("DELETE FROM oturum WHERE sonerisim < '".(time()-$gecerlilik_suresi)."'",$baglanti);
  90. return (mysql_effected_rows()) ? true : false;
  91. }
  92. }
  93. ?>

1 2


MySQL kullanan Session Sınıfı Oy Sayısı: 16 Puan: 7.44/ 10.00

Etiketler

mysql session , session mysql , php session sinifi , session sinifi , php session sonlandirma , php session mysql , php mysql session , mysql sinifi , php oturum sinifi , php session class ,

0xyGen04 Şubat 2010 Perşembe 07:42:46


Can abi,
REPLACE INTO ve UPDATE table SET arasındaki fark nedir acaba ?


Gündüz Can YILMAZ05 Şubat 2010 Cuma 09:27:54


replace into kullandığımızda eğer aradığımız kayıt varsa onu siler ve yeni verileri ekler, zaten veri yoksa insert işlemi yapar. Bunu update ile yapmamız için ya önce var mı diye kontrol sorgusu yazıp varsa update yoksa insert yapmalıyız. Ha tabi INSERT INTO .... ON DUPLICATE KEY şeklinde kullanırsak daha şık olur. Silmek yerine direk update kullanmış oluruz. O an neden replace yazdığımı hatırlamıyorum ama şu an olsa o satırı on duplicate key kullanarak yazardım


alper c13 Eylül 2011 Salı 03:32:54


merhabalar.

class ı ufak bi projede kullanmak üzere değerlendirmeye çalıştım. bi kaç ufak hata var gibi geldi bana belirtmek istedim.

costructor da
session_set_save_handler(array('oturum', 'ac'),
array('oturum', 'kapat'),
array('oturum', 'oku'),
array('oturum', 'yaz'),
array('oturum', 'yoket'),
array('oturum', 'temizlik')
);

demişiz fakat class ın içiinde 'ac' diye bi fonksiyon yok 'oturum_ac' var bunun bu sorunu fonksiyonun ismini ac yaparak düzelttim.

mysql_affected_row() yerine effected demişiz ufak bi typo ama runtime da sıkıntı yapıyor tabi =) .

aslında class ı anadomain ile subdomainler arası ortak session oluşturmak için kullanmayı düşünmüştüm. php nin dahili session u bunu yapamıyor. mysql tarafında belki aşarım diye düşündüm ama sorunu yine aşamadım. gerçekten ilginç bi sorun ne yaparım onla ilgili de bilemiyorum =( .


Gündüz Can YILMAZ13 Eylül 2011 Salı 14:40:24


Alper Bey geri bildiriminiz için teşekkür ederim. Kendi sistemimden çıkartırken değiştirmem gereken yerler oluyor, hal böyle iken de arada farkına dahi varmadığım hatalar yapıyorum. Bahsettiğiniz hatayı düzelttim.

Eğer sınıfı kullanacaksanız, __consturct() metodunda, session_starttan önce ini_set("session.cookie_domain", ".domainAdiniz.com"); yazmanız gerekiyor. daha duyarlı hale getirmek isterseniz domaini yazmak yerine $_SERVEr değişkeninden alabilirsiniz




Yorumunuz