【问题标题】:copy data from one sql table to another having less number of columns and a different column将数据从一个 sql 表复制到另一个具有较少列数和不同列的表
【发布时间】:2020-12-26 14:42:05
【问题描述】:

我有一个名为 books 的 SQL 表,其中包含 Name, ID, Author, Language, Pages, Genres, and Status 列。现在,我想将此表的Name, ID, Author, and Status 列中的数据复制到另一个名为log 的表中,该表具有Name, ID, Author, Status and TimeStamp. 列。 我从我想通过 INSERT 语句发送的 PHP 代码中获取TimeStamp

这是我一直在尝试的代码:

$queryBook = $_GET['ID'];
$currentDate = date('d-m-Y H:i:s');
$stmt4 = $conn -> prepare("INSERT INTO log (Name, ID, Author, Status) SELECT (Name, ID, Author, Status), ? FROM books WHERE ID = '$queryBook'");
$stmt4 -> bind_param('s', $currentDate);
$stmt4 -> execute();

我也试过这段代码:

$stmt4 = $conn -> prepare("INSERT INTO log * SELECT Name, ID, Author, Status FROM books WHERE ID = '$queryBook'");
$stmt4 -> execute();

我收到此错误: Fatal error: Uncaught Error: Call to a member function execute() on boolean

【问题讨论】:

  • 该查询中的随机 , ? 是什么?
  • 我想添加$currentDate的值,所以我使用?来绑定参数。
  • 不要使用字符串插值或连接将值获取到 SQL 查询中。这很容易出错,并且可能使您的程序容易受到 SQL 注入攻击。使用参数化查询。见"How to include a PHP variable inside a MySQL statement""How can I prevent SQL injection in PHP?"
  • 不要这样做:$stmt4 = $conn -> prepare("INS...,这个$conn->prepare("INS... 似乎更好
  • 我没有看到日期列。您要在哪里添加日期? d-m-Y H:i:s 也不是 mysql 日期格式。

标签: php mysql sql


【解决方案1】:

您应该使用默认值设置表格中的日期时间。因此,您不需要传递它。另一方面,您应该将$queryBook 作为参数发送。因此,我建议将表日志定义为:

create table log (
   . . . 
   timestamp datetime default now()
);

那么您的代码将如下所示:

$stmt4 = $conn -> prepare("INSERT INTO log (Name, ID, Author, Status) SELECT Name, ID, Author, Status FROM books WHERE ID = ?");
$stmt4 -> bind_param('s', $queryBook);
$stmt4 -> execute();

【讨论】:

  • 添加 now() 函数的问题是,它给了我服务器的时间。我希望它给我在我的时区 IST 中的时间。
  • 时间就是时间,所以你的本地时间应该和服务器的时间一样(考虑到时区的差异)
  • 这很好@Luuk,但我希望它看起来和我的时区一样。
  • @VishalA。 . . .将服务器时间用于数据库中的行会更加安全。毕竟,应用程序的时间可能会有所不同——例如,人们可以从世界任何地方访问应用程序。或者人们可能会旅行,等等。
【解决方案2】:

我尝试了其他一些方法,最终,我成功了。

这是工作代码:

$stmt4 = $conn -> prepare("INSERT INTO log (Name, ID, Author, Status, TimeStamp) SELECT Name, ID, Author, Status, ? FROM books WHERE ID = ?");
$stmt4 -> bind_param('ss', $currentDate, $queryBook);
$stmt4 -> execute();

【讨论】:

  • timestamp 更改为 datetime 并使用 $currentDate = date('Y-m-d H:i:s'); 这将为您节省大量工作。
猜你喜欢
  • 2020-11-03
  • 2015-01-28
  • 2013-09-13
  • 2015-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-28
相关资源
最近更新 更多