我正在尝试检查我的数据库并将任何新添加内容返回到数据库。
我的客户端可以传递从DB收到的最后一项的ID。所以我认为这将是一个很好的起点。
因此,我将偏移量设置为我传入的ID(theid)作为php脚本的参数,并且只返回比该id更新的数据库条目?或者我是否完全咆哮错误的树?
这就是我对代码的意思
$theid = isset($_GET['theid']) ? $_GET['theid'] : "";
$type = isset($_GET['type']) ? $_GET['type'] : "global";
$offset = isset($_GET['offset']) ? $_GET['offset'] : theid;
$count = isset($_GET['count']) ? $_GET['count'] : "100";
$sort = isset($_GET['sort']) ? $_GET['sort'] : "id ASC";
// Localize the GET variables
$udid = isset($_GET['udid']) ? $_GET['udid'] : "";
$name = isset($_GET['name']) ? $_GET['name'] : "";
$clubname = isset($_GET['clubname']) ? $_GET['clubname'] : "";
// Protect against sql injections
$type = mysql_real_escape_string($type);
$offset = mysql_real_escape_string($offset);
$count = mysql_real_escape_string($count);
$sort = mysql_real_escape_string($sort);
$udid = mysql_real_escape_string($udid);
$name = mysql_real_escape_string($name);
$clubname = mysql_real_escape_string($clubname);
// Build the sql query
$sql = "SELECT * FROM $table WHERE ";
switch($type) {
case "global":
$sql .= "1 ";
break;
case "device":
$sql .= "udid = '$udid' ";
break;
case "name":
$sql .= "name = '$name' ";
break;
case "clubname":
$sql .= "clubname = '$clubname' ";
break;
}
$sql .= "ORDER BY $sort ";
$sql .= "LIMIT $offset,$count ";
$result = mysql_query($sql,$conn);
if(!$result) {
die("Error retrieving scores " . mysql_error());
}
非常感谢, -code
答案 0 :(得分:1)
假设ID是序列号,并且较新的条目总是具有比前一个更高的ID,您需要以下内容:
SELECT * FROM table WHERE id > $id;
否则,您需要为表添加时间戳,并运行两个查询:
SELECT createdAt FROM表WHERE id = $ id;
将该值分配给$ timestamp,然后运行以下命令:
SELECT * FROM table WHERE createdAt > $timestamp
您可以选择合并查询:
SELECT * FROM table WHERE createdAt > (SELECT createdAt FROM table WHERE id = $id)
使用偏移是一个坏主意。如果您的ID之前的任何记录被删除,您的结果将不准确。例如,假设发生以下情况:
如果使用100的偏移量,则不会返回任何记录。
答案 1 :(得分:0)
您可以使用LAST_INSERT_ID()
内置函数查找最后插入的ID。
SELECT @Last_id:= LAST_INSERT_id();
#now wait a while and let other inserts happen, then...
SELECT * FROM table WHERE id > @Last_id;
但是`LAST_INSERT_ID()只会在您自己的连接中为您提供最后插入的ID !。
如果您有多个连接,由于有多个Web服务器查询一个数据库,您可能会得到意外的结果。
要获得真正的最后插入ID ,当您有多个连接时,您需要为表格添加触发器。
或者仅使用一些存储过程插入,以保持插入的id的全局跟踪
或者(推荐)在表格中使用时间戳,这样您就可以看到创建行的时间。
如果向表中添加TIMESTAMP字段,则可以执行
SELECT * FROM table1 WHERE create_time > DATE_SUB(NOW(), INTERVAL 15 MINUTE)
要记录过去15分钟内添加的所有行。
如果要记录所有插入等,则必须添加触发器 这个日志会快速填满......
使用触发器: 创建一个如下所示的日志表:
Table Insert_log
id: autoincrement primary key
tablename: varchar not null
insert_time: timestamp
insert_id: integer
并为要在插入日志中跟踪的每个表添加触发器。
DELIMITER $$
CREATE TRIGGER ai_table1_each AFTER INSERT ON table1 FOR EACH ROW
BEGIN
INSERT INTO Insert_log (tablename, insert_id) VALUES ('table1', new.id);
END$$
DELIMITER ;
答案 2 :(得分:0)
将以上内容添加到$ sql。=“ORDER BY $ sort”
$sql .= "WHERE id > $theid ";