PHP

ID #67

Why does PHPLIB sessions give me a MySQL Database error?

Applies to: Grid System

PHPLIB version 7.2b and 7.2c sometimes throw an error similar to:

Database error: Invalid SQL: insert into active_sessions ( sid, name, val, changed ) values ('096b796cb7f48fa6fcd118c1e6854e72', 'example_sessions', 'dR0xPQkFMU1snYXV0aCddc7IA==', '20010101151401')
MySQL Error: 1062 (Duplicate entry 'example_sessions-096b796cb7f48fa6fcd118c1e6854e72' for key 1)
Session halted.


To fix this, first get the file ct_sql.inc from phplib 7.2c. It is ok if you are using 7.2b, just get this one file if you do not want to completely upgrade phplib.

Now find the function ac_store() in the file ct_sql.inc. That whole function should be changed to this:


function ac_store($id, $name, $str) {
$ret = true;

switch ( $this->encoding_mode ) {
case "slashes":
$str = addslashes($name . ":" . $str);
break;

case "base64":
default:
$str = base64_encode($name . ":" . $str);
};

$name = addslashes($name);

## update duration of visit
global $HTTP_REFERER, $HTTP_USER_AGENT, $REMOTE_ADDR;

$now = date("YmdHis", time());
$uquery = sprintf("update %s set val='%s', changed='%s' where sid='%s' and name='%s'",
$this->database_table,
$str,
$now,
$id,
$name);
$squery = sprintf("select count(*) from %s where val='%s' and changed='%s' and sid='%s' and name='%s'",
$this->database_table,
$str,
$now,
$id,
$name);
$iquery = sprintf("insert into %s ( sid, name, val, changed ) values ('%s', '%s', '%s', '%s')",
$this->database_table,
$id,
$name,
$str,
$now);

$this->db->query($uquery);

# FIRST test to see if any rows were affected.
# Zero rows affected could mean either there were no matching rows
# whatsoever, OR that the update statement did match a row but made
# no changes to the table data (i.e. UPDATE tbl SET col = 'x', when
# "col" is _already_ set to 'x') so then,
# SECOND, query(SELECT...) on the sid to determine if the row is in
# fact there,
# THIRD, verify that there is at least one row present, and if there
# is not, then
# FOURTH, insert the row as we've determined that it does not exist.

if ( $this->db->affected_rows() <= 0
&& $this->db->query($squery)
&& $this->db->next_record()
&& $this->db->f(0) == 0
&& !$this->db->query($iquery)) {

$ret = false;
}
return $ret;
}

Last update: 2010-09-29 16:36
Author: FAQ Admin
Revision: 1.2

Digg it! Share on Facebook Print this record Send FAQ to a friend Show this as PDF file
Please rate this FAQ:

Average rating: 0 (0 Votes)

completely useless 1 2 3 4 5 most valuable

You can comment this FAQ