评价本身也能填「观后感受」
- lib/db.php:reviews 表新增 feelings 列。建表语句里带上,同时补一条 ALTER TABLE 迁移 —— 上一版已经上线过没有该列的 reviews 表,老库要能自动补列。 - lib/reviews.php:saveReview() 接收感受并落库;getMovieReviews()/getMyReview() 把 feelings 解析成 key 列表(旧记录为 NULL → 空数组,不报错)。 - detail.php:评价表单加了「我看完的感受(可多选)」,与讨论用的是同一套感受; 修改评价时原勾选自动回填,取消勾选即清空;已保存的感受在评价正文下方以只读标签展示。 感受仍然只存 key(happy/sad/…),emoji 与文案统一在 feelingCatalog() 里维护。
This commit is contained in:
@@ -55,8 +55,9 @@
|
|||||||
- **打分 1-10**:详情页「💬 评价与讨论」区块里点数字即可打分,右侧实时显示「7 分 · 不错」;打分用的是原生单选框,禁用 JS 也能照常提交。
|
- **打分 1-10**:详情页「💬 评价与讨论」区块里点数字即可打分,右侧实时显示「7 分 · 不错」;打分用的是原生单选框,禁用 JS 也能照常提交。
|
||||||
- **写评价**:一段正文(最多 5000 字)。**每个账号对每部电影只有一条评价**,再次提交即修改,页面上会标注「已编辑」。
|
- **写评价**:一段正文(最多 5000 字)。**每个账号对每部电影只有一条评价**,再次提交即修改,页面上会标注「已编辑」。
|
||||||
- **讨论**:任意账号都能在任意一条评价下面参与讨论(正文最多 1000 字)。
|
- **讨论**:任意账号都能在任意一条评价下面参与讨论(正文最多 1000 字)。
|
||||||
- **观后感受(可多选)**:发讨论时可以勾选自己的观后感受,每种感受一个专属 emoji:😄 开心、🥹 感动、🥰 温暖、🤩 激动、🤔 深思、😰 紧张、😨 恐惧、😲 震惊、😢 难受、😠 气愤、😴 无聊、😵 困惑。勾选多少个都行,展示时按固定顺序排列。
|
- **观后感受(可多选)**:**写评价时**和**发讨论时**都可以勾选自己的观后感受,每种感受一个专属 emoji:😄 开心、🥹 感动、🥰 温暖、🤩 激动、🤔 深思、😰 紧张、😨 恐惧、😲 震惊、😢 难受、😠 气愤、😴 无聊、😵 困惑。勾选多少个都行(最多 6 个),展示时按固定顺序排列。
|
||||||
- 感受只把 key(如 `happy`)存进数据库,emoji 与文案统一在 `lib/reviews.php` 的 `feelingCatalog()` 里维护,**以后换 emoji / 改文案都不用动数据**。
|
- 评价上的感受会显示在这条评价正文下面;修改评价时原来勾的会自动带上,取消勾选即清空。
|
||||||
|
- 感受只把 key(如 `happy`)存进数据库(`reviews.feelings` / `review_comments.feelings`),emoji 与文案统一在 `lib/reviews.php` 的 `feelingCatalog()` 里维护,**以后换 emoji / 改文案都不用动数据**。
|
||||||
- **评分概况**:详情页标题栏显示「N 条评价 · 均分 X」;首页列表卡片上有评价的电影会显示 `⭐ 均分`。
|
- **评分概况**:详情页标题栏显示「N 条评价 · 均分 X」;首页列表卡片上有评价的电影会显示 `⭐ 均分`。
|
||||||
- **删除**:只能删除**自己**的评价与讨论;删除评价时其下的讨论一并删除。删除电影时也会清掉对应的评价与讨论(SQLite 默认未开启外键级联,由程序手动清理)。
|
- **删除**:只能删除**自己**的评价与讨论;删除评价时其下的讨论一并删除。删除电影时也会清掉对应的评价与讨论(SQLite 默认未开启外键级联,由程序手动清理)。
|
||||||
|
|
||||||
@@ -157,7 +158,7 @@ MovieLog_Server/
|
|||||||
| `persons` | 观影人 | `name`(唯一)、`color`、`avatar` |
|
| `persons` | 观影人 | `name`(唯一)、`color`、`avatar` |
|
||||||
| `viewers` | 电影 ↔ 观影人关联 | `movie_id`、`person_id`、`name`(历史遗留字段) |
|
| `viewers` | 电影 ↔ 观影人关联 | `movie_id`、`person_id`、`name`(历史遗留字段) |
|
||||||
| `movie_photos` | 电影多图 | `movie_id`、`photo_path`、`created_at` |
|
| `movie_photos` | 电影多图 | `movie_id`、`photo_path`、`created_at` |
|
||||||
| `reviews` | 电影评价 | `movie_id`、`admin_id`(评价人是账号,不是观影人)、`rating`(1-10)、`content`、`created_at`、`updated_at`;**`(movie_id, admin_id)` 上有唯一索引**,保证一个账号一部电影只一条 |
|
| `reviews` | 电影评价 | `movie_id`、`admin_id`(评价人是账号,不是观影人)、`rating`(1-10)、`content`、`feelings`(写评价时选的观后感受,同样是 JSON 数组)、`created_at`、`updated_at`;**`(movie_id, admin_id)` 上有唯一索引**,保证一个账号一部电影只一条 |
|
||||||
| `review_comments` | 评价下的讨论 | `review_id`、`admin_id`、`content`、`feelings`(感受 key 的 JSON 数组,如 `["happy","sad"]`)、`created_at` |
|
| `review_comments` | 评价下的讨论 | `review_id`、`admin_id`、`content`、`feelings`(感受 key 的 JSON 数组,如 `["happy","sad"]`)、`created_at` |
|
||||||
| `settings` | 键值配置与缓存 | `name`(唯一)、`value`。存存储驱动选择、各云厂商配置、图片访问方式等;**云厂商密钥以 `enc:v1:gcm:` 前缀密文落库**(密钥文件 `db/.settings.key`,首次保存时自动生成,**丢失后密文不可恢复**) |
|
| `settings` | 键值配置与缓存 | `name`(唯一)、`value`。存存储驱动选择、各云厂商配置、图片访问方式等;**云厂商密钥以 `enc:v1:gcm:` 前缀密文落库**(密钥文件 `db/.settings.key`,首次保存时自动生成,**丢失后密文不可恢复**) |
|
||||||
|
|
||||||
@@ -268,9 +269,10 @@ server {
|
|||||||
|
|
||||||
1. 打开任意一部电影的详情页,滚到最下面的「💬 评价与讨论」。
|
1. 打开任意一部电影的详情页,滚到最下面的「💬 评价与讨论」。
|
||||||
2. **打分**:点「我的评分」后面的 1-10 任意一个数字(选中会变橙色),旁边实时显示「几分 · 怎么样」。
|
2. **打分**:点「我的评分」后面的 1-10 任意一个数字(选中会变橙色),旁边实时显示「几分 · 怎么样」。
|
||||||
3. **写评价**:在下面文本框里写正文,点「📝 发表评价」。
|
3. **写评价**:在下面文本框里写正文;再到「我看完的感受(可多选)」里勾几个感受 emoji,点「📝 发表评价」。
|
||||||
- 已经评价过时,这一块会变成「✏️ 修改我的评价」,按钮是「💾 保存修改」——同一部电影不会留下两条你的评价。
|
- 已经评价过时,这一块会变成「✏️ 修改我的评价」,按钮是「💾 保存修改」——同一部电影不会留下两条你的评价,**原来勾的感受会自动带上**,取消勾选就是清掉。
|
||||||
4. **参与讨论**:在别人的(或自己的)任意一条评价下面,写一句话,顺手勾几个**观后感受**(😄 🥹 🥰 🤩 🤔 😰 😨 😲 😢 😠 😴 😵,可多选),点「💬 发表讨论」。
|
- 评价保存后,感受会以只读小标签显示在这条评价正文下面。
|
||||||
|
4. **参与讨论**:在别人的(或自己的)任意一条评价下面,写一句话,同样可以勾选感受,点「💬 发表讨论」。
|
||||||
- 讨论会带上评价人的头像、昵称,以及你选的感受 emoji。
|
- 讨论会带上评价人的头像、昵称,以及你选的感受 emoji。
|
||||||
5. **删除**:自己发的评价和讨论,右侧有删除按钮(别人的没有);删评价时下面的讨论会一起删掉。
|
5. **删除**:自己发的评价和讨论,右侧有删除按钮(别人的没有);删评价时下面的讨论会一起删掉。
|
||||||
|
|
||||||
|
|||||||
+35
-2
@@ -35,6 +35,7 @@ if (isset($_SESSION['rv_flash'])) {
|
|||||||
$rvError = ''; // 评价表单的错误
|
$rvError = ''; // 评价表单的错误
|
||||||
$rvFormRating = 0;
|
$rvFormRating = 0;
|
||||||
$rvFormContent = '';
|
$rvFormContent = '';
|
||||||
|
$rvFormFeelings = []; // 评价表单里已勾选的观后感受
|
||||||
$rvCommentErrId = 0; // 哪一条评价的讨论表单报错
|
$rvCommentErrId = 0; // 哪一条评价的讨论表单报错
|
||||||
$rvCommentErr = '';
|
$rvCommentErr = '';
|
||||||
|
|
||||||
@@ -43,6 +44,7 @@ $myReview = getMyReview($id, $adminId);
|
|||||||
if ($myReview) {
|
if ($myReview) {
|
||||||
$rvFormRating = (int)$myReview['rating'];
|
$rvFormRating = (int)$myReview['rating'];
|
||||||
$rvFormContent = $myReview['content'];
|
$rvFormContent = $myReview['content'];
|
||||||
|
$rvFormFeelings = $myReview['feelings'];
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($_SERVER['REQUEST_METHOD'] === 'POST' && $adminId > 0) {
|
if ($_SERVER['REQUEST_METHOD'] === 'POST' && $adminId > 0) {
|
||||||
@@ -54,8 +56,11 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && $adminId > 0) {
|
|||||||
if ($rvAction === 'save_review') {
|
if ($rvAction === 'save_review') {
|
||||||
$rating = (int)($_POST['rating'] ?? 0);
|
$rating = (int)($_POST['rating'] ?? 0);
|
||||||
$content = trim((string)($_POST['content'] ?? ''));
|
$content = trim((string)($_POST['content'] ?? ''));
|
||||||
|
$feelings = normalizeFeelings($_POST['feelings'] ?? []);
|
||||||
$rvFormRating = $rating;
|
$rvFormRating = $rating;
|
||||||
$rvFormContent = $content;
|
$rvFormContent = $content;
|
||||||
|
// 出错重渲染时把用户勾过的感受带回去,不用重新勾一遍
|
||||||
|
$rvFormFeelings = $feelings;
|
||||||
|
|
||||||
if ($rating < 1 || $rating > 10) {
|
if ($rating < 1 || $rating > 10) {
|
||||||
$rvError = '请先选一个 1-10 的评分';
|
$rvError = '请先选一个 1-10 的评分';
|
||||||
@@ -63,7 +68,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && $adminId > 0) {
|
|||||||
$rvError = '评价内容不能为空';
|
$rvError = '评价内容不能为空';
|
||||||
} elseif (reviewTextLength($content) > REVIEW_CONTENT_MAX) {
|
} elseif (reviewTextLength($content) > REVIEW_CONTENT_MAX) {
|
||||||
$rvError = '评价内容太长了(最多 ' . REVIEW_CONTENT_MAX . ' 字)';
|
$rvError = '评价内容太长了(最多 ' . REVIEW_CONTENT_MAX . ' 字)';
|
||||||
} elseif (saveReview($id, $adminId, $rating, $content)) {
|
} elseif (saveReview($id, $adminId, $rating, $content, $feelings)) {
|
||||||
$_SESSION['rv_flash'] = ['type' => 'success', 'msg' => $myReview ? '评价已更新' : '评价已发布'];
|
$_SESSION['rv_flash'] = ['type' => 'success', 'msg' => $myReview ? '评价已更新' : '评价已发布'];
|
||||||
header('Location: detail.php?id=' . $id . '#reviews');
|
header('Location: detail.php?id=' . $id . '#reviews');
|
||||||
exit;
|
exit;
|
||||||
@@ -685,6 +690,10 @@ $hasGallery = !empty($gallery);
|
|||||||
gap: 6px;
|
gap: 6px;
|
||||||
margin: 4px 0 2px;
|
margin: 4px 0 2px;
|
||||||
}
|
}
|
||||||
|
/* 评价正文下面展示的感受,跟正文一样缩进到头像右侧 */
|
||||||
|
.rv-item > .rv-feelings {
|
||||||
|
margin-left: 44px;
|
||||||
|
}
|
||||||
.rv-comment-form {
|
.rv-comment-form {
|
||||||
margin-left: 44px;
|
margin-left: 44px;
|
||||||
}
|
}
|
||||||
@@ -759,7 +768,8 @@ $hasGallery = !empty($gallery);
|
|||||||
.rv-content,
|
.rv-content,
|
||||||
.rv-updated,
|
.rv-updated,
|
||||||
.rv-comments,
|
.rv-comments,
|
||||||
.rv-comment-form {
|
.rv-comment-form,
|
||||||
|
.rv-item > .rv-feelings {
|
||||||
margin-left: 0;
|
margin-left: 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1074,6 +1084,19 @@ $hasGallery = !empty($gallery);
|
|||||||
<?php endif; ?>
|
<?php endif; ?>
|
||||||
<textarea name="content" class="rv-textarea" maxlength="<?= REVIEW_CONTENT_MAX ?>"
|
<textarea name="content" class="rv-textarea" maxlength="<?= REVIEW_CONTENT_MAX ?>"
|
||||||
placeholder="这部电影怎么样?剧情、表演、画面、音效……随便聊聊"><?= h($rvFormContent) ?></textarea>
|
placeholder="这部电影怎么样?剧情、表演、画面、音效……随便聊聊"><?= h($rvFormContent) ?></textarea>
|
||||||
|
<div class="rv-feeling-pick">
|
||||||
|
<span class="rv-pick-label">我看完的感受(可多选)</span>
|
||||||
|
<div class="feel-chips">
|
||||||
|
<?php foreach ($feelings as $fkey => $f): ?>
|
||||||
|
<label class="feel-chip feel-pick" title="<?= h($f['label']) ?>">
|
||||||
|
<input type="checkbox" name="feelings[]" value="<?= h($fkey) ?>"<?= in_array($fkey, $rvFormFeelings, true) ? ' checked' : '' ?>>
|
||||||
|
<span class="feel-inner">
|
||||||
|
<span class="feel-emoji"><?= $f['emoji'] ?></span><span class="feel-label"><?= h($f['label']) ?></span>
|
||||||
|
</span>
|
||||||
|
</label>
|
||||||
|
<?php endforeach; ?>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
<div class="rv-form-foot">
|
<div class="rv-form-foot">
|
||||||
<span class="rv-hint">每个账号对每部电影只有一条评价,再次提交即为修改。</span>
|
<span class="rv-hint">每个账号对每部电影只有一条评价,再次提交即为修改。</span>
|
||||||
<button type="submit" class="btn btn-primary btn-sm"><?= $myReview ? '💾 保存修改' : '📝 发表评价' ?></button>
|
<button type="submit" class="btn btn-primary btn-sm"><?= $myReview ? '💾 保存修改' : '📝 发表评价' ?></button>
|
||||||
@@ -1110,6 +1133,16 @@ $hasGallery = !empty($gallery);
|
|||||||
<?php endif; ?>
|
<?php endif; ?>
|
||||||
</div>
|
</div>
|
||||||
<div class="rv-content"><?= h($rv['content']) ?></div>
|
<div class="rv-content"><?= h($rv['content']) ?></div>
|
||||||
|
<?php if (!empty($rv['feelings'])): ?>
|
||||||
|
<div class="rv-feelings">
|
||||||
|
<?php foreach ($rv['feelings'] as $fkey): ?>
|
||||||
|
<?php $f = feelingInfo($fkey); if (!$f) continue; ?>
|
||||||
|
<span class="feel-chip is-static" title="观后感受:<?= h($f['label']) ?>">
|
||||||
|
<span class="feel-emoji"><?= $f['emoji'] ?></span><span class="feel-label"><?= h($f['label']) ?></span>
|
||||||
|
</span>
|
||||||
|
<?php endforeach; ?>
|
||||||
|
</div>
|
||||||
|
<?php endif; ?>
|
||||||
<?php if (!empty($rv['updated_at']) && $rv['updated_at'] !== $rv['created_at']): ?>
|
<?php if (!empty($rv['updated_at']) && $rv['updated_at'] !== $rv['created_at']): ?>
|
||||||
<div class="rv-updated">已编辑 <?= h(substr((string)$rv['updated_at'], 0, 16)) ?></div>
|
<div class="rv-updated">已编辑 <?= h(substr((string)$rv['updated_at'], 0, 16)) ?></div>
|
||||||
<?php endif; ?>
|
<?php endif; ?>
|
||||||
|
|||||||
@@ -103,6 +103,7 @@ function initDB() {
|
|||||||
// 电影评价表
|
// 电影评价表
|
||||||
// 评价人是「登录账号」(admins)——不是观影人(persons / viewers):
|
// 评价人是「登录账号」(admins)——不是观影人(persons / viewers):
|
||||||
// 没一起去看的人只要有账号,也能打分、写评价并参与讨论。
|
// 没一起去看的人只要有账号,也能打分、写评价并参与讨论。
|
||||||
|
// feelings:写评价时选的「观后感受」,与评论里的感受同一套目录、同一种存法。
|
||||||
$db->exec("
|
$db->exec("
|
||||||
CREATE TABLE IF NOT EXISTS reviews (
|
CREATE TABLE IF NOT EXISTS reviews (
|
||||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
@@ -110,6 +111,7 @@ function initDB() {
|
|||||||
admin_id INTEGER NOT NULL,
|
admin_id INTEGER NOT NULL,
|
||||||
rating INTEGER NOT NULL,
|
rating INTEGER NOT NULL,
|
||||||
content TEXT NOT NULL,
|
content TEXT NOT NULL,
|
||||||
|
feelings TEXT,
|
||||||
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
||||||
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
||||||
FOREIGN KEY (movie_id) REFERENCES movies(id) ON DELETE CASCADE,
|
FOREIGN KEY (movie_id) REFERENCES movies(id) ON DELETE CASCADE,
|
||||||
@@ -146,6 +148,8 @@ function initDB() {
|
|||||||
try { $db->exec("ALTER TABLE viewers ADD COLUMN person_id INTEGER REFERENCES persons(id) ON DELETE SET NULL"); } catch (PDOException $e) {}
|
try { $db->exec("ALTER TABLE viewers ADD COLUMN person_id INTEGER REFERENCES persons(id) ON DELETE SET NULL"); } catch (PDOException $e) {}
|
||||||
// 新增:管理员关联观影人
|
// 新增:管理员关联观影人
|
||||||
try { $db->exec("ALTER TABLE admins ADD COLUMN person_id INTEGER REFERENCES persons(id) ON DELETE SET NULL"); } catch (PDOException $e) {}
|
try { $db->exec("ALTER TABLE admins ADD COLUMN person_id INTEGER REFERENCES persons(id) ON DELETE SET NULL"); } catch (PDOException $e) {}
|
||||||
|
// 新增:评价本身也可以带观后感受(评价表先于该字段上线过一版,故需要迁移)
|
||||||
|
try { $db->exec("ALTER TABLE reviews ADD COLUMN feelings TEXT"); } catch (PDOException $e) {}
|
||||||
|
|
||||||
// ===== 迁移旧数据 =====
|
// ===== 迁移旧数据 =====
|
||||||
// 将 viewers.name 迁移到 persons
|
// 将 viewers.name 迁移到 persons
|
||||||
|
|||||||
+16
-5
@@ -115,6 +115,11 @@ function getMovieReviews($movie_id) {
|
|||||||
");
|
");
|
||||||
$stmt->execute([$movie_id]);
|
$stmt->execute([$movie_id]);
|
||||||
$reviews = $stmt->fetchAll();
|
$reviews = $stmt->fetchAll();
|
||||||
|
foreach ($reviews as &$review) {
|
||||||
|
// 评价本身带的观后感受(JSON 字符串 → key 列表)
|
||||||
|
$review['feelings'] = parseStoredFeelings($review['feelings'] ?? '');
|
||||||
|
}
|
||||||
|
unset($review);
|
||||||
attachCommentsToReviews($reviews);
|
attachCommentsToReviews($reviews);
|
||||||
return $reviews;
|
return $reviews;
|
||||||
}
|
}
|
||||||
@@ -155,6 +160,9 @@ function getMyReview($movie_id, $admin_id) {
|
|||||||
$stmt = $db->prepare("SELECT * FROM reviews WHERE movie_id = ? AND admin_id = ?");
|
$stmt = $db->prepare("SELECT * FROM reviews WHERE movie_id = ? AND admin_id = ?");
|
||||||
$stmt->execute([$movie_id, $admin_id]);
|
$stmt->execute([$movie_id, $admin_id]);
|
||||||
$row = $stmt->fetch();
|
$row = $stmt->fetch();
|
||||||
|
if ($row) {
|
||||||
|
$row['feelings'] = parseStoredFeelings($row['feelings'] ?? '');
|
||||||
|
}
|
||||||
return $row ?: null;
|
return $row ?: null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -213,13 +221,15 @@ function attachReviewStatsToMovies(array &$movies) {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 发表 / 修改评价。一个账号对一部电影只保留一条:已有则更新,没有则插入。
|
* 发表 / 修改评价。一个账号对一部电影只保留一条:已有则更新,没有则插入。
|
||||||
|
* $feelings 是评价人自己选的观后感受 key 数组(可以为空)。
|
||||||
* 调用前请自行校验 rating 在 1-10、content 非空且未超长。
|
* 调用前请自行校验 rating 在 1-10、content 非空且未超长。
|
||||||
* 成功返回 true。
|
* 成功返回 true。
|
||||||
*/
|
*/
|
||||||
function saveReview($movie_id, $admin_id, $rating, $content) {
|
function saveReview($movie_id, $admin_id, $rating, $content, array $feelings = []) {
|
||||||
$db = getDB();
|
$db = getDB();
|
||||||
$rating = (int)$rating;
|
$rating = (int)$rating;
|
||||||
$content = trim((string)$content);
|
$content = trim((string)$content);
|
||||||
|
$feelings = normalizeFeelings($feelings);
|
||||||
if ($rating < 1 || $rating > 10 || $content === '' || (int)$admin_id <= 0) {
|
if ($rating < 1 || $rating > 10 || $content === '' || (int)$admin_id <= 0) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -232,15 +242,16 @@ function saveReview($movie_id, $admin_id, $rating, $content) {
|
|||||||
|
|
||||||
if ($existing) {
|
if ($existing) {
|
||||||
$stmt = $db->prepare("
|
$stmt = $db->prepare("
|
||||||
UPDATE reviews SET rating = ?, content = ?, updated_at = CURRENT_TIMESTAMP
|
UPDATE reviews SET rating = ?, content = ?, feelings = ?, updated_at = CURRENT_TIMESTAMP
|
||||||
WHERE id = ?
|
WHERE id = ?
|
||||||
");
|
");
|
||||||
$stmt->execute([$rating, $content, $existing['id']]);
|
$stmt->execute([$rating, $content, feelingsToJson($feelings), $existing['id']]);
|
||||||
} else {
|
} else {
|
||||||
$stmt = $db->prepare("
|
$stmt = $db->prepare("
|
||||||
INSERT INTO reviews (movie_id, admin_id, rating, content) VALUES (?, ?, ?, ?)
|
INSERT INTO reviews (movie_id, admin_id, rating, content, feelings)
|
||||||
|
VALUES (?, ?, ?, ?, ?)
|
||||||
");
|
");
|
||||||
$stmt->execute([$movie_id, $admin_id, $rating, $content]);
|
$stmt->execute([$movie_id, $admin_id, $rating, $content, feelingsToJson($feelings)]);
|
||||||
}
|
}
|
||||||
$db->commit();
|
$db->commit();
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
Reference in New Issue
Block a user