Google


Tag Archive for 'PHP'

เล่นง่ายๆ กับเช็คว่า ip, e-email หรือ username ที่สมัครสมาชิกเข้ามาเป็น spammer หรือไม่?

ช่วงนี้เจอเรื่องปวดหัวเกี่ยวกับ spam ใน forum เยอะมาก ตอนนี้เลยใช้วิธีง่ายๆ ไปก่อนผ่าน http://www.stopforumspam.com ก็กันได้ในระดับนึง แต่ว่ามี API Limit อาจจะต้องหาวิธีอื่นๆ แก้ไขเฉพาะหน้ากันต่อไป คิดว่าน่าจะพอไหวอยู่

PHP:
  1. <?php
  2. function is_forumspam_objectsIntoArray($arrObjData, $arrSkipIndices = array()) {
  3.     $arrData = array();
  4.  
  5.     // if input is object, convert into array
  6.     if (is_object($arrObjData)) {
  7.         $arrObjData = get_object_vars($arrObjData);
  8.     }
  9.  
  10.     if (is_array($arrObjData)) {
  11.         foreach ($arrObjData as $index => $value) {
  12.             if (is_object($value) || is_array($value)) {
  13.                 $value = is_forumspam_objectsIntoArray($value, $arrSkipIndices);
  14.             }
  15.             if (in_array($index, $arrSkipIndices)) {
  16.                 continue;
  17.             }
  18.             $arrData[$index] = $value;
  19.         }
  20.     }
  21.     return $arrData;
  22. }
  23.  /**
  24.     http://www.stopforumspam.com/api?ip=91.186.18.61
  25.     http://www.stopforumspam.com/api?email=g2fsehis5e@mail.ru
  26.     http://www.stopforumspam.com/api?username=MariFoogwoogy
  27.  **/
  28. function is_forumspam($var) {
  29.  
  30.     $var['email'] = urlencode($var['email']);
  31.  
  32.     $q = 'username='.$var['username'].'&email='.$var['email'].'&ip='.$var['ip'];
  33.  
  34.     $xmlUrl = "http://www.stopforumspam.com/api?".$q."&f=xmldom";
  35.  
  36.     $xmlStr = file_get_contents($xmlUrl);
  37.  
  38.     $xmlObj = simplexml_load_string($xmlStr);
  39.  
  40.     $arrXml = is_forumspam_objectsIntoArray($xmlObj);
  41.  
  42.     if($arrXml['ip']['appears'] == 1)
  43.         return true;
  44.     if($arrXml['email']['appears'] == 1)
  45.         return true;
  46.     if($arrXml['username']['appears'] == 1)
  47.         return true;
  48.  
  49.     return false;
  50. }

อ้างอิงจาก http://www.stopforumspam.com

Slide “PHP Performance with APC + Memcached for Windows” ที่นำเสนอในงาน /* pOrt80BKK */ – PHP Day

เอา Zend Framework มาใส่ Codeigniter Framework เพื่อใช้ Zend Component

entry นี้ผมกะจะเขียนตั้งนานแล้ว แต่ว่าไม่มีโอกาสเสียที วันนี้เลยเอาสักหน่อยครับ

ผมไม่เท้าความว่า Codeigniter Framework คืออะไร หาอ่านกันเอานะครับ ติดตั้งอย่างไร เขียนยังไง ทำงานอย่างไร อันนี้หาเอาได้ในเว็บต่างๆ ทั้งไทยและเทศ ผมว่ามีเยอะ ผมลุยเรื่องปรับแต่งเพิ่มเติมเลยดีกว่า

เหตุผลที่เอา Component ของ Zend Framework (ต่อไปเรียก Zend) มาใช้ใน Codeigniter (ต่อไปเรียก CI) เพราะความครบเครื่องในการนำไปใช้งาน ที่หลายๆ อย่างทำได้ดีกว่าตัว CI เยอะมาก แต่โครงสร้างและติดตั้งของ Zend ทำได้ยุ่งยากกว่า ผมเลยเอามาผสมกัน หากใครใช้ Zend มาบ้างจะทราบดีว่ามันอลังการงานสร้างแค่ไหน ครบเครื่องอย่างไร

เอาหล่ะ ไม่พูดอะไรมาก ก่อนอื่นสร้างไฟล์ที่ path ตามด้านล่างครับ

CODE:
  1. system/application/libraries/Zend.php

ภายในไฟล์ก็ประกอบด้วยโค้ดตามด้วยล่างครับ

PHP:
  1. <?php
  2. class CI_Zend {
  3.  
  4.     function __construct ($class = NULL) {
  5.  
  6.         ini_set('include_path',  ini_get('include_path') . PATH_SEPARATOR . APPPATH . 'libraries');
  7.  
  8.         if ($class) {
  9.             require_once (string) $class . EXT;
  10.             log_message('debug', "Zend Class $class Loaded");
  11.         } else {
  12.             log_message('debug', "Zend Class Initialized");
  13.         }
  14.     }
  15.  
  16.     function load ($class) {
  17.         require_once (string) $class . EXT;
  18.         log_message('debug', "Zend Class $class Loaded");
  19.     }
  20. }
  21. ?>

โดยเมื่อได้ไฟล์ Zend.php แล้ว ให้เอา Directory "Zend" ทั้งหมดไปใส่ที่

CODE:
  1. system/application/libraries

เวลาใช้งาน ก็ใช้งานผ่าน Controller ของ CI โดยมี 2 แบบคือ

1. โหลด Library Zend ที่เขียนสำหรับตั้ง include path ไปพร้อมๆ กับโหลด Component ไปด้วยเลย

PHP:
  1. $this->load->library('zend', 'Zend/Package/Name');

2. โหลดตัว Library Zend ที่เขียนสำหรับตั้ง include path ก่อน แล้วค่อยโหลดตัว Component ทีหลังเป็นตัวๆ ไปก็ได้

PHP:
  1. $this->load->library('zend');
  2. $this->zend->load('Zend/Package/Name');

การโหลด Zend Component แบบนี้ก็ทำให้ดูเป็นระเบียบกว่าการ require_once เข้ามา เพราะอย่างน้อยก็ทำให้เราทำ logs tracking ใน CI ได้ครับ รวมไปถึงการตั้ง include path เพื่อโยกย้าย Zend Framework ไปที่ไหนๆ ก็ได้ตามแต่เราตั้งใน include path โดยไม่ต้องอ้างอิง include path ของ System

เพียงเท่านี้เราก็ลั้นล้ากับ Zend ใน CI ได้สบายใจแล้วหล่ะครับ ;)