These are the tables:
create table tracker(
ip varchar( 32 ) primary key,
http_refererid int unsigned,
unixtime int,
index( http_refererid )
)engine = InnoDB;
/*******************************************************************************
*******************************************************************************/
create table referer(
id int unsigned auto_increment primary key,
referer text,
unique( referer( 16 ))
)engine = InnoDB;
This is the code:
qd_query( "set autocommit = 0" );
/******************************************************************************/
$_Sql = sprintf( "
select 1 from tracker
where tracker.ip = %s
for update
"
, quote_smart( $_SERVER['REMOTE_ADDR'] )
) ;
if( mysql_fetch_assoc( qd_query ( $_Sql ))){
error_log( "{$_SERVER['REMOTE_ADDR']} already visited." );
qd_query( "set autocommit = 1" );
return;
}
/******************************************************************************/
$_Sql = sprintf( "
select referer.id from referer
where referer.referer = %s
for update
"
, quote_smart( $_SERVER['HTTP_REFERER'] )
) ;
if( $_Referer = mysql_fetch_assoc( qd_query ( $_Sql ))){
$_Refererid = $_Referer['id'];
error_log( "{$_SERVER['REMOTE_ADDR']} first visit. Referer {$_Refererid}".
" has history." );
}else{
/******************************************************************************/
$_Sql = sprintf ( "
insert into referer set
referer.referer = %s
"
, quote_smart( $_SERVER['HTTP_REFERER'] )
) ;
qd_query ( $_Sql ) ;
$_Refererid = mysql_insert_id();
error_log( "{$_SERVER['REMOTE_ADDR']} first visit. New referer {$_Refererid}." );
}
/******************************************************************************/
$_Sql = sprintf ( "
insert into tracker set
tracker.ip = %s
, tracker.http_refererid = %u
, tracker.unixtime = %d
"
, quote_smart( $_SERVER['REMOTE_ADDR'] )
, $_Refererid
, time()
);
qd_query ( $_Sql );
qd_query( "set autocommit = 1" );
Table "referer" shows the following sequence of ids:
1
2
3
4
7
8
10
11
12
16
17
Why are some numbers being skipped?
I am aware of this page http://dev.mysql.com/doc/refman/5.1/en/innodb-auto-increment-handling.html#innodb-auto-increment-configurable
But aparently my code doesn't do any rollbacks, I only do the simple insert shown above, and I never delete any rows.
My MySQL version is 5.1.41-3ubuntu12.10
create table tracker(
ip varchar( 32 ) primary key,
http_refererid int unsigned,
unixtime int,
index( http_refererid )
)engine = InnoDB;
/*******************************************************************************
*******************************************************************************/
create table referer(
id int unsigned auto_increment primary key,
referer text,
unique( referer( 16 ))
)engine = InnoDB;
This is the code:
qd_query( "set autocommit = 0" );
/******************************************************************************/
$_Sql = sprintf( "
select 1 from tracker
where tracker.ip = %s
for update
"
, quote_smart( $_SERVER['REMOTE_ADDR'] )
) ;
if( mysql_fetch_assoc( qd_query ( $_Sql ))){
error_log( "{$_SERVER['REMOTE_ADDR']} already visited." );
qd_query( "set autocommit = 1" );
return;
}
/******************************************************************************/
$_Sql = sprintf( "
select referer.id from referer
where referer.referer = %s
for update
"
, quote_smart( $_SERVER['HTTP_REFERER'] )
) ;
if( $_Referer = mysql_fetch_assoc( qd_query ( $_Sql ))){
$_Refererid = $_Referer['id'];
error_log( "{$_SERVER['REMOTE_ADDR']} first visit. Referer {$_Refererid}".
" has history." );
}else{
/******************************************************************************/
$_Sql = sprintf ( "
insert into referer set
referer.referer = %s
"
, quote_smart( $_SERVER['HTTP_REFERER'] )
) ;
qd_query ( $_Sql ) ;
$_Refererid = mysql_insert_id();
error_log( "{$_SERVER['REMOTE_ADDR']} first visit. New referer {$_Refererid}." );
}
/******************************************************************************/
$_Sql = sprintf ( "
insert into tracker set
tracker.ip = %s
, tracker.http_refererid = %u
, tracker.unixtime = %d
"
, quote_smart( $_SERVER['REMOTE_ADDR'] )
, $_Refererid
, time()
);
qd_query ( $_Sql );
qd_query( "set autocommit = 1" );
Table "referer" shows the following sequence of ids:
1
2
3
4
7
8
10
11
12
16
17
Why are some numbers being skipped?
I am aware of this page http://dev.mysql.com/doc/refman/5.1/en/innodb-auto-increment-handling.html#innodb-auto-increment-configurable
But aparently my code doesn't do any rollbacks, I only do the simple insert shown above, and I never delete any rows.
My MySQL version is 5.1.41-3ubuntu12.10