prepare( 'SELECT note FROM person_notes WHERE person_id = ? AND viewer_id = ?' ); $st->execute([$personId, $viewerId]); $v = $st->fetchColumn(); return $v === false ? '' : (string)$v; } /** * 写入/清空。**空串等于删除这条备注** —— 不留一行空记录, * 否则"我写过又删掉"会留下一条 forever 的空行,日后分不清"没写过"与"删掉了"。 */ public static function set(int $personId, int $viewerId, string $note): void { if ($personId <= 0 || $viewerId <= 0) { return; } $note = trim($note); if ($note === '') { Database::get()->prepare( 'DELETE FROM person_notes WHERE person_id = ? AND viewer_id = ?' )->execute([$personId, $viewerId]); return; } Database::get()->prepare( 'INSERT INTO person_notes (person_id, viewer_id, note) VALUES (?,?,?) ON DUPLICATE KEY UPDATE note = VALUES(note)' )->execute([$personId, $viewerId, mb_substr($note, 0, 4000, 'UTF-8')]); } /** * 一批人的私人备注(列表页要一次取完,别逐行查 —— N+1 在名册几十人时很明显)。 * @return array person_id => note */ public static function mapFor(int $viewerId): array { if ($viewerId <= 0) { return []; } $st = Database::get()->prepare( 'SELECT person_id, note FROM person_notes WHERE viewer_id = ? AND note IS NOT NULL AND note <> ""' ); $st->execute([$viewerId]); $out = []; foreach ($st->fetchAll() as $r) { $out[(int)$r['person_id']] = (string)$r['note']; } return $out; } }