【问题标题】:Default value on insert PHP and SQL [duplicate]插入 PHP 和 SQL 的默认值 [重复]
【发布时间】:2020-09-21 15:59:35
【问题描述】:

我想在有人将帖子插入我的数据库时做到这一点,如果他们不提供他们的姓名,则默认为匿名。我该怎么做? 我的代码在这里

$query =  "INSERT INTO cinemaPost (name, text, likes, reply_to) VALUES (?, ?, 0, NULL)";

$stmt = $conn->prepare($query);
$stmt->bindValue(1, $post_data['name']);
$stmt->bindValue(2, $post_data['post']);

$stmt->execute();

我尝试在数据库的创建表中做一个默认设置,但是当用户触发插入时,它会将其覆盖为空白字段。

CREATE TABLE CinemaPost(
  id INT AUTO_INCREMENT NOT NULL,
  name varchar(255) NOT NULL DEFAULT 'anonymous',
  text varchar(100) NOT NULL,
  post_date timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),
  likes INT NOT NULL,
  reply_to INT,
  Primary KEY (id)
); 

【问题讨论】:

标签: php sql


【解决方案1】:

仅当您没有实际插入列时才会使用默认值,即您需要从 INSERT 列列表中删除 name。例如:

if (empty($post_data['name'])) {
    $query =  "INSERT INTO cinemaPost (text, likes, reply_to) VALUES (?, 0, NULL)";
    $stmt = $conn->prepare($query);
    $stmt->bindValue(1, $post_data['post']);
}
else {
    $query =  "INSERT INTO cinemaPost (name, text, likes, reply_to) VALUES (?, ?, 0, NULL)";
    $stmt = $conn->prepare($query);
    $stmt->bindValue(1, $post_data['name']);
    $stmt->bindValue(2, $post_data['post']);
}

检查输入值并用"anonymous" 替换它可能是最简单的,如果它是空的:

$stmt->bindValue(1, empty($post_data['name']) ? 'anonymous' : $post_data['name']);

【讨论】:

  • 这个问题可能是 Stack Overflow 上的重复问题吗,Nick?你不再需要代表了。请通过关闭可关闭的问题而不是回答来帮助团队。
  • @mickmackusa 唯一一个可以被认为是重复的 - 因为它与在数据库中设置默认值有关 - 是第一个,答案有 2 个(在 3 个中) ) 其中不正确的部分(使用isset??)。此外,该问题将值直接放入使用准备好的语句的查询中。并且该问题的答案并没有解释为什么不使用表中的默认值。
  • 调整了重复项,以显示您在相应页面上获得最高投票的答案所展示的两种技术。 empty() 可能不适合愚蠢的边缘案例。 3v4l.org/rKSTW
【解决方案2】:

在 SQL 端使用DEFAULT 是绝对正确的。但是,您需要确保实际使用了该值。

仅当您从 PHP 传递 NULL 作为参数时才使用默认值。空字符串 ("") 不是 NULL

$stmt->bindValue(1, empty($post_data['name']) ? NULL : $post_data['name']);

【讨论】:

    猜你喜欢
    • 2018-03-21
    • 2015-11-11
    • 1970-01-01
    • 1970-01-01
    • 2013-01-14
    • 2020-12-11
    • 2016-08-17
    • 2012-02-05
    • 2023-03-18
    相关资源
    最近更新 更多