2009-05-08 11 views
14

मैं पीडीओ विवरण में शामिल होने की कोशिश कर रहा हूं। तो मैं इस कोडित:पीडीओ अनबफर किए गए प्रश्न

$cn = getConnection(); 

// get table sequence 
$comando = "call p_generate_seq('bitacora')"; 
$id = getValue($cn, $comando); 

//$comando = 'INSERT INTO dsa_bitacora (id, estado, fch_creacion) VALUES (?, ?, ?)'; 
$comando = 'INSERT INTO dsa_bitacora (id, estado, fch_creacion) VALUES (:id, :estado, :fch_creacion)'; 
$parametros = array (
    ':id'=> (int)$id, 
    ':estado'=>1, 
    ':fch_creacion'=>date('Y-m-d H:i:s') 
); 
execWithParameters($cn, $comando, $parametros); 

मेरी getValue समारोह ठीक काम करता है, और मैं मेज के लिए अगले अनुक्रम मिलता है। लेकिन जब मैं execWithParameters में जाता हूं, तो मुझे यह अपवाद मिलता है:

PDOException: SQLSTATE[HY000]: General error: 2014 Cannot execute queries while other unbuffered queries are active. Consider using PDOStatement::fetchAll(). Alternatively, if your code is only ever going to run against mysql, you may enable query buffering by setting the PDO::MYSQL_ATTR_USE_BUFFERED_QUERY attribute. in D:\Servidor\xampp_1_7_1\htdocs\bitacora\func_db.php on line 77

मैंने कनेक्शन विशेषताओं को संशोधित करने का प्रयास किया लेकिन यह काम नहीं करता है।

ये मेरी कोर डाटाबेस कार्य हैं:

function getConnection() { 
    try { 
     $cn = new PDO("mysql:host=$host;dbname=$bd", $usuario, $clave, array(
       PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, 
      )); 

     $cn->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true); 
     return $cn; 
    } catch (PDOException $e) { 
     print "Error!: " . $e->getMessage() . "<br/>"; 
     die(); 
    } 
} 
function getValue($cn, $comando) { 
    $resul = $cn->query($comando); 
     if (!$resul) return null; 
     while($res = $resul->fetch()) { 
      $retorno = $res[0][0]; 
      break; 
     } 
     return $retorno; 
} 
function execWithParameters($cn, $comando, $parametros) { 
    $q = $cn->prepare($comando); 
    $q->execute($parametros); 
    if ($q->errorInfo() != null) { 
     $e = $q->errorInfo(); 
     echo $e[0].':'.$e[1].':'.$e[2]; 
    } 
} 

किसी ने इस के लिए एक प्रकाश डाला सकता है? पीडी। कृपया autonumeric आईडी करने का सुझाव न दें, क्योंकि मैं किसी अन्य सिस्टम से पोर्टिंग कर रहा हूं।

+0

p_generate_seq की परिभाषा क्या है? दिखाएं प्रक्रिया p_generate_seq – VolkerK

+0

समस्या वहां झूठ नहीं बोलती है, dsa_bitacora –

उत्तर

21

मुद्दा यह है कि MySQL केवल किसी दिए गए समय पर एक उत्कृष्ट कर्सर की अनुमति देता है। Fetch() विधि का उपयोग करके और सभी लंबित डेटा का उपभोग नहीं करते हुए, आप एक कर्सर खोल रहे हैं।

अनुशंसित दृष्टिकोण fetchAll() विधि का उपयोग कर सभी डेटा का उपभोग करना है। क्लोजक कर्सर() विधि का उपयोग करने का एक विकल्प है।

आप इस समारोह बदलते हैं, तो मुझे लगता है कि आप खुश हो जाएगा:

<?php 
function getValue($cn, $comando) { 
    $resul = $cn->query($comando); 
    if (!$resul) return null; 
    foreach ($resul->fetchAll() as $res) { 
      $retorno = $res[0]; 
      break; 
    } 
    return $retorno; 
} 
?> 
+0

मुझे उपरोक्त के रूप में कनेक्शन फ़ंक्शंस का उपयोग पता है लेकिन एक ही समस्या है। FetchALL() विधि मेरी मशीन पर ठीक से काम नहीं लग रहा है। आपके उत्तर के बाद से कोई सलाह या विकल्प? – JM4

8

समस्या यह प्रतीत होती है --- मैं पीडीओ से बहुत परिचित नहीं हूं --- कि आपके मिलने के बाद वेल्यू कॉल रिटर्न के बाद, क्वेरी अभी भी कनेक्शन से जुड़ी हुई है (आप केवल पहले मान के लिए पूछते हैं, फिर भी कनेक्शन कई रिटर्न देता है, या ऐसा करने की अपेक्षा करता है)।

शायद getValue वापसी से पहले

$resul->closeCursor(); 

जोड़कर तय किया जा सकता है।

अन्यथा, यदि प्राप्त करने के लिए क्वेरी हमेशा एक एकल (या कुछ पर्याप्त) मान लौटाएंगे, ऐसा लगता है कि fetchAll का उपयोग करना पसंद किया जाएगा।

+0

