रविवार, 31 जनवरी 2010

securimage से कैप्चा(captcha) लगाना हुआ और भी आसान

कैप्चा से तो आप सभी परिचित होंगे. चित्रों में लिखे टेढ़े मेढ़े शब्द जिन्हे अक्सर वेब फ़ार्मों को भरते समय आखिरी में भरना पड़ता है.

असल में होता ये है कि इन चित्रों में लिखे टेढ़े मेढ़े शब्दों को केवल मनुष्य ही पढ़ पाता है जिससे केवल वही उन्हे भर सकता है मशीन नही. अन्यथा छोटे छोटे प्रोग्राम भी ढेरों फ़ार्म स्वचालित रूप से जमा कर सकते हैं. कैप्चा इस प्रकार के स्वचालित प्रोग्रामों से सुरक्षा प्रदान करता है.

securimage एक पीएचपी क्लास फ़ाइल है जिससे फ़ार्मों में कैप्चा लगाना बहुत आसान हो जाता है. आइए देखते हैं कैसे?

सर्वप्रथम securimage क्लास फ़ाइल को आप http://www.phpcaptcha.org/ से डाउनलोड कर लें. इसकी जिप फ़ाइल में आपको निम्नलिखित फ़ाइलें दिखाई देंगी.

image 

वैसे तो इसमें वो सब कुछ है जिसकी आपको जरूरत है परंतु चूंकि हम यहां सीखने सिखाने का काम कर रहे हैं अत: हम इस जिप फ़ाइल से gdfonts तथा securimage.php क्लास फ़ाइल को ही निकालेंगे. इन्हे हम अब अपनी साइट के रूट फ़ोल्डर में कापी करते हैं.

image

तो अब सब तैयार है. तो शुरू करते हैं.

इसी फ़ोल्डर में एक फ़ाइल बनाएं index.php के नाम से.

इस फ़ाइल में निम्नलिखित कोड लिखें:

<?php session_start(); //हम पीएचपी सेशन शुरू कर रहे हैं.
require_once 'securimage.php'; //हम कैप्चा की मुख्य क्लास फ़ाइल को शामिल कर रहे हैं.
$securimage = new Securimage(); //अब बारी है क्लास से आब्जेक्ट बनाने की
if($_SERVER['REQUEST_METHOD']=='POST'){ //हम यह जांच रहे हैं कि फ़ार्म द्वारा POST अनुरोध हुआ या नही?
    if ($securimage->check($_POST['captcha_code']) == false) { //अब securimage आब्जेक्ट के द्वारा हम फ़ार्म से भेजे गये कोड को जांच रहे हैं
        //त्रुटि संदेश दिखाएं
        echo "कैप्चा कोड का मिलान नही हो सका"; //यदि मिलान ना हो तो त्रुटि संदेश दिखाएं
    }else{
        //फ़ार्म जमा करें
        echo "धन्यवाद फ़ार्म जमा किया जा सकता है"; //अन्यथा फ़ार्म जमा करें

    }
}
?>
<form name="form_captcha_test" method="post" action="index.php">
<input type="text" name="captcha_code" value="" /><br />
<img src="showimg.php" alt="captcha image" /> <!-- showimg.php ही कैप्चा चित्रों को पैदा करेगी-->
<input type="submit" name="btn_submit" value="जमा करें" />
</form>

अब एक और फ़ाइल बनाएं जिसका नाम हो showimg.php. इस फ़ाइल में निम्नलिखित कोड लिखें:

<?php

include 'securimage.php'; //मुख्य क्लास फ़ाइल को शामिल कर रहे हैं.
$img = new securimage(); //क्लास से आब्जेक्ट बना रहे हैं
$img->use_gd_font = true; //इसे सक्षम कर देने से gdf फ़ान्टों का समर्थन शुरू हो जाता है
$img->gd_font_file = "gdfonts/bubblebath.gdf"; //अब यहां यह बताना है कि कौन सा gdf फ़ान्ट प्रयोग में लाना है
$img->show(); //और आखिर में हम कैप्चा चित्र को दिखाएंगे.

?>

ब्राउजर में अब index.php फ़ाइल को देखें आपको एक कैप्चा दिखाई देगा.

image

कुछ गलत सलत लिखकर फ़ार्म जमा करें. आपको त्रुटि संदेश मिलेगा

