MDL-53481 availability: Fix uniqueness of SQL named param placeholders
Static variables do not behave the way you might expect when accessing them through the classes inheritance. When accessing a method via self:: or static:: operators, even though the method is inherited, its variable scope is not. So the method unique_sql_parameter() was using the scope of the child class and each child class had its own sequence of usp1, usp2, usp3, ... placeholders. This led to "Incorrect number of query parameters" error when multiuple condition classes were contributing to a single SQL query. All credit should go to Adam Olley who debugged and described the essence of the problem in the tracker.
This commit is contained in:
@@ -34,6 +34,10 @@ defined('MOODLE_INTERNAL') || die();
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
abstract class tree_node {
|
||||
|
||||
/** @var int Counter to be used in {@link tree_node::unique_sql_parameter()}. */
|
||||
protected static $uniquesqlparametercounter = 1;
|
||||
|
||||
/**
|
||||
* Determines whether this particular item is currently available
|
||||
* according to the availability criteria.
|
||||
@@ -242,10 +246,11 @@ abstract class tree_node {
|
||||
* @return SQL code for the parameter, e.g. ':pr1234'
|
||||
*/
|
||||
protected static function unique_sql_parameter(array &$params, $value) {
|
||||
static $count = 1;
|
||||
|
||||
// Note we intentionally do not use self:: here.
|
||||
$count = tree_node::$uniquesqlparametercounter++;
|
||||
$unique = 'usp' . $count;
|
||||
$params[$unique] = $value;
|
||||
$count++;
|
||||
return ':' . $unique;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user