Pārlūkot izejas kodu

ZF-10642
Fixed issue in Zend_Validate_Db to support positional parameters in adapters that do not support named parameters

git-svn-id: http://framework.zend.com/svn/framework/standard/trunk@23355 44c647ce-9c0f-0410-b52a-842ac1e357ba

ralph 15 gadi atpakaļ
vecāks
revīzija
a757ec1f9e

+ 11 - 7
library/Zend/Validate/Db/Abstract.php

@@ -306,10 +306,12 @@ abstract class Zend_Validate_Db_Abstract extends Zend_Validate_Abstract
              * Build select object
              */
             $select = new Zend_Db_Select($db);
-            $select->from($this->_table, array($this->_field), $this->_schema)
-                   ->where(
-                       $db->quoteIdentifier($this->_field, true).' = :value'
-                   );
+            $select->from($this->_table, array($this->_field), $this->_schema);
+            if ($db->supportsParameters('named')) {
+                $select->where($db->quoteIdentifier($this->_field, true).' = :value'); // named
+            } else {
+                $select->where($db->quoteIdentifier($this->_field, true).' = ?'); // positional
+            }
             if ($this->_exclude !== null) {
                 if (is_array($this->_exclude)) {
                     $select->where(
@@ -338,9 +340,11 @@ abstract class Zend_Validate_Db_Abstract extends Zend_Validate_Abstract
         /**
          * Run query
          */
-        $result = $select->getAdapter()->fetchRow($select,
-                                                array('value' => $value),
-                                                Zend_Db::FETCH_ASSOC);
+        $result = $select->getAdapter()->fetchRow(
+            $select,
+            array('value' => $value), // this should work whether db supports positional or named params
+            Zend_Db::FETCH_ASSOC
+            );
 
         return $result;
     }

+ 18 - 0
tests/Zend/Validate/Db/NoRecordExistsTest.php

@@ -244,4 +244,22 @@ class Zend_Validate_Db_NoRecordExistsTest extends PHPUnit_Framework_TestCase
             $this->markTestSkipped('No database available');
         }
     }
+    
+    /**
+     * 
+     * @group ZF-10705
+     */
+    public function testCreatesQueryBasedOnNamedOrPositionalAvailablity()
+    {
+        Zend_Db_Table_Abstract::setDefaultAdapter(null);
+        $this->_adapterHasResult->setSupportsParametersValues(array('named' => false, 'positional' => true));
+        $validator = new Zend_Validate_Db_RecordExists('users', 'field1', null, $this->_adapterHasResult);
+        $wherePart = $validator->getSelect()->getPart('where');
+        $this->assertEquals($wherePart[0], '("field1" = ?)');
+        
+        $this->_adapterHasResult->setSupportsParametersValues(array('named' => true, 'positional' => true));
+        $validator = new Zend_Validate_Db_RecordExists('users', 'field1', null, $this->_adapterHasResult);
+        $wherePart = $validator->getSelect()->getPart('where');
+        $this->assertEquals($wherePart[0], '("field1" = :value)');
+    }
 }

+ 11 - 1
tests/Zend/Validate/Db/_files/Db/MockHasResult.php

@@ -36,6 +36,13 @@ require_once 'Zend/Db/Adapter/Abstract.php';
  */
 class Db_MockHasResult extends Zend_Db_Adapter_Abstract
 {
+    protected $_supportsParametersValues = array('named' => true, 'positional' => true);
+    
+    public function setSupportsParametersValues(array $supportsParametersValues)
+    {
+        $this->_supportsParametersValues = $supportsParametersValues;
+    }
+    
     /**
      * Returns an array to emulate a result
      *
@@ -112,7 +119,10 @@ class Db_MockHasResult extends Zend_Db_Adapter_Abstract
     }
     public function supportsParameters($type)
     {
-        return null;
+        if (in_array($type, $this->_supportsParametersValues)) {
+            return $this->_supportsParametersValues[$type];
+        }
+        return false;
     }
     public function getServerVersion()
     {