2009-06-17 21 views
19

के लिए क्वेरी की जांच तो तुम कुछ इस तरह उपयोग कर सकते हैं:Zend डीबी फ्रेमवर्क एक अद्यतन

$query = $db->select(); 
$query->from('pages', array('url')); 
echo $query->__toString(); 

एसक्यूएल कि Zend Db फ्रेमवर्क कि चयन करें क्वेरी के लिए उपयोग करने के लिए जा रहा है की जांच। अद्यतन के लिए एसक्यूएल देखने के लिए एक समतुल्य तरीका है?

$data = array(
    'content'  => stripslashes(htmlspecialchars_decode($content)) 
);  
$n = $db->update('pages', $data, "url = '".$content."'"); 
?? 
+1

समाधान लेकिन __toString() एक वस्तु एक स्ट्रिंग के लिए डाला जाता है जब स्वचालित रूप से कहा जाता है, तो गूंज $ प्रश्न के संबंध न हो; – chris

उत्तर

30

उपयोग Zend_Db_Profiler को पकड़ने और SQL कथन रिपोर्ट करने के लिए:

$db->getProfiler()->setEnabled(true); 
$db->update(...); 
print $db->getProfiler()->getLastQueryProfile()->getQuery(); 
print_r($db->getProfiler()->getLastQueryProfile()->getQueryParams()); 
$db->getProfiler()->setEnabled(false); 

प्रोफाइलर बंद करने के लिए यदि आप इसे ज़रूरत नहीं है याद रखें! मैंने एक ऐसे व्यक्ति से बात की जिसने सोचा कि उसके पास मेमोरी रिसाव था, लेकिन यह प्रोफाइलर था जो वह चल रहे लाखों एसक्यूएल प्रश्नों में से प्रत्येक के लिए कुछ PHP ऑब्जेक्ट्स को तुरंत चालू कर रहा था।

पुनश्च: आपको लगता है कि प्रश्न में quoteInto() उपयोग करना चाहिए:

$n = $db->update('pages', $data, $db->quoteInto("url = ?", $content)); 
+0

टाइप करना आसान है, ऐसा हुआ। मुझे प्रोफाइलर को इंगित करने से मुझे अन्य क्षेत्रों में भी मदद मिली। –

+0

मैं इसे केवल देव में चालू रखता हूं। – joedevon

+1

अद्यतन() फ़ंक्शन का "कहां" भाग एक सरणी ले सकता है? जैसे $ db-> अपडेट ('पेज', $ डेटा, सरणी ("url =?" => $ सामग्री, "date>?" => $ Date); – caligoanimus

2

नहीं, सीधे, के बाद से Zend फ्रेमवर्क बनाता है और :: अद्यतन एडाप्टर विधि Zend_Db_Adapter_Abstract अंदर एसक्यूएल निष्पादित करता है:

/** 
* Updates table rows with specified data based on a WHERE clause. 
* 
* @param mixed  $table The table to update. 
* @param array  $bind Column-value pairs. 
* @param mixed  $where UPDATE WHERE clause(s). 
* @return int   The number of affected rows. 
*/ 
public function update($table, array $bind, $where = '') 
{ 
    /** 
    * Build "col = ?" pairs for the statement, 
    * except for Zend_Db_Expr which is treated literally. 
    */ 
    $set = array(); 
    foreach ($bind as $col => $val) { 
     if ($val instanceof Zend_Db_Expr) { 
      $val = $val->__toString(); 
      unset($bind[$col]); 
     } else { 
      $val = '?'; 
     } 
     $set[] = $this->quoteIdentifier($col, true) . ' = ' . $val; 
    } 

    $where = $this->_whereExpr($where); 

    /** 
    * Build the UPDATE statement 
    */ 
    $sql = "UPDATE " 
     . $this->quoteIdentifier($table, true) 
     . ' SET ' . implode(', ', $set) 
     . (($where) ? " WHERE $where" : ''); 

    /** 
    * Execute the statement and return the number of affected rows 
    */ 
    $stmt = $this->query($sql, array_values($bind)); 
    $result = $stmt->rowCount(); 
    return $result; 
} 

आप अस्थायी रूप से, var_dump को सम्मिलित कर सकते हैं और यह सुनिश्चित करने के लिए एसक्यूएल का निरीक्षण करने के लिए इस विधि के अंदर बाहर निकलें कि यह सही है:

/** 
* Build the UPDATE statement 
*/ 
$sql = "UPDATE " 
     . $this->quoteIdentifier($table, true) 
     . ' SET ' . implode(', ', $set) 
     . (($where) ? " WHERE $where" : ''); 
var_dump($sql); exit; 
0

मैं प्रोफेसर डेटा को जोड़कर, ZF लाइब्रेरी कोड को बदलने के बजाय वास्तविक SQL क्वेरी को लॉग इन करना चाहता हूं।

$db->getProfiler()->setEnabled(true); 

$db->update(...); 

$query = $db->getProfiler()->getLastQueryProfile()->getQuery(); 

$queryParams = $db->getProfiler()->getLastQueryProfile()->getQueryParams(); 

$logger->log('SQL: ' . $db->quoteInto($query, $queryParams), Zend_Log::DEBUG); 

$db->getProfiler()->setEnabled(false); 
+1

क्या आपने यह कोशिश की है? यह ZF 1.9.5 में काम नहीं करता है। जब आप quoteInto() को सरणी देते हैं, यह इसे अल्पविराम से अलग स्ट्रिंग में जोड़ता है, और प्रत्येक पैरामीटर प्लेसहोल्डर के परिणाम को प्रतिस्थापित करता है। इसके अलावा quoteInto() स्ट्रिंग अक्षर के अंदर प्रश्न चिह्नों के बारे में बहुत स्मार्ट नहीं है और यह नामित पैरामीटर प्लेसहोल्डर का समर्थन नहीं करता है। –

+0

नहीं। मैंने नहीं किया यह कोशिश नहीं करें कि यह Zend_Db_Profiler और Zend_Db API पर आधारित जंगली अनुमान था। सत्यापन के लिए धन्यवाद; डी – raphaelstolt

0

हाल ही में एक zend_db_statement डीबग करने का एक तरीका ढूंढने के लिए आया। यदि कोई अन्य खोज उसी खोज के साथ आता है, तो आप निम्न फ़ंक्शन का उपयोग कर सकते हैं।

बस डीबी कनेक्शन या एडाप्टर प्राप्त करने की अपनी विधि के साथ "self :: getDefaultAdapter()" को प्रतिस्थापित करें।

/** 
* replace any named parameters with placeholders 
* @param string $sql sql string with placeholders, e.g. :compCode 
* @param array $bind array keyed on placeholders, e.g. array('compCode', 'WHMA20') 
* 
* @return String sql statement with the placeholders replaced 
*/ 
public static function debugNamedParamsSql($sql, array $bind) { 
    $sqlDebug = $sql; 
    foreach($bind as $needle => $replace) { 
     $sqlDebug = str_replace( 
           ':' . $needle, 
           self::getDefaultAdapter()->quote($replace), 
           $sqlDebug 
     ); 
    }   
    return $sqlDebug;   
} 
संबंधित मुद्दे