mirror of
https://github.com/processwire/processwire.git
synced 2025-08-12 09:44:38 +02:00
Update WireDatabasePDO::pdoType() to fix issue in reader/writer detection when query had leading whitespace or newlines in unexpected locations
This commit is contained in:
@@ -526,31 +526,36 @@ class WireDatabasePDO extends Wire implements WireDatabase {
|
|||||||
/**
|
/**
|
||||||
* Return correct PDO instance type (reader or writer) based on given statement
|
* Return correct PDO instance type (reader or writer) based on given statement
|
||||||
*
|
*
|
||||||
* @param string|\PDOStatement $statement
|
* @param string|\PDOStatement $query
|
||||||
* @param bool $getName Get name of PDO type rather than instance? (default=false)
|
* @param bool $getName Get name of PDO type rather than instance? (default=false)
|
||||||
* @return \PDO|string
|
* @return \PDO|string
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
protected function pdoType(&$statement, $getName = false) {
|
protected function pdoType(&$query, $getName = false) {
|
||||||
|
|
||||||
$reader = 'reader';
|
$reader = 'reader';
|
||||||
$writer = 'writer';
|
$writer = 'writer';
|
||||||
|
|
||||||
if(!$this->reader['has']) return $getName ? $writer : $this->pdoWriter();
|
if(!$this->reader['has'] || !is_string($query)) {
|
||||||
|
// no reader available or query is PDOStatement, or other: always return writer
|
||||||
|
// todo support for inspecting PDOStatement?
|
||||||
|
return $getName ? $writer : $this->pdoWriter();
|
||||||
|
}
|
||||||
|
|
||||||
|
// statement is just first 40 characters of query
|
||||||
|
$statement = trim(str_replace(array("\n", "\t", "\r"), " ", substr($query, 0, 40)));
|
||||||
|
|
||||||
if($statement === $writer || $statement === $reader) {
|
if($statement === $writer || $statement === $reader) {
|
||||||
|
// reader or writer requested by name
|
||||||
$type = $statement;
|
$type = $statement;
|
||||||
} else if(!$this->reader['has']) {
|
|
||||||
$type = $writer;
|
|
||||||
} else if(!is_string($statement)) {
|
|
||||||
// PDOStatement or other, always return write
|
|
||||||
// @todo add support for inspection of PDOStatement
|
|
||||||
$type = $writer;
|
|
||||||
} else if(stripos($statement, 'select') === 0) {
|
} else if(stripos($statement, 'select') === 0) {
|
||||||
|
// select query is always reader
|
||||||
$type = $reader;
|
$type = $reader;
|
||||||
} else if(stripos($statement, 'insert') === 0) {
|
} else if(stripos($statement, 'insert') === 0) {
|
||||||
|
// insert query is always writer
|
||||||
$type = $writer;
|
$type = $writer;
|
||||||
} else {
|
} else {
|
||||||
|
// other query to inspect further
|
||||||
$pos = strpos($statement, ' ');
|
$pos = strpos($statement, ' ');
|
||||||
$word = strtolower(($pos ? substr($statement, 0, $pos) : $statement));
|
$word = strtolower(($pos ? substr($statement, 0, $pos) : $statement));
|
||||||
if($word === 'set') {
|
if($word === 'set') {
|
||||||
|
Reference in New Issue
Block a user