Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

PHP mysql_stmt::fetch () PHP को घातक त्रुटि मेमोरी समाप्त कर देता है

आप पाएंगे कि यह केवलहो रहा है जब @status NULL है या एक स्ट्रिंग।

समस्या दुगनी है:

  1. स्थानीय चर के विपरीत , MySQL उपयोगकर्ता चर डेटाटाइप के बहुत सीमित सेट का समर्थन करते हैं:

    दस्तावेज़ यह उल्लेख करने में विफल रहता है कि वास्तविक डेटाटाइप क्रमशः BIGINT . का उपयोग किया जाता है , DECIMAL(65,30) , DOUBLE , LONGBLOB , LONGTEXT और LONGBLOB . पिछले एक के बारे में, मैनुअल कम से कम स्पष्ट करता है:

    संग्रहण इनमें से पहले तीन डेटाटाइप्स (यानी पूर्णांक, दशमलव और फ्लोटिंग-पॉइंट मानों के लिए) को क्रमशः 8, 30 और 8 बाइट्स की आवश्यकता होती है। अन्य डेटाटाइप (यानी स्ट्रिंग और NULL . के लिए) मान) की आवश्यकता है (अधिकतम) 4 गीगाबाइट भंडारण की।

  2. चूंकि आप v5.4.0 से पहले PHP के एक संस्करण का उपयोग कर रहे हैं, डिफ़ॉल्ट MySQL ड्राइवर libmysql , जिसके साथ डेटा बाइंडिंग पर सर्वर से केवल कॉलम प्रकार मेटाडेटा उपलब्ध होता है—इसलिए MySQLi हर संभव मान को होल्ड करने के लिए पर्याप्त मेमोरी आवंटित करने का प्रयास करता है (भले ही पूर्ण बफर की अंततः आवश्यकता न हो); इस प्रकार NULL - और स्ट्रिंग-मूल्यवान उपयोगकर्ता चर, जिनका अधिकतम संभव आकार 4GiB है, PHP को इसकी डिफ़ॉल्ट मेमोरी सीमा (PHP v5.2.0 के बाद से 128MiB की) से अधिक होने का कारण बनता है।

आपके विकल्पों में शामिल हैं:

  • तालिका परिभाषा में कॉलम डेटाटाइप को ओवरराइड करना:

    DROP TEMPORARY TABLE IF EXISTS tmp_table;
    CREATE TEMPORARY TABLE tmp_table (
      status VARCHAR(2)
    ) SELECT @status AS status;
    
  • स्पष्ट रूप से कास्टिंग अधिक विशिष्ट डेटाटाइप के लिए उपयोगकर्ता चर:

    DROP TEMPORARY TABLE IF EXISTS tmp_table;
    CREATE TEMPORARY TABLE tmp_table
      SELECT CAST(@status AS CHAR(2)) AS status;
    
  • स्थानीय चरों का उपयोग करना, जिन्हें एक स्पष्ट डेटाटाइप के साथ घोषित किया गया है:

    DECLARE status VARCHAR(2) DEFAULT @status;
    DROP TEMPORARY TABLE IF EXISTS tmp_table;
    CREATE TEMPORARY TABLE tmp_table
      SELECT status;
    
  • mysqli_stmt::store_result() . पर कॉल करके समस्या का समाधान करना पहले mysqli_stmt::bind_result() , जो परिणामसेट को libmysql (PHP की मेमोरी सीमा के बाहर) में संग्रहीत करने का कारण बनता है और फिर PHP इसे लाने पर रिकॉर्ड रखने के लिए आवश्यक वास्तविक मेमोरी आवंटित करेगा:

    $stmt->execute();
    $stmt->store_result();
    $stmt->bind_result( $status );
    $stmt->fetch();
    
  • PHP की मेमोरी लिमिट बढ़ाना ताकि यह 4GiB बफ़र्स के आवंटन को समायोजित कर सके (हालाँकि ऐसा करने से हार्डवेयर संसाधनों पर पड़ने वाले प्रभावों के बारे में पता होना चाहिए) - उदाहरण के लिए, स्मृति बाधाओं को पूरी तरह से दूर करने के लिए (हालाँकि ऐसा करने से संभावित नकारात्मक दुष्प्रभावों से अवगत रहें, जैसे वास्तविक मेमोरी लीक से):

    ini_set('memory_limit', '-1');
    
  • PHP को फिर से संकलित करना, मूल mysqlnd ड्राइवर का उपयोग करने के लिए कॉन्फ़िगर किया गया (v5.3.0 से PHP के साथ शामिल है, लेकिन libmysql के बजाय PHP v5.4.0 तक डिफ़ॉल्ट के रूप में कॉन्फ़िगर नहीं किया गया है:

    )
    ./configure --with-mysqli=mysqlnd
    
  • PHP v5.4.0 या बाद के संस्करण में अपग्रेड करना ताकि डिफ़ॉल्ट रूप से mysqlnd का उपयोग किया जा सके।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. हाइव (0.13.1) तालिका में डेटा कैसे सम्मिलित करें?

  2. MySQL ट्रिगर किसी अन्य तालिका में सम्मिलित करें

  3. कमांड लाइन के माध्यम से लिनक्स पर MySQL डेटाबेस दिखाएं (सूची)

  4. MySQL के लिए कॉलम नाम में वाइल्डकार्ड

  5. MySQL में FORCE INDEX - मैं इसे कहाँ रखूँ?