mysqli封装类,可防SQL注入

 转自:http://www.aplweb.co.uk/blog/php/mysqli-wrapper-class/

下载:http://www.aplweb.co.uk/download/php/mysqli-wrapper-class/

PHP代码
  1. /** 
  2.    * Make an array of references to the values of another array 
  3.    * Note: useful when references rather than values are required 
  4.    * @param {array} array of values  
  5.    * @return {array} references array 
  6.    */  
  7.    function makeRefArr(&$arr) {  
  8.        $refs = array();  
  9.   
  10.        foreach($arr as $key => &$val) {  
  11.            $refs[$key] = &$val;  
  12.        }  
  13.   
  14.        return $refs;  
  15.    }  
  16.   
  17.    /** 
  18.    * Make a recursive copy of an array 
  19.    * @param {array} original array 
  20.    * @param {boolean} should the values to be cloned too? 
  21.    * @return {array} copy of source array 
  22.    */  
  23.    function array_copy($arr$deep= true) {  
  24.        $newArr = array();  
  25.   
  26.        if ($deep) {  
  27.            foreach ($arr as $key=>$val) {  
  28.                if (is_object($val)) {  
  29.                    $newArr[$key] = clone($val);  
  30.                } else if (is_array($val)) {  
  31.                    $newArr[$key] = array_copy($val);  
  32.                } else {  
  33.                    $newArr[$key] = $val;  
  34.                }  
  35.            }  
  36.        } else {  
  37.            foreach ($arr as $key=>$val) {  
  38.                $newArr[$key] = $val;  
  39.            }  
  40.        }  
  41.   
  42.        return $newArr;  
  43.    }  
  44.   
  45.    /** 
  46.    * A mysqli wrapper class 
  47.    * 
  48.    * @author Andrew Lowndes (APL Web) 
  49.    * @date 20/11/2010 
  50.    */  
  51.    class db {  
  52.        public static $db = null;  
  53.   
  54.        //connect to the database  
  55.        public static function connect() {  
  56.            self::$db = new mysqli(‘localhost’‘username’ ,‘password’‘database’);  
  57.   
  58.            if (mysqli_connect_errno()) {  
  59.                throw new Exception(‘Connection failed: ‘ . mysqli_connect_error());  
  60.            }  
  61.   
  62.            self::$db->set_charset("utf8");  
  63.        }  
  64.   
  65.        //close the connection  
  66.        public static function close() {  
  67.            if (self::$db) {  
  68.                self::$db->close();  
  69.            }  
  70.        }  
  71.   
  72.        /** 
  73.        * Run a query and return the result 
  74.        * @param {string} query to run (with ‘?’ for values) 
  75.        * @param {array} values to execute in prepared statement (optional) 
  76.        * @return {resource} result 
  77.        */  
  78.        public static function query($query$objs = array()) {  
  79.            if (!self::$db) self::connect();  
  80.   
  81.            $objs = (array)$objs//automagically cast single values into an array  
  82.   
  83.            $statement = self::$db->prepare($query);  
  84.   
  85.            if (!$statement) {  
  86.                throw new Exception(‘Query failed: ‘ . self::$db->error);  
  87.            }  
  88.   
  89.            //go through all of the provided objects and bind them  
  90.            $types = array();  
  91.            $values = array();  
  92.   
  93.            if (count($objs)>0) {  
  94.                foreach ($objs as $obj) {  
  95.                    //get the object type and translate it ready for bind parameter  
  96.                    $type = gettype($obj);  
  97.   
  98.                    switch ($type) {  
  99.                        case ‘boolean’case ‘integer’:  
  100.                            $types[] = ‘i’;  
  101.                            $values[] = intval($obj);  
  102.                            break;  
  103.                        case ‘double’:  
  104.                            $types[] = ‘d’;  
  105.                            $values[] = doubleval($obj);  
  106.                            break;  
  107.                        case ‘string’:  
  108.                            $types[] = ‘s’;  
  109.                            $values[] = (string)$obj;  
  110.                            break;  
  111.                        case ‘array’case ‘object’:  
  112.                            $paramTypes[] = ‘s’;  
  113.                            $values[] = json_encode($obj);  
  114.                            break;  
  115.                        case ‘resource’case ‘null’case ‘unknown type’default:  
  116.                            throw new Exception(‘Unsupported object passed through as query prepared object!’);  
  117.                    }  
  118.                }  
  119.   
  120.                $params = makeRefArr($values);  
  121.                array_unshift($params, implode($types));  
  122.                call_user_func_array(array($statement‘bind_param’), $params);  
  123.            }  
  124.   
  125.            if (!$statement->execute()) {  
  126.                return null;  
  127.            } else {  
  128.                $statement->store_result();  
  129.                return $statement;  
  130.            }  
  131.        }  
  132.   
  133.        /** 
  134.        * Determine if an object exists 
  135.        * @param {string} query to run 
  136.        * @param {array} objects to use in prepare query (optional) 
  137.        * @return {boolean} object exists in database 
  138.        */  
  139.        public static function objectExists($query$objs = array()) {  
  140.            $statement = self::query($query$objs);  
  141.   
  142.            return (is_object($statement) && $statement->num_rows>0);  
  143.        }  
  144.   
  145.        /** 
  146.        * Make an associative array of field names from a statement 
  147.        * @param {resource} mysqli statement 
  148.        * @return {array} field names array 
  149.        */  
  150.        private static function getFieldNames($statement) {  
  151.            $result = $statement->result_metadata();  
  152.            $fields = $result->fetch_fields();  
  153.   
  154.            $fieldNames = array();  
  155.            foreach($fields as $field) {  
  156.                $fieldNames[$field->name] = null;  
  157.            }  
  158.   
  159.            return $fieldNames;  
  160.        }  
  161.   
  162.        /** 
  163.        * Get an object from a query 
  164.        * @param {string} query to execute 
  165.        * @param {array} objects to use as the values (optional)  
  166.        * @return {assoc} sinulatobject 
  167.        */  
  168.        public static function getObject($query$objs = array()) {  
  169.            $statement = self::query($query$objs);  
  170.   
  171.            if (!is_object($statement) || $statement->num_rows<1) {  
  172.                return null;  
  173.            }  
  174.   
  175.            $fieldNames = self::getFieldNames($statement);  
  176.            call_user_func_array(array($statement‘bind_result’), makeRefArr($fieldNames));  
  177.   
  178.            $statement->fetch();  
  179.            $statement->close();  
  180.   
  181.            return $fieldNames;  
  182.        }  
  183.   
  184.        /** 
  185.        * Get a list of objects from the database 
  186.        * @param {string} query 
  187.        * @return {array} objects 
  188.        */  
  189.        public static function getObjects($query$objs = array()) {  
  190.            $statement = self::query($query$objs);  
  191.   
  192.            if (!is_object($statement) || $statement->num_rows<1) {  
  193.                return array();  
  194.            }  
  195.   
  196.            $fieldNames = self::getFieldNames($statement);  
  197.            call_user_func_array(array($statement‘bind_result’), makeRefArr($fieldNames));  
  198.   
  199.            $results = array();  
  200.            while ($statement->fetch()) {  
  201.                $results[] = array_copy($fieldNames);  
  202.            }  
  203.   
  204.            $statement->close();  
  205.   
  206.            return $results;  
  207.        }  
  208.   
  209.        /** 
  210.        * Get all of the data from a table 
  211.        * @param {string} table name 
  212.        * @return {array} table data 
  213.        */  
  214.        public static function getTable($tableName) {  
  215.            if (!self::$db) self::connect();  
  216.   
  217.            $tableName = self::$db->escape_string($tableName);  
  218.   
  219.            return self::getObjects(‘SELECT * FROM `’ . $tableName . ‘`;’);  
  220.        }  
  221.   
  222.        /** 
  223.        * Get a field from a table based on a field having a specific value 
  224.        * @param {string} table name 
  225.        * @param {string} field name 
  226.        * @param {mixed} field value 
  227.        * @return {array} table row data 
  228.        */  
  229.        public static function getTableRow($tableName$field$value) {  
  230.            if (!self::$db) self::connect();  
  231.   
  232.            $tableName = self::$db->escape_string($tableName);  
  233.            $field = self::$db->escape_string($field);  
  234.   
  235.            return self::getObject(‘SELECT * FROM `’ . $tableName . ‘` WHERE `’ . $field . ‘` = ? LIMIT 1;’$value);  
  236.        }  
  237.   
  238.        /** 
  239.        * Get all related rows from a table based on a field having a specific value 
  240.        * @param {string} table name 
  241.        * @param {string} field name 
  242.        * @param {mixed} field value 
  243.        * @return {array} table row data 
  244.        */  
  245.        public static function getTableRows($tableName$field$value$sortField = null, $sortDesc = false) {  
  246.            if (!self::$db) self::connect();  
  247.   
  248.            $tableName = self::$db->escape_string($tableName);  
  249.            $field = self::$db->escape_string($field);  
  250.   
  251.            if ($sortField == null) {  
  252.                $sortField = $field;  
  253.            } else {  
  254.                $sortField = self::$db->escape_string($sortField);  
  255.            }  
  256.   
  257.            return self::getObjects(‘SELECT * FROM `’ . $tableName . ‘` WHERE `’ . $field . ‘` = ? ORDER BY `’ . $sortField . ‘` ‘ . ($sortDesc ? ‘DESC’ : ‘ASC’) . ‘;’$value);  
  258.        }  
  259.    }  


发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>