Files
mrbs-equbao-2026/web/lib/MRBS/Column.php
T
人事系统开发 48092cab42
Docker image / push (push) Canceled after 0s
MRBS 1.12.2 等保2.0二级整改完整提交
包含:登录失败锁定、90天密码有效期、30分钟会话超时、
强制改密、登录审计日志、屏幕水印、企业背景图、
备案信息固定底部、favicon、登录页JS修复等全部改动
2026-09-08 21:19:47 +08:00

199 lines
4.7 KiB
PHP

<?php
declare(strict_types=1);
namespace MRBS;
use ReflectionClass;
class Column
{
const NATURE_BINARY = 0;
const NATURE_BOOLEAN = 1;
const NATURE_CHARACTER = 2;
const NATURE_DECIMAL = 3;
const NATURE_INTEGER = 4;
const NATURE_JSON = 5;
const NATURE_REAL = 6;
const NATURE_TIME = 7;
const NATURE_TIMESTAMP = 8;
public $table;
public $name;
private $default;
private $is_nullable;
private $length;
private $nature;
private $type;
public function __construct(string $table, string $name)
{
$this->table = $table;
$this->name = $name;
}
/**
* Gets the default value for this column.
*
* @return null|mixed
*/
public function getDefault()
{
return $this->default;
}
public function setDefault($default) : void
{
$this->default = $default;
}
public function getIsNullable() : bool
{
return $this->is_nullable;
}
public function setIsNullable(bool $is_nullable) : void
{
$this->is_nullable = $is_nullable;
}
// Returns the column length. Can be null|int|string
// For example a DECIMAL might return "5,2".
public function getLength()
{
return $this->length;
}
// $length can be null|int|string
public function setLength($length) : void
{
$this->length = $length;
}
public function getNature() : int
{
return $this->nature;
}
public function setNature(int $nature) : void
{
$reflectionClass = new ReflectionClass($this);
$constants = $reflectionClass->getConstants();
if (!in_array($nature, array_values($constants), true))
{
throw new \Exception("Invalid nature '$nature'");
}
$this->nature = $nature;
}
public function getType() : ?string
{
return $this->type;
}
public function setType(string $type) : void
{
$this->type = $type;
}
// Gets the type ('bool', 'decimal', 'float', 'int' or 'string') to be used with get_form_var().
// TODO: this method maybe doesn't belong here.
public function getFormVarType() : string
{
switch ($this->nature)
{
case self::NATURE_CHARACTER:
$var_type = 'string';
break;
case self::NATURE_DECIMAL:
$var_type = 'decimal';
break;
case self::NATURE_INTEGER:
$var_type = ($this->isBooleanLike()) ? 'bool' : 'int';
break;
case self::NATURE_REAL:
$var_type = 'float';
break;
// We can only really deal with the types above at the moment
default:
$var_type = 'string';
break;
}
return $var_type;
}
// Sanitize a value ready for insertion in the database
public function sanitizeValue($value)
{
// Turn the booleans into 0/1 values (necessary for PostgreSQL)
if (is_bool($value))
{
$value = ($value) ? 1 : 0;
}
// Trim the strings and truncate them to the maximum field length
// (necessary for PostgreSQL which doesn't truncate them itself
// but instead will throw an error)
elseif (is_string($value))
{
// Some variables, eg decimals, will also be PHP strings, so only
// trim columns with a database nature of 'character'.
if ($this->nature === Column::NATURE_CHARACTER)
{
$value = trim($value);
$value = $this->truncate($value);
}
}
return $value;
}
public function isBooleanLike() : bool
{
// Smallints and tinyints are considered to be booleans
return (($this->nature == self::NATURE_BOOLEAN) ||
(($this->nature == self::NATURE_INTEGER) &&
(isset($this->length) && ($this->length <= 2))));
}
// Truncate any fields that have a maximum length as a precaution.
// Although the MAXLENGTH attribute may be used in the <input> tag, this can
// sometimes be ignored by the browser, for example by Firefox when
// autocompletion is used. The user could also edit the HTML and remove
// the MAXLENGTH attribute. Another problem is that the <datalist> tag
// does not accept a maxlength attribute. Passing an oversize string to some
// databases (eg some versions of PostgreSQL) results in an SQL error,
// rather than silent truncation of the string.
//
// We truncate to a maximum number of UTF8 characters rather than bytes.
// This is OK in current versions of MySQL and PostgreSQL, though in earlier
// versions of MySQL (I haven't checked PostgreSQL) this could cause problems
// as a VARCHAR(n) was n bytes long rather than n characters.
private function truncate($value)
{
$result = $value;
if (($this->nature == self::NATURE_CHARACTER) &&
isset($this->length) &&
($this->length < 256))
{
$result = mb_substr($value, 0, intval($this->length));
}
return $result;
}
}