Commit df24a014 authored by Bernhard Posselt's avatar Bernhard Posselt
Browse files

If the execute method on the mapper receives an assoc array, it binds by value instead of index

parent 857b22c6
......@@ -184,6 +184,31 @@ abstract class Mapper {
return $entity;
}
/**
* Checks if an array is associative
* @param array $array
* @return bool true if associative
*/
private function isAssocArray(array $array) {
return array_values($array) !== $array;
}
/**
* Returns the correct PDO constant based on the value type
* @param $value
* @return PDO constant
*/
private function getPDOType($value) {
switch (gettype($value)) {
case 'integer':
return \PDO::PARAM_INT;
case 'boolean':
return \PDO::PARAM_BOOL;
default:
return \PDO::PARAM_STR;
}
}
/**
* Runs an sql query
......@@ -200,27 +225,19 @@ abstract class Mapper {
$query = $this->db->prepare($sql, $limit, $offset);
}
$index = 1; // bindParam is 1 indexed
foreach($params as $param) {
switch (gettype($param)) {
case 'integer':
$pdoConstant = \PDO::PARAM_INT;
break;
case 'boolean':
$pdoConstant = \PDO::PARAM_BOOL;
break;
default:
$pdoConstant = \PDO::PARAM_STR;
break;
if ($this->isAssocArray($params)) {
foreach ($params as $key => $param) {
$pdoConstant = $this->getPDOType($param);
$query->bindValue($key, $param, $pdoConstant);
}
} else {
$index = 1; // bindParam is 1 indexed
foreach ($params as $param) {
$pdoConstant = $this->getPDOType($param);
$query->bindValue($index, $param, $pdoConstant);
$index++;
}
}
$result = $query->execute();
......
......@@ -47,6 +47,7 @@ class ExampleMapper extends Mapper {
public function findOneEntity($table, $id){ return $this->findEntity($table, $id); }
public function findAllEntities($table){ return $this->findEntities($table); }
public function mapRow($row){ return $this->mapRowToEntity($row); }
public function execSql($sql, $params){ return $this->execute($sql, $params); }
}
......@@ -187,6 +188,15 @@ class MapperTest extends MapperTestUtility {
}
public function testAssocParameters() {
$sql = 'test';
$params = [':test' => 1, ':a' => 2];
$this->setMapperResult($sql, $params);
$this->mapper->execSql($sql, $params);
}
public function testUpdate(){
$sql = 'UPDATE `*PREFIX*table` ' .
'SET ' .
......
......@@ -56,7 +56,30 @@ abstract class MapperTestUtility extends \Test\TestCase {
$this->fetchAt = 0;
}
/**
* Checks if an array is associative
* @param array $array
* @return bool true if associative
*/
private function isAssocArray(array $array) {
return array_values($array) !== $array;
}
/**
* Returns the correct PDO constant based on the value type
* @param $value
* @return PDO constant
*/
private function getPDOType($value) {
switch (gettype($value)) {
case 'integer':
return \PDO::PARAM_INT;
case 'boolean':
return \PDO::PARAM_BOOL;
default:
return \PDO::PARAM_STR;
}
}
/**
* Create mocks and set expected results for database queries
......@@ -117,25 +140,20 @@ abstract class MapperTestUtility extends \Test\TestCase {
}
));
if ($this->isAssocArray($arguments)) {
foreach($arguments as $key => $argument) {
$pdoConstant = $this->getPDOType($argument);
$this->query->expects($this->at($this->queryAt))
->method('bindValue')
->with($this->equalTo($key),
$this->equalTo($argument),
$this->equalTo($pdoConstant));
$this->queryAt++;
}
} else {
$index = 1;
foreach($arguments as $argument) {
switch (gettype($argument)) {
case 'integer':
$pdoConstant = \PDO::PARAM_INT;
break;
case 'NULL':
$pdoConstant = \PDO::PARAM_NULL;
break;
case 'boolean':
$pdoConstant = \PDO::PARAM_BOOL;
break;
default:
$pdoConstant = \PDO::PARAM_STR;
break;
}
$pdoConstant = $this->getPDOType($argument);
$this->query->expects($this->at($this->queryAt))
->method('bindValue')
->with($this->equalTo($index),
......@@ -144,6 +162,7 @@ abstract class MapperTestUtility extends \Test\TestCase {
$index++;
$this->queryAt++;
}
}
$this->query->expects($this->at($this->queryAt))
->method('execute')
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment