plugins/conversions/API/plugins conversions.php,NONE,1.1
Sebastian Bergmann <[email protected]> Sun, 11 Apr 2004 09:45:16 +0000
| Newsgroups | gmane.comp.web.phpopentracker.cvs |
|---|---|
| Message-ID | <[email protected]> |
Update of /cvsroot/phpopencounter/plugins/conversions/API/plugins In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv2596/conversions/API/plugins Added Files: conversions.php Log Message: Initial import of Conversions plugin by Daniel Kehoe and Adrian Lanning. --- NEW FILE: conversions.php --- <?php // // phpOpenTracker - The Website Traffic and Visitor Analysis Solution // // Copyright 2000 - 2004 Sebastian Bergmann. All rights reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // // $Id: conversions.php,v 1.1 2004/04/11 09:45:14 bergmann Exp $ // /** * phpOpenTracker API - Conversions (reports on sales, inquiries, and sign-ups). * * @author Daniel Kehoe <[email protected]> * @version $Revision: 1.1 $ * @since phpOpenTracker-Conversions 1.0.0 */ class phpOpenTracker_API_conversions extends phpOpenTracker_API_Plugin { /** * API Calls * * @var array $apiCalls */ var $apiCalls = array( 'num_conversions', 'conversions', 'conversions_by_source', ); /** * API Type * * @var string $apiType */ var $apiType = 'get'; /** * Runs the phpOpenTracker API call. * * @param array $parameters * @return mixed * @access public */ function run($parameters) { $parameters['session_lifetime'] = isset($parameters['session_lifetime']) ? $parameters['session_lifetime'] : 3; switch ($parameters['api_call']) { case 'num_conversions': { return $this->_numConversions($parameters); } break; case 'conversions': { return $this->_conversions($parameters); } break; case 'conversions_by_source': { return $this->_conversionsBySource($parameters); } break; } } /** * Returns the number of visitors who have made a conversion (placed an order or * inquiry or signed up for something). * * @param array $parameters * @return integer * @access private * @since phpOpenTracker 1.3.0 */ function _numConversions($parameters) { $this->db->query( sprintf( "SELECT COUNT(DISTINCT(accesslog.accesslog_id)) AS num_conversions FROM %s accesslog, %s conversions WHERE conversions.client_id = '%d' AND conversions.accesslog_id = accesslog.accesslog_id AND accesslog.timestamp >= '%d' %s", $this->config['accesslog_table'], 'pot_conversions', $parameters['client_id'], time() - ($parameters['session_lifetime'] * 60), $this->_constraint($parameters['constraints']) ) ); if ($row = $this->db->fetchRow()) { return intval($row['num_conversions']); } else { return 0; } } /** * Returns detailed information about the visitors who have made a conversion * (placed an order or inquiry or signed up for something). * * @param array $parameters * @return mixed * @access private * @since phpOpenTracker 1.3.0 */ function _conversions($parameters) { switch ($parameters['result_format']) { case 'xml': case 'xml_object': { $tree = new XML_Tree; $root = &$tree->addRoot('visitorsonline'); $children = array(); } break; default: { $result = array(); } } $accesslogIDs = array(); // get a list of all accesslogIDs where there was a conversion $this->db->query( sprintf( "SELECT DISTINCT(accesslog.accesslog_id) AS accesslog_id FROM %s accesslog, %s conversions WHERE conversions.client_id = '%d' AND conversions.accesslog_id = accesslog.accesslog_id AND accesslog.timestamp >= '%d'", $this->config['accesslog_table'], 'pot_conversions', $parameters['client_id'], time() - ($parameters['session_lifetime'] * 60) ) ); while ($row = $this->db->fetchRow()) { $accesslogIDs[] = $row['accesslog_id']; } // for each conversion, get details for ($i = 0, $max = sizeof($accesslogIDs); $i < $max; $i++) { // get the clickpaths for each conversion switch ($parameters['result_format']) { case 'xml': case 'xml_object': { $visitorNode = &$root->addChild('visitor'); $visitorNode->addChild( phpOpenTracker::get( array( 'client_id' => $parameters['client_id'], 'api_call' => 'individual_clickpath', 'accesslog_id' => $accesslogIDs[$i], 'result_format' => 'xml_object' ) ) ); } break; default: { $result[$i]['clickpath'] = phpOpenTracker::get( array( 'client_id' => $parameters['client_id'], 'api_call' => 'individual_clickpath', 'accesslog_id' => $accesslogIDs[$i] ) ); } } // get time of last access $this->db->query( sprintf( "SELECT MAX(timestamp) as last_access FROM %s WHERE accesslog_id = '%s'", $this->config['accesslog_table'], $accesslogIDs[$i] ) ); if ($row = $this->db->fetchRow()) { switch ($parameters['result_format']) { case 'xml': case 'xml_object': { $visitorNode->addChild('last_access', $row['last_access']); } break; default: { $result[$i]['last_access'] = $row['last_access']; } } } else { return phpOpenTracker::handleError( 'Database query failed. A' ); } // get host and user agent $this->db->query( sprintf( "SELECT hosts.string AS host, user_agents.string AS user_agent FROM %s visitors, %s hosts, %s user_agents WHERE visitors.accesslog_id = '%d' AND visitors.host_id = hosts.data_id AND visitors.user_agent_id = user_agents.data_id", $this->config['visitors_table'], $this->config['hostnames_table'], $this->config['user_agents_table'], $accesslogIDs[$i] ) ); if ($row = $this->db->fetchRow()) { switch ($parameters['result_format']) { case 'xml': case 'xml_object': { $visitorNode->addChild('host', $row['host']); $visitorNode->addChild('user_agent', $row['user_agent']); } break; default: { $result[$i]['host'] = $row['host']; $result[$i]['user_agent'] = $row['user_agent']; } } } else { return phpOpenTracker::handleError( 'Database query failed. B' ); } // to determine source, first look for a record of // the use of a search engine on the first visit, // then a referrer on the first visit, then // the use of a search engine on the most recent visit, // then a referrer on the most recent visit // get visitor_id and number of visits $this->db->query( sprintf( "SELECT visitors.visitor_id AS visitor_id FROM %s visitors WHERE visitors.accesslog_id = '%d'", $this->config['visitors_table'], $accesslogIDs[$i] ) ); if ($row = $this->db->fetchRow()) { $visitor_id = intval($row['visitor_id']); } else { $visitor_id = 0; } $this->db->query( sprintf( "SELECT COUNT(visitors.visitor_id) AS num_visits FROM %s visitors WHERE visitors.visitor_id = '%d'", $this->config['visitors_table'], $visitor_id ) ); if ($row = $this->db->fetchRow()) { $num_visits = intval($row['num_visits']); } else { $num_visits = 0; } switch ($parameters['result_format']) { case 'xml': case 'xml_object': { $visitorNode->addChild('num_visits', $num_visits); } break; default: { $result[$i]['num_visits'] = $num_visits; } } // end query for visitor_id and number of visits // get accesslog_id of first visit $this->db->query( sprintf( "SELECT visitors.accesslog_id AS first_access FROM %s visitors WHERE visitors.visitor_id = '%d' ORDER BY visitors.timestamp", $this->config['visitors_table'], $visitor_id ) ); if ($row = $this->db->fetchRow()) { $first_access = $row['first_access']; } // end query for accesslog_id of first visit // get first search engine and search engine keywords if ($num_visits > 1) { $this->db->query( sprintf( "SELECT search_engines.search_engine AS search_engine, search_engines.keywords AS keywords FROM %s search_engines WHERE search_engines.accesslog_id = '%d'", 'pot_search_engines', $first_access ) ); if ($row = $this->db->fetchRow()) { $source = $row['search_engine'].': "'.$row['keywords'].'"'; } } // end query for first search engine and search engine keywords // get first referrer if (!isset($source)) { if ($num_visits > 1) { $this->db->query( sprintf( "SELECT referers.string AS first_referer FROM %s visitors, %s referers WHERE visitors.accesslog_id = '%d' AND visitors.referer_id = referers.data_id ORDER BY visitors.timestamp", $this->config['visitors_table'], $this->config['referers_table'], $first_access ) ); if ($row = $this->db->fetchRow()) { $source = $row['first_referer']; } } } // end query for first referrer // get most recent search engine and search engine keywords if (!isset($source)) { $this->db->query( sprintf( "SELECT search_engines.search_engine AS search_engine, search_engines.keywords AS keywords FROM %s search_engines, %s visitors WHERE visitors.visitor_id = '%d' AND visitors.accesslog_id = search_engines.accesslog_id ORDER BY visitors.timestamp", 'pot_search_engines', $this->config['visitors_table'], $visitor_id ) ); if ($row = $this->db->fetchRow()) { $source = $row['search_engine'].': "'.$row['keywords'].'"'; } } // end query for most recent search engines and search engine keywords // get most recent referrer if (!isset($source)) { $this->db->query( sprintf( "SELECT referers.string AS referer FROM %s visitors, %s referers WHERE visitors.accesslog_id = '%d' AND visitors.referer_id = referers.data_id", $this->config['visitors_table'], $this->config['referers_table'], $accesslogIDs[$i] ) ); if ($row = $this->db->fetchRow()) { $source = $row['referer']; } else { $source = ''; } } // end query for most recent referrer // store source as a result switch ($parameters['result_format']) { case 'xml': case 'xml_object': { $visitorNode->addChild('source', $source); } break; default: { $result[$i]['source'] = $source; } } // done storing source unset($source); // query for conversions type, amount, and details $this->db->query( sprintf( "SELECT conversions.sale AS sale, conversions.inquiry AS inquiry, conversions.signup AS signup, conversions.email AS email, conversions.zip AS zip, conversions.country AS country, conversions.name AS name FROM %s conversions, %s visitors WHERE visitors.accesslog_id = '%d' AND visitors.accesslog_id = conversions.accesslog_id", 'pot_conversions', $this->config['visitors_table'], $accesslogIDs[$i] ) ); if ($row = $this->db->fetchRow()) { $sale = $row['sale']; $inquiry = $row['inquiry']; $signup = $row['signup']; $email = $row['email']; $zip = $row['zip']; $country = $row['country']; $name = $row['name']; } else { $sale = ''; $inquiry = ''; $signup = ''; $email = ''; $zip = ''; $country = ''; $name = ''; } switch ($parameters['result_format']) { case 'xml': case 'xml_object': { $visitorNode->addChild('sale', $sale); $visitorNode->addChild('inquiry', $inquiry); $visitorNode->addChild('signup', $signup); $visitorNode->addChild('email', $email); $visitorNode->addChild('zip', $zip); $visitorNode->addChild('country', $country); $visitorNode->addChild('name', $name); } break; default: { $result[$i]['sale'] = $sale; $result[$i]['inquiry'] = $inquiry; $result[$i]['signup'] = $signup; $result[$i]['email'] = $email; $result[$i]['zip'] = $zip; $result[$i]['country'] = $country; $result[$i]['name'] = $name; } } // end query for conversions type, amount, etc. } // end loop // return results switch ($parameters['result_format']) { case 'xml': { return $root->get(); } break; case 'xml_object': { return $root; } break; default: { return $result; } } } // end _conversions /** * Shows the value amd number of conversions aggregated by source. * * @param array $parameters * @return mixed * @access private * @since phpOpenTracker 1.3.0 */ function _conversionsBySource($parameters) { $timerange = $this->_whereTimerange( $parameters['start'], $parameters['end'] ); switch ($parameters['result_format']) { case 'xml': case 'xml_object': { $tree = new XML_Tree; $root = &$tree->addRoot('visitorsonline'); $children = array(); } break; default: { $result = array(); } } $accesslogIDs = array(); // get a list of all accesslogIDs where there was a conversion $this->db->query( sprintf( "SELECT DISTINCT(accesslog.accesslog_id) AS accesslog_id FROM %s accesslog, %s conversions WHERE conversions.client_id = '%d' AND conversions.accesslog_id = accesslog.accesslog_id %s", $this->config['accesslog_table'], 'pot_conversions', $parameters['client_id'], $timerange ) ); while ($row = $this->db->fetchRow()) { $accesslogIDs[] = $row['accesslog_id']; } // for each conversion, get details for ($i = 0, $max = sizeof($accesslogIDs); $i < $max; $i++) { unset($source); // to determine source, first look for a record of // the use of a search engine on the first visit, // then a referrer on the first visit, then // the use of a search engine on the most recent visit, // then a referrer on the most recent visit // get visitor_id and number of visits $this->db->query( sprintf( "SELECT visitors.visitor_id AS visitor_id FROM %s visitors WHERE visitors.accesslog_id = '%d'", $this->config['visitors_table'], $accesslogIDs[$i] ) ); if ($row = $this->db->fetchRow()) { $visitor_id = intval($row['visitor_id']); } else { $visitor_id = 0; } $this->db->query( sprintf( "SELECT COUNT(visitors.visitor_id) AS num_visits FROM %s visitors WHERE visitors.visitor_id = '%d'", $this->config['visitors_table'], $visitor_id ) ); if ($row = $this->db->fetchRow()) { $num_visits = intval($row['num_visits']); } else { $num_visits = 0; } // end query for visitor_id and number of visits // get accesslog_id of first visit $this->db->query( sprintf( "SELECT visitors.accesslog_id AS first_access FROM %s visitors WHERE visitors.visitor_id = '%d' ORDER BY visitors.timestamp", $this->config['visitors_table'], $visitor_id ) ); if ($row = $this->db->fetchRow()) { $first_access = $row['first_access']; } // end query for accesslog_id of first visit // get first search engine and search engine keywords if ($num_visits > 1) { $this->db->query( sprintf( "SELECT search_engines.search_engine AS search_engine, search_engines.keywords AS keywords FROM %s search_engines WHERE search_engines.accesslog_id = '%d'", 'pot_search_engines', $first_access ) ); if ($row = $this->db->fetchRow()) { $source = $row['search_engine'].': "'.$row['keywords'].'"'; } } // end query for first search engine and search engine keywords // get first referrer if (!isset($source)) { if ($num_visits > 1) { $this->db->query( sprintf( "SELECT referers.string AS first_referer FROM %s visitors, %s referers WHERE visitors.accesslog_id = '%d' AND visitors.referer_id = referers.data_id ORDER BY visitors.timestamp", $this->config['visitors_table'], $this->config['referers_table'], $first_access ) ); if ($row = $this->db->fetchRow()) { $source = $row['first_referer']; } } } // end query for first referrer // get most recent search engine and search engine keywords if (!isset($source)) { $this->db->query( sprintf( "SELECT search_engines.search_engine AS search_engine, search_engines.keywords AS keywords FROM %s search_engines, %s visitors WHERE visitors.visitor_id = '%d' AND visitors.accesslog_id = search_engines.accesslog_id ORDER BY visitors.timestamp", 'pot_search_engines', $this->config['visitors_table'], $visitor_id ) ); if ($row = $this->db->fetchRow()) { $source = $row['search_engine'].': "'.$row['keywords'].'"'; } } // end query for most recent search engines and search engine keywords // get most recent referrer if (!isset($source)) { $this->db->query( sprintf( "SELECT referers.string AS referer FROM %s visitors, %s referers WHERE visitors.accesslog_id = '%d' AND visitors.referer_id = referers.data_id", $this->config['visitors_table'], $this->config['referers_table'], $accesslogIDs[$i] ) ); if ($row = $this->db->fetchRow()) { $source = $row['referer']; } else { $source = 'unknown'; } } // end query for most recent referrer // store source as a result switch ($parameters['result_format']) { case 'xml': case 'xml_object': { // ?? } break; default: { $result[$source]['source'] = $source; } } // done storing source // query for conversions type, amount, and details $this->db->query( sprintf( "SELECT conversions.sale AS sale, conversions.inquiry AS inquiry, conversions.signup AS signup FROM %s conversions, %s visitors WHERE visitors.accesslog_id = '%d' AND visitors.accesslog_id = conversions.accesslog_id", 'pot_conversions', $this->config['visitors_table'], $accesslogIDs[$i] ) ); if ($row = $this->db->fetchRow()) { $sale = $row['sale']; $inquiry = $row['inquiry']; $signup = $row['signup']; } else { $sale = ''; $inquiry = ''; $signup = ''; } switch ($parameters['result_format']) { case 'xml': case 'xml_object': { // ?? } break; default: { $result[$source]['sale'] = $result[$source]['sale'] + $sale; $result[$source]['inquiry'] = $result[$source]['inquiry'] + $inquiry; $result[$source]['signup'] = $result[$source]['signup'] + $signup; } } // end query for conversions type, amount, etc. } // end loop // return results switch ($parameters['result_format']) { case 'xml': { return $root->get(); } break; case 'xml_object': { return $root; } break; default: { return $result; } } } // end _conversionsBySource } // end class // // "phpOpenTracker essenya, gul meletya; // Sebastian carneron PHP." // ?> ------------------------------------------------------- This SF.Net email is sponsored by: IBM Linux Tutorials Free Linux tutorial presented by Daniel Robbins, President and CEO of GenToo technologies. Learn everything from fundamentals to system administration.http://ads.osdn.com/?ad_id=1470&alloc_id=3638&op=click