image

और सही लिखकर जमा करें

image 

तो बोलिए है ना आसान? और समय भी बहुत कम लगा. वैसे ये तो बहुत ही छोटा सा लेख था. और अधिक जानकारी के लिए आप इधर का रुख कर सकते हैं:

http://www.phpcaptcha.org/Securimage_Docs/Securimage/classes/Securimage.html

 

एक और महत्वपूर्ण बात. जब मैं यह लेख लिख रहा था तब ये पता चला कि यदि आपकी showimg.php फ़ाइल यूनिकोड में हो तो कैप्चा नही दिखता है. अत: यदि आपको को भी कैप्चा नही दिख रहा है तो इसे ANSI में कर लें.

image

यह स्क्रीनशाट Notepad++ का है.

गुरुवार, 28 जनवरी 2010

कोड इग्नाइटर के अनुप्रयोग को कमांड लाइन से चलाइए

कोड इग्नाइटर के यूआरएल कुछ इस प्रकार होते हैं:
http://example.com/index.php/work/doit/
इनमें क्वेरी स्ट्रिंग जैसा कुछ नही होता है.

सामान्यत: आप कोड इग्नाइटर से बने अनुप्रयोग को कमांड लाइन पर नही चला सकते हैं. परंतु मुझे इंटरनेट पर एक तरीका मिला है जिससे ये संभव हो सकता है.

एक फ़ाइल cmd.php नाम से बनाएं और उसमें निम्न लिखित कोड लिखें. इस फ़ाइल को अपने कोड इग्नाइटर वाले अनुप्रयोग की index.php फ़ाइल के बगल में रख दें अर्थात रूट फ़ोल्डर में.



if (isset($_SERVER['REMOTE_ADDR'])) {
die('Command Line Only!');
}


set_time_limit(0);


$_SERVER['PATH_INFO'] = $_SERVER['REQUEST_URI'] = $argv[1];


require dirname(__FILE__) . '/index.php';

अब यदि आप कमांड लाइन से work नामक कंट्रोलर के doit फ़ंग्शन को चलाना चाहते हैं तो आपको कुछ इस प्रकार लिखना होगा:

php   cmd.php   "work/doit"

कृपया ध्यान दें कि मैंने php कमांड का प्रयोग किया है क्योंकि ये मेरे कम्प्यूटर के इन्वायरमेंट वैरिएबल के रूप में परिभाषित है. जिससे php कमांड देने से php.exe फ़ाइल अपनी जगह से निष्पादित हो जाती है. यदि आपके कम्प्यूटर में ये काम नही कर रहा है तो आपको php.exe का पूरा पाथ लिखना पड़ेगा 

c:\php\php.exe   cmd.php   "work/doit"


बुधवार, 27 जनवरी 2010

कोड इग्नाइटर के लिए sqlsrv का ड्राइवर

यदि आप PHP में वेब डेवलपमेंट के लिए कोड इग्नाइटर का प्रयोग कर रहे हैं तो आपको पता होगा कि उसमें MSSQL का ड्राइवर होता है जो कि पीएचपी के mssql एक्सटेंशन का प्रयोग करता है.
माइक्रोसाफ़्ट नें स्वयं भी MSSQL का एक्सटेंशन विकसित किया है. इसे SQLSRV के नाम से जाना जाता है.
परंतु कोड इग्नाइटर में इसका ड्राइवर नही होता है. इस पोस्ट में मैं कोड इग्नाइटर में SQLSRV को प्रयोग करने के बारे में बताउंगा.

