根据这个问题,我有 2 个表Source
和details
.
Source
表如下:
+----+----------+---------------+-----------+
| id | item_name|items_download | category |
+----+----------+---------------+-----------+
| |
+----+----------+---------------+-----------+
details
表如下:
+------+----------+-----+------+
| name | download | time| ip |
+------+----------+-----+------+
| |
+------+----------+-----+------+
第一步,我想从源表中获取数据(实时),并通过以下代码放入详细信息表中:
$get= "INSERT INTO `details` (`name`, `download`) SELECT `Source`.`item_name`,`Source`.`items_download` FROM `Source`"
下一步,我想获取每个文件的访问者 IP 地址。
例如,如果有人下载了testfile
我想有这个输出:
+----------+---------+--------------+-----------+
| name | download | time | ip |
+----------+----------+-------------+-----------+
| testfile | 32 |download time|192.168.0.0|
+----------+----------+-------------+-----------+
| file2 | 0 | | |
+----------+----------+-------------+-----------+
为此,我使用以下代码:
$ip = $_SERVER['REMOTE_ADDR'];
$update = "UPDATE details SET ip = '$ip', dldate = NOW()"
但它发生在所有文件上,所有文件都获得相同的 IP 和时间。我知道它需要一个条件WHERE
但我不知道我应该输入什么作为条件来获取下载的每个文件的 IP 地址。
恕
我直言,您不需要任何更新查询。您只需在每次用户请求文件时执行插入:
<?php
$fileid = $_GET['fileid'];
$pdo = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');
$sql = "SELECT * FROM Source WHERE id=" . (int)$fileid;
foreach ($pdo->query($sql) as $row) {
$statement = $pdo->prepare("INSERT INTO details (name, download, time, ip) VALUES (?, ?, NOW(), ?)");
$statement->execute(array(
$row['item_name'],
$row['items_download'],
$_SERVER['REMOTE_ADDR'],
));
}
?>
关于上述代码的一些提示:
- 使用预准备语句 - 切勿将任何值直接注入 SQL 字符串。
- 每次都将file_name和items_download插入详细信息表中可能毫无用处。无论如何,您在"源"表中都有此信息。因此,通常您只需将 Source.id 放入详细信息表中。
您应该使用第一个表视图中的id
列,但它在后面的表中逐渐消失。
id
列也应该是PRIMARY_KEY AUTO INCREMENT
列。然后,每一行都有自己唯一的索引 ID。但除此之外,您使用什么来识别用户下载的文件?如果是文件名,则只需使用它:
编辑:将id
列添加到details
表中!
$update = "UPDATE details SET ip = '$ip', dldate = NOW()
WHERE name = '$fileNameValue' LIMIT 1"
在相关说明中,您不能使用相同的速记引用更新多个列device = ip = '$ip'
您必须单独指定每个列并插入绝对目标数据(此处为变量)。
如果这是一个错别字,您应该编辑并更新您的问题。
另请参阅Gerfried关于使用准备好的陈述的答案,它们是您应该做这些事情的方式。
我认为您需要
在用户下载文件并将其添加到WHERE
条件时获取用户的会话。