diff --git a/src/includes/class.db.mysql.php b/src/includes/class.db.mysql.php index f32b921..63731e7 100644 --- a/src/includes/class.db.mysql.php +++ b/src/includes/class.db.mysql.php @@ -178,6 +178,12 @@ class Database_Mysql extends Database_Abstract return '`'. $column. '` LIKE '. $this->quoteForLike($format, $string); } + function ciEquals(string $column, string $value): string + { + $column = str_replace('`', '``', $column); + return 'LOWER(`'. $column. '`) = LOWER('. $this->quote($value). ')'; + } + function lastInsertId(?string $name = null): ?string { $ret = $this->dbh->lastInsertId(); diff --git a/src/includes/class.db.mysqli.php b/src/includes/class.db.mysqli.php index 93b9d8c..679e9bc 100644 --- a/src/includes/class.db.mysqli.php +++ b/src/includes/class.db.mysqli.php @@ -151,6 +151,12 @@ class Database_Mysqli extends Database_Abstract return '`'. $column. '` LIKE '. $this->quoteForLike($format, $string); } + function ciEquals(string $column, string $value): string + { + $column = str_replace('`', '``', $column); + return 'LOWER(`'. $column. '`) = LOWER('. $this->quote($value). ')'; + } + function tableExists(string $table): bool { $r = $this->sq("SELECT 1 FROM information_schema.tables WHERE TABLE_SCHEMA = ? AND TABLE_NAME = ?", diff --git a/src/includes/class.db.postgres.php b/src/includes/class.db.postgres.php index 776c557..3a8e57e 100644 --- a/src/includes/class.db.postgres.php +++ b/src/includes/class.db.postgres.php @@ -181,6 +181,12 @@ class Database_Postgres extends Database_Abstract return '"'. $column. '" ILIKE '. $this->quoteForLike($format, $string); } + function ciEquals(string $column, string $value): string + { + $column = str_replace('"', '""', $column); + return 'LOWER("'. $column. '") = LOWER('. $this->quote($value). ')'; + } + function lastInsertId(?string $name = null): ?string { $ret = $this->dbh->lastInsertId(); diff --git a/src/includes/class.db.sqlite3.php b/src/includes/class.db.sqlite3.php index 0f80b4a..546c105 100644 --- a/src/includes/class.db.sqlite3.php +++ b/src/includes/class.db.sqlite3.php @@ -188,6 +188,15 @@ class Database_Sqlite3 extends Database_Abstract return 'utf8_lower("'. $column. '") LIKE '. $this->quoteForLike($format, $this->utf8_lower($string)); } + function ciEquals(string $column, string $value): string + { + $column = str_replace('"', '""', $column); + if ($this->useNormalizedUtf8) { + return 'utf8_normalized_lower("'. $column. '") = '. $this->quote($this->utf8_normalized_lower($value)); + } + return 'utf8_lower("'. $column. '") = '. $this->quote($this->utf8_lower($value)); + } + function lastInsertId(?string $name = null): ?string { $ret = $this->dbh->lastInsertId(); diff --git a/src/includes/class.dbconnection.php b/src/includes/class.dbconnection.php index 389510c..aa8e44a 100644 --- a/src/includes/class.dbconnection.php +++ b/src/includes/class.dbconnection.php @@ -55,6 +55,7 @@ abstract class Database_Abstract abstract function quote($value): string; abstract function quoteForLike(string $format, string $string): string; abstract function like(string $column, string $format, string $string): string; + abstract function ciEquals(string $column, string $value): string; abstract function lastInsertId(?string $name = null): ?string; abstract function tableExists(string $table): bool; abstract function tableFieldExists(string $table, string $field): bool; diff --git a/src/includes/class.dbcore.php b/src/includes/class.dbcore.php index 2191188..313d93e 100644 --- a/src/includes/class.dbcore.php +++ b/src/includes/class.dbcore.php @@ -191,7 +191,7 @@ class DBCore function getTagIdsByName(string $name): array { $db = DBConnection::instance(); - $q = $db->dq("SELECT id FROM {$db->prefix}tags WHERE ". $db->like('name', '%s', $name)); + $q = $db->dq("SELECT id FROM {$db->prefix}tags WHERE ". $db->ciEquals('name', $name)); $a = []; while ($r = $q->fetchAssoc()) { $a[] = (int) $r['id'];