SQLSRV को आप यहां से डाउनलोड कर सकते हैं. (http://www.microsoft.com/downloads/details.aspx?FamilyID=ccdf728b-1ea0-48a8-a84a-5052214caad9&displaylang=en)
एक बार इसे डाउनलोड करने के बाद जिप फ़ाइल से एक्सटेंशनों को निकाल लें फ़िर उपयुक्त एक्सटेंशन को अपनी पीएचपी की एक्स्टेंशन वाली डायरेक्ट्री में डाल दें. ये सामान्यत: ext नाम की होती है.
अब php.ini फ़ाइल को खोलें और उसमें
extension=php_sqlsrv_52_ts_vc6.dll
एक्स्टेंशनों वाली सूची के पास लिख दें. ध्यान रहे मैंने php_sqlsrv_52_ts_vc6.dll  नाम लिखा है क्योंकि मैं इसी एक्सटेंशन का प्रयोग कर रहा था. आप जिस एक्सटेंशन का प्रयोग कर रहे हों उसी का नाम लिखें.

अब सर्वर दोबारा चालू करें. और phpinfo() फ़ंग्शन का प्रयोग करके जांच लें कि SQLSRV नामक प्रविष्टि उसमें आ गई है या नही.

कोड इग्नाइटर के लिए SQLSRV का ड्राइवर यहां से डाउनलोड किया जा सकता है:
http://www.kaweb.co.uk/wp-content/2008/07/ci_php_sqlsrv.zip

इसके अंदर से SQLSRV वाले फ़ोल्डर को निकालकर अपने कोड इग्नाइटर के system\database\drivers वाले फ़ोल्डर में डाल दें.

अब जब भी आपको इस ड्राइवर का प्रयोग करना हो तो अपनी डाटाबेस विन्यास/कांफ़िगरेशन फ़ाइल में dbdriver के आगे sqlsrv लिखकर प्रयोग करें.

एक दिक्कत मुझे इस SQLSRV को प्रयोग करते हुए आई कि कोड इग्नाइटर db_set_charset फ़ंग्शन की त्रुटि दिखा रहा था. कह रहा था कि ये फ़ंग्शन उपलब्ध नही है. मैंने इसे ठीक करने के लिए निम्नलिखित कोड sqlsrv_driver.php फ़ाइल में CI_DB_sqlsrv_driver क्लास के अंतर्गत लिख दिया.

 function db_set_charset($charset, $collation)
{
return TRUE;
}
त्रुटि संदेश आना बंद हो गया

दूसरी दिक्कत तारीखों को लेकर थी. जबतक मैं ODBC का प्रयोग कर रहा था तब तक तारीखों वाले कालमों को प्रदर्शित करने के लिए echo भर से से काम चल जा रहा था परंतु जब SQLSRV का प्रयोग किया तो त्रुटि मिली कि DateTime Object को String में बदलना संभव नही है.
मेरे DateTime कालम का नाम था ContPDate जिसे प्रदर्शित करने के लिए मैं कुछ इस प्रकार का कोड उपयोग कर रहा था:

foreach($q->result() as $r) {
                $dt = $r->ContPDate;
echo $dt;
}

परंतु ये कोड केवल ODBC के साथ काम कर रहा था.
SQLSRV के लिए थोड़ी मशक्कत के बाद मुझे ये हल मिल गया

foreach($q->result() as $r) {
                $dt = $r->ContPDate->format('Y-m-d H:i:s.000');
echo $dt;
}

यानि कि गड़बड़ ये थी कि $r->ContPDate एक DateTime Object था. जिसे प्रदर्शित करने के लिए format नामक विधि की जरूरत थी. format method, DateTime Class के अंतर्गत है.


SQLSRV के बारे में और अधिक जानकारी के लिए इधर जाएं:
http://msdn.microsoft.com/en-us/library/cc296172(SQL.90).aspx
इस ब्लाग में प्रकाशित सामग्री कापीराईट द्वारा सुरक्षित है. बिना अनुमति इसका किसी भी प्रकार से अन्यत्र प्रयोग/प्रकाशन मूल रूप में/बदल कर उपयोग नही किया जा सकता है.

हिंदी में तकनीकी लेखन को प्रोत्साहित करें

please donate अभी तक वेब डेवलपमेंट अथवा प्रोग्रामिंग आदि से संबंधित जानकारी पर अंग्रेजी का एकाधिकार रहा है. भारत में इतने आई टी गुरू होने के बावजूद भारतीय भाषाओं में इस विषय पर लेखन नगण्य है. इस ब्लाग के माध्यम से मैं हिन्दी भाषिओं तक वेब डेवलपमेंट का ज्ञान पहुंचाने की कोशिश कर रहा हूं. अत: आप सभी से अनुरोध है कि हिंदी में तकनीकी लेखन के लिये सहयोग करें
मैं वेबसाइटें भी बनाता हूं. यदि आपको बनवानी हो तो बताएं.

इस ब्लॉग में खोजें

फ़ॉलोअर