* * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ require_once(dirname(__FILE__) . '/string-lib.php'); #require_once(dirname(__FILE__) . '/random-lib.php'); require_once(dirname(__FILE__) . '/config.php'); // may be changed class QuizSession { var $_sid; // Session-ID var $_qid; // Quiz-ID var $_stored; // Session already saved? var $_db; // database handle var $_term1 = 'NULL'; var $_term2 = 'NULL'; function __construct() { $this->tidySessions(); $this->newID(); $this->_qid = mt_rand(1, $this->_getMaxQuizId()); #$this->_qid = random_int32(1, $this->_getMaxQuizId()); $this->_stored = false; } function newID() { $ip = isset($_SERVER['HTTP_X_FORWARDED_FOR']) ? $_SERVER['HTTP_X_FORWARDED_FOR'] : $_SERVER['REMOTE_ADDR']; // preparing the time aspect $msec = strtok(microtime(), ' '); $sec = strtok(' '); /* The session ID consists of: * a random integer (32 bit) * the clients port number (16 bit) * a combination of time() and the microseconds (64 bit) * the ip address (32 bit) * => number of 144 bit that will be md5'ed */ $this->_sid = md5(pack('iSd', mt_rand(), #random_int32(), $_SERVER['REMOTE_PORT'], $msec * $sec) . ip2int($ip)); } function id() { return $this->_sid; } function tidySessions() { global $connect; $q = $connect->query('DELETE FROM quiz_db_quiz_master ' . 'WHERE session_date < ' . 'DATE_SUB(NOW(), INTERVAL 7 DAY)'); if ($connect->errno) trigger_error($connect->error, E_USER_ERROR); } function displayCode() { global $connect; $q = $connect->prepare('SELECT question FROM ' . QDTP . 'quiz WHERE id=?'); $q->bind_param('i', $this->_qid); $q->execute(); $r = $q->get_result()->fetch_array(); if (! $this->_stored) { $this->_term1 = mt_rand(0, 10); $this->_term2 = mt_rand(0, 10); $this->store(); } if (strpos($r['question'], '$d1') !== FALSE) { $r['question'] = prepareString($r['question'], '$d', array($this->_term1, $this->_term2)); } return '' . "\n" . '' . "\n"; } function display() { echo $this->displayCode(); } function store() { global $connect; if ($this->_stored) return; $q = $connect->prepare('INSERT INTO '.QDTP.'quiz_master ' . '(session_id, session_date, quiz_id, term1, term2) ' . 'VALUES (?, NOW(), ?,?,?)'); $q->bind_param('siss', $this->_sid, $this->_qid, $this->_term1, $this->_term2); $q->execute(); if ($q->errno) trigger_error($q->error, E_USER_ERROR); $this->_stored = true; } function _getMaxQuizId() { global $connect; $q = $connect->query('SELECT COUNT(id) AS n FROM '.QDTP.'quiz'); $r = $q->fetch_array(); return $r['n']; } }