使用php返回更大的某个ID的所有结果

时间:2011-04-18 21:52:57

标签: php mysql

我正在尝试检查我的数据库并将任何新添加内容返回到数据库。

我的客户端可以传递从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

3 个答案:

答案 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条记录(最后一个ID为100)
  • 删除记录47和48
  • 添加1条记录(最后一个ID为101)
  • 查找自ID#100
  • 以来的新记录

如果使用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 ";