2012-11-06 12 views
6

थोड़ी सी पीडीओ समस्या है, कि मैं थोड़ी देर के लिए काम कर रहा हूं। चूंकि मुझे नहीं पता कि यहां क्या गलत है, मैंने इसे इस सूची में लेने के बारे में सोचा। शायद आप में से कुछ और जानें ...php/pdo/msql - पहुंच से इनकार किया गया

मेरे पास एक लॉगिन के साथ एक वेबसाइट है जो एक उपयोगकर्ता और एक MySQL संचालित डेटाबेस के खिलाफ एक पासवर्ड की जांच करता है। जब एक ही फाइल में पीडीओ कनेक्शन बनाया जाता है तो सभी ठीक काम करते हैं, कोई भी बिना किसी समस्या के लॉग इन कर सकता है। बस के रूप में यह काम करने के लिए माना जाता है ...

हालांकि, जब एक अलग समारोह है, जो मैं किसी अन्य फ़ाइल से शामिल करने के लिए डेटाबेस कनेक्शन हिस्सा चलती, पीडीओ मुझ पर विफल रहता है, और मुझे देता है:

SQLSTATE[28000] [1045] Access denied for user '...'@'...' (using password: NO) Fatal error: Call to a member function prepare() on a non-object in /.../.../... on line 41

संस्करण 1::

यह काम करता है:

स्पष्टता रखने के लिए, यहाँ कोड है

यहाँ संस्करण 2

है यह काम नहीं करता:

<?php 
     require "./vars_and_functions.php"; 

     /* open database connection */ 
     $pdo = database_connection(); 



    /* query */ 
      $query = "SELECT uname, passw FROM members WHERE uname = ? AND passw = ?"; 
      $q = $pdo->prepare($query); 
      $q->execute(array($u_name, $p_word_md5)); 
      $result = $q->rowCount(); 

     if($result == 1) { /* we have a match */      
       /* close the database connection */ 
        $pdo = null; 

        /* and redirect */ 
        header("..."); 

     } /* if */ 
     else { /* wrong credentials */ 
      /* close the database connection */     
        $pdo = null; 

        /* and go back to the login page */ 
      header("..."); 
     } /* else */ 
      } /* try */ 
    catch(PDOException $e) { 
     echo $e->getMessage(); 
    } /* catch */ 
?> 

मेरे includefile vars_and_functions.php इस तरह दिखता है:

$db_host = "...";  
$db_name = "...";   
$db_user = "...";  
$db_pass = "...";  

function database_connection() { 
    try { 
    $pdo = new PDO("mysql:host=$db_host;dbname=$db_name", $db_user, $db_pass); 
} 
catch(PDOException $e) { 
    echo $e->getMessage(); 
} 

return $pdo; 
} 

मेरे मन को केवल वास्तविक अंतर है यहां, पीडीओ कनेक्शन फ़ंक्शन कॉल के माध्यम से किया जाता है, जबकि फ़ंक्शन फ़ाइल vars_and_functions.php फ़ाइल में बैठता है।

क्या गलत है?

+0

'error_reporting' सक्षम करें, जो आपको बताएगा कि वेरिएबल स्थानीय चरणीय क्षेत्र में चर उपलब्ध नहीं हैं। – mario

+0

ठीक है दोस्तों, मुझे एहसास है कि कोड की प्रस्तुति यहां थोड़ा गन्दा दिखती है। मैं इसे सही करने पर काम कर रहा हूं ... – user1803765

उत्तर

3

आपका समारोह database_connection() सही दायरे में कनेक्शन चर प्राप्त नहीं होता है, तो वे सेट नहीं हैं जब कनेक्शन का प्रयास किया गया है और इसलिए NULL के रूप में पारित कर दिया, और localhost को पीडीओ चूक कनेक्शन होस्ट।

कार्य करने के लिए मानकों के रूप में उन्हें दर्रा:

// Defined at global scope... 
$db_host = "...";  
$db_name = "...";   
$db_user = "...";  
$db_pass = "...";  

// Pass the 4 variables as parameters to the function, since they were defined at global 
// scope. 
function database_connection($db_host, $db_name, $db_user, $db_pass) { 
    try { 
    $pdo = new PDO("mysql:host=$db_host;dbname=$db_name", $db_user, $db_pass); 
} 

// Called as: 
$pdo = database_connection($db_host, $db_name, $db_user, $db_pass); 

यदि आप हैं केवल कनेक्शन समारोह के अंदर उन वैरिएबल का उपयोग और, कहीं उन्हें जरूरत नहीं है, उन्हें समारोह के दायरे में परिभाषित करने पर विचार जो आपको पैरामीटर के रूप में गुजरने से बचाता है।

function database_connection() { 
    try { 
    $pdo = new PDO("mysql:host={$GLOBALS['db_host']};dbname={$GLOBALS['db_name']}", $GLOBALS['db_user'], $GLOBALS['db_pass']); 
} 

नोट:

function database_connection() { 
    // Only needed here, so define in function scope 
    $db_host = "...";  
    $db_name = "...";   
    $db_user = "...";  
    $db_pass = "...";  

    try { 
    $pdo = new PDO("mysql:host=$db_host;dbname=$db_name", $db_user, $db_pass); 
} 

अंतिम और अक्सर कम से कम वांछनीय विकल्प वैश्विक क्षेत्र के रूप में आप क्या किया है पर वैरिएबल निर्धारित है, लेकिन समारोह में $GLOBALS[] से उन तक पहुँच (या global कीवर्ड) करने के लिए है कि यदि आप error_reporting के साथ विकसित हो रहे हैं और display_errors चालू होना चाहिए, तो आपको अपरिभाषित चर के बारे में नोटिस दिखाई देंगे।

error_reporting(E_ALL); 
ini_set('display_errors', 1); 
+0

उचित लगता है, लेकिन मुझे नहीं लगता कि यह वास्तविक समस्या है। यदि ऐसा होता है, तो पीडीओ को पहले स्थान पर कनेक्शन स्थापित करना संभव नहीं होगा। मेरे फ़ंक्शन में एक कोशिश करने और पकड़ने का ब्लॉक है और यह वहां असफल हो जाएगा। जिस बिंदु पर यह विफल रहता है, वह तब होता है जब स्क्रिप्ट क्वेरी निष्पादित करती है। – user1803765

+0

@ user1803765 ​​पीडीओ अभी भी इन वर्रों के बिना कनेक्ट करने का प्रयास करेगा - यह 'लोकलहोस्ट', डिफ़ॉल्ट उपयोगकर्ता और रिक्त पासवर्ड का उपयोग करेगा और डीबी –

+0

@ user1803765 ​​का चयन नहीं करेगा क्योंकि एडम ने कहा है, पीडीओ लोकलहोस्ट पर डिफ़ॉल्ट होगा। मुझे याद नहीं है कि पीडीओ इस तरह php.ini में कॉन्फ़िगर करने योग्य है, लेकिन MySQL और MySQLi एक्सटेंशन दोनों में php.ini –

0

माइकल Berkowski के जवाब के अलावा, आप भी वैश्विक कीवर्ड इसलिए की तरह पारित कर सकते हैं:

function database_connection() { 
    global $db_host, $db_name, etc; 
    // your code here 
} 

PHP में चर गुंजाइश के बारे में अधिक जानकारी के लिए http://php.net/manual/en/language.variables.scope.php देखें।

संबंधित मुद्दे

 संबंधित मुद्दे