tx से SELECT MAX (आईडी) के साथ एक ही त्रुटि होती है ... मैंने अभी करीबी कर्सर और fetchAll कोशिश की है, और यह एक ही अपवाद को बढ़ाता रहता है। –

0

मेरे एक दोस्त को xampp 1.7.1 निर्माण के साथ बहुत ही समस्या थी। 5.2.9-2 php.net द्वारा xampp/php/* को प्रतिस्थापित करने और सभी आवश्यक फ़ाइलों को xampp/apache/bin में कॉपी करने के बाद यह ठीक काम करता है।

0

आप XAMPP 1.7.1 का उपयोग कर रहे हैं, तो आप सिर्फ 1.7.2 में नवीनीकृत करने की आवश्यकता है।

16

मुझे नहीं लगता कि PDOStatement :: closeCursor() काम करेगा यदि आप कोई क्वेरी नहीं कर रहे हैं जो डेटा लौटाता है (यानी एक अद्यतन, INSERT, आदि)।

एक बेहतर समाधान बस को सेट किए बिना() कॉल PDOStatement :: निष्पादित() के बाद अपने PDOStatement वस्तु के लिए है:

$stmt = $pdo->prepare('UPDATE users SET active = 1'); 
$stmt->execute(); 
unset($stmt); 
+0

इसे जांचना होगा, धन्यवाद –

+0

एक पीएचपी रिकर्सिव फ़ंक्शन में एक ही समस्या थी। इस उत्तर समस्या के लिए धन्यवाद इस तरह हल किया गया: $ पंक्तियां = $ sth-> fetchAll (पीडीओ :: FETCH_ASSOC); \t \t \t अनसेट ($ sth); \t \t \t foreach ($ पंक्तियों के रूप में $ पंक्तियां)। मेरे पिछले क्या था: जबकि ($ पंक्ति = $ sth-> fetch (पीडीओ :: FETCH_ASSOC))। धन्यवाद! – Alqin

2

मैं सिर्फ सभी इंटरनेट आसपास googling 15 मिनट खर्च करते हैं, कम से कम 5 अलग Stackoverflow और देखी प्रश्न, कुछ जिन्होंने दावा किया कि मेरी बग स्पष्ट रूप से PHP के गलत संस्करण, MySQL लाइब्रेरी या किसी अन्य जादुई ब्लैक-बॉक्स सामग्री के गलत संस्करण से उत्पन्न हुई है ...

मैंने अपना पूरा कोड "fetchAll" का उपयोग करके बदल दिया और मैंने भी बुलाया प्रत्येक क्वेरी के बाद क्वेरी ऑब्जेक्ट पर closeCursor() और unset()। मैं ईमानदारी से हताश हो रहा था! मैंने MYSQL_ATTR_USE_BUFFERED_QUERY ध्वज की भी कोशिश की, लेकिन यह काम नहीं किया।

अंतिम मैंने खिड़की से सबकुछ फेंक दिया और PHP त्रुटि को देखा, और कोड की रेखा को ट्रैक किया जहां यह हुआ।

SELECT AVG((original_bytes-new_bytes)/original_bytes) as saving 
    FROM (SELECT original_bytes, new_bytes FROM jobs ORDER BY id DESC LIMIT 100) AS t1 

वैसे भी, समस्या इसलिए हुआ क्योंकि मेरी original_bytes और new_bytes दोनों जहां अहस्ताक्षरित bigints, और कहा कि मतलब है कि जहां new_bytes जहां वास्तव में original_bytes से भी बड़ा है, तो मैं होता, तो मैं कभी भी एक नौकरी के लिए किया था एक गंदे MySQL "सीमा से बाहर" त्रुटि। और यह थोड़ी देर के लिए मेरी कमीशन सेवा चलाने के बाद यादृच्छिक रूप से हुआ।

मुझे यह अजीब त्रुटि देने के बजाय मुझे यह अजीब MySQL त्रुटि क्यों मिली, मेरे बाहर है! जब मैं कच्ची क्वेरी चलाता हूं तो यह वास्तव में एसक्यूएलबड्डी (हल्के PHPMyAdmin) में दिखाई देता है। मेरे पास पीडीओ अपवाद था, इसलिए इसे मुझे केवल MySQL त्रुटि दी जानी चाहिए थी।

कोई बात नहीं, लब्बोलुआब यह है:

आप कभी भी इस त्रुटि मिलती है, देखना होगा कि आपकी कच्चे MySQL वास्तव में सही और अभी भी काम कर रहा है सुनिश्चित हो !!!

+1

बस इस गूढ़ और बेकार त्रुटि का सामना करना पड़ा, और उस जवाब के लिए धन्यवाद मैंने एक पल के लिए बॉक्स के बाहर सोचा। उसी कनेक्शन पर 'चेतावनी' दिखाएं जिसमें क्वेरी विफल हो गई, इसे डीबग करने के लिए महत्वपूर्ण साबित हुआ। मेरे मामले में, त्रुटि थी: 'अज्ञात या गलत समय क्षेत्र:' यूरोप/लंदन 'जिसे मैंने पीडीओ उदाहरण बनाते समय परिभाषित किया था। धन्यवाद @ हेनरिक। –

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