
该错误源于在 MariaDB 中误用 SQL Server 特有的 GETDATE() 函数,而 MariaDB 不支持该函数;应改用 CURDATE() 或 DATE(NOW()) 替代,并确保日期比较逻辑与字段类型匹配。
该错误源于在 mariadb 中误用 sql server 特有的 getdate() 函数,而 mariadb 不支持该函数;应改用 curdate() 或 date(now()) 替代,并确保日期比较逻辑与字段类型匹配。
在本地开发环境(如 XAMPP + MariaDB)中遇到类似错误:
A Database Error Occurred Error Number: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'GETDATE())' at line 1
根本原因是:GETDATE() 是 Microsoft SQL Server / Sybase 的专有函数,MariaDB(及 MySQL)完全不识别它。你在代码中直接复制了 SQL Server 的写法:
$q = $this->db->query("SELECT MAX(RIGHT(DaftarNomor,2)) AS kd_max FROM TDaftarTelepon_Coba WHERE DaftarTanggal = CONVERT(date, GETDATE())");✅ 正确做法是使用 MariaDB 原生的日期函数。根据你的需求——“查询当天记录”,推荐以下两种等效、安全的写法:
✅ 推荐方案一(简洁清晰,推荐)
$date = date('Y-m-d'); // PHP 获取当前日期字符串
$q = $this->db->query(
"SELECT MAX(RIGHT(DaftarNomor, 2)) AS kd_max
FROM TDaftarTelepon_Coba
WHERE DaftarTanggal = ?",
[$date]
);✅ 优势:使用参数化查询(
?占位符),彻底避免 SQL 注入;语义明确;兼容所有日期类型(DATE/ DATETIME)。
✅ 推荐方案二(纯 SQL 实现,无需 PHP 变量)
$q = $this->db->query(
"SELECT MAX(RIGHT(DaftarNomor, 2)) AS kd_max
FROM TDaftarTelepon_Coba
WHERE DATE(DaftarTanggal) = CURDATE()"
);✅
CURDATE()返回当前日期(如'2024-06-15');DATE(DaftarTanggal)确保即使DaftarTanggal是DATETIME类型,也能正确按日期匹配。
⚠️ 注意事项:
- ❌ 避免使用
CONVERT(date, ...)—— MariaDB 的CONVERT()不支持date类型转换(仅支持CHAR,SIGNED,UNSIGNED等),这是报错的直接诱因; - ❌ 不要硬拼接变量到 SQL 字符串(如
"WHERE DaftarTanggal = '$date'"),存在严重 SQL 注入风险; - ✅ 若
DaftarTanggal字段为DATE类型,直接= CURDATE()即可;若为DATETIME,务必用DATE(DaftarTanggal) = CURDATE()或DaftarTanggal >= CURDATE() AND DaftarTanggal 提升索引效率; - ? 调试建议:先在 phpMyAdmin 或 MariaDB CLI 中手动执行 SQL,验证语法是否通过。
最后,完整修复后的代码示例(含错误处理与防注入):
$kodeunit = $this->input->post('UnitKode'); // (注意:此处未使用,可按需补充条件)
$date = date('Y-m-d');
$q = $this->db->query(
"SELECT MAX(RIGHT(DaftarNomor, 2)) AS kd_max
FROM TDaftarTelepon_Coba
WHERE DaftarTanggal = ?",
[$date]
);
$kd = '01';
if ($q && $q->num_rows() > 0 && $q->row()->kd_max !== null) {
$tmp = (int)$q->row()->kd_max + 1;
$kd = sprintf('%02d', $tmp); // 使用 %02d 更严谨(整数格式化)
}
// 后续使用 $kd...总结:跨数据库迁移时,务必注意函数兼容性——GETDATE() → CURDATE()(MariaDB/MySQL),CONVERT(..., date) → DATE() 或直接比较日期字符串。坚持参数化查询 + 显式类型意识,是写出健壮数据库代码的关键。

















