mysqli.php.svn-base

来自「PHP 知识管理系统(基于树结构的知识管理系统), 英文原版的PHP源码。」· SVN-BASE 代码 · 共 961 行 · 第 1/3 页

SVN-BASE
961
字号
     * @param int      $fetchmode how the resulting array should be indexed     * @param int      $rownum    the row number to fetch     *     * @return mixed DB_OK on success, null when end of result set is     *               reached or on failure     *     * @see DB_result::fetchInto()     * @access private     */    function fetchInto($result, &$arr, $fetchmode, $rownum=null)    {        if ($rownum !== null) {            if (!@mysqli_data_seek($result, $rownum)) {                return null;            }        }        if ($fetchmode & DB_FETCHMODE_ASSOC) {            $arr = @mysqli_fetch_array($result, MYSQLI_ASSOC);            if ($this->options['portability'] & DB_PORTABILITY_LOWERCASE && $arr) {                $arr = array_change_key_case($arr, CASE_LOWER);            }        } else {            $arr = @mysqli_fetch_row($result);        }        if (!$arr) {            $errno = @mysqli_errno($this->connection);            if (!$errno) {                return null;            }            return $this->mysqlRaiseError($errno);        }        if ($this->options['portability'] & DB_PORTABILITY_RTRIM) {            /*             * Even though this DBMS already trims output, we do this because             * a field might have intentional whitespace at the end that             * gets removed by DB_PORTABILITY_RTRIM under another driver.             */            $this->_rtrimArrayValues($arr);        }        if ($this->options['portability'] & DB_PORTABILITY_NULL_TO_EMPTY) {            $this->_convertNullArrayValuesToEmpty($arr);        }        return DB_OK;    }    // }}}    // {{{ freeResult()    /**     * Free the internal resources associated with $result.     *     * @param resource $result MySQL result identifier     * @return bool true on success, false if $result is invalid     * @access public     */    function freeResult($result)    {# need to come up with different means for next line# since $result is object (int)$result won't fly...//        unset($this->num_rows[(int)$result]);        return @mysqli_free_result($result);    }    // }}}    // {{{ numCols()    /**     * Get the number of columns in a result set.     *     * @param $result MySQL result identifier     *     * @access public     *     * @return int the number of columns per row in $result     */    function numCols($result)    {        $cols = @mysqli_num_fields($result);        if (!$cols) {            return $this->mysqlRaiseError();        }        return $cols;    }    // }}}    // {{{ numRows()    /**     * Get the number of rows in a result set.     *     * @param resource $result MySQL result identifier     * @return int the number of rows in $result     * @access public     */    function numRows($result)    {        $rows = @mysqli_num_rows($result);        if ($rows === null) {            return $this->mysqlRaiseError();        }        return $rows;    }    // }}}    // {{{ autoCommit()    /**     * Enable/disable automatic commits.     */    function autoCommit($onoff = false)    {        // XXX if $this->transaction_opcount > 0, we should probably        // issue a warning here.        $this->autocommit = $onoff ? true : false;        return DB_OK;    }    // }}}    // {{{ commit()    /**     * Commit the current transaction.     */    function commit()    {        if ($this->transaction_opcount > 0) {            if ($this->_db) {                if (!@mysqli_select_db($this->connection, $this->_db)) {                    return $this->mysqlRaiseError(DB_ERROR_NODBSELECTED);                }            }            $result = @mysqli_query($this->connection, 'COMMIT');            $result = @mysqli_query($this->connection, 'SET AUTOCOMMIT=1');            $this->transaction_opcount = 0;            if (!$result) {                return $this->mysqlRaiseError();            }        }        return DB_OK;    }    // }}}    // {{{ rollback()    /**     * Roll back (undo) the current transaction.     */    function rollback()    {        if ($this->transaction_opcount > 0) {            if ($this->_db) {                if (!@mysqli_select_db($this->connection, $this->_db)) {                    return $this->mysqlRaiseError(DB_ERROR_NODBSELECTED);                }            }            $result = @mysqli_query($this->connection, 'ROLLBACK');            $result = @mysqli_query($this->connection, 'SET AUTOCOMMIT=1');            $this->transaction_opcount = 0;            if (!$result) {                return $this->mysqlRaiseError();            }        }        return DB_OK;    }    // }}}    // {{{ affectedRows()    /**     * Gets the number of rows affected by the data manipulation     * query.  For other queries, this function returns 0.     *     * @return integer number of rows affected by the last query     */    function affectedRows()    {        if (DB::isManip($this->last_query)) {            return @mysqli_affected_rows($this->connection);        } else {            return 0;        }     }    // }}}    // {{{ errorNative()    /**     * Get the native error code of the last error (if any) that     * occured on the current connection.     *     * @return int native MySQL error code     * @access public     */    function errorNative()    {        return @mysqli_errno($this->connection);    }    // }}}    // {{{ nextId()    /**     * Returns the next free id in a sequence     *     * @param string  $seq_name  name of the sequence     * @param boolean $ondemand  when true, the seqence is automatically     *                           created if it does not exist     *     * @return int  the next id number in the sequence.  DB_Error if problem.     *     * @internal     * @see DB_common::nextID()     * @access public     */    function nextId($seq_name, $ondemand = true)    {        $seqname = $this->getSequenceName($seq_name);        do {            $repeat = 0;            $this->pushErrorHandling(PEAR_ERROR_RETURN);            $result = $this->query("UPDATE ${seqname} ".                                   'SET id=LAST_INSERT_ID(id+1)');            $this->popErrorHandling();            if ($result === DB_OK) {                /** COMMON CASE **/                $id = @mysqli_insert_id($this->connection);                if ($id != 0) {                    return $id;                }                /** EMPTY SEQ TABLE **/                // Sequence table must be empty for some reason, so fill it and return 1                // Obtain a user-level lock                $result = $this->getOne("SELECT GET_LOCK('${seqname}_lock',10)");                if (DB::isError($result)) {                    return $this->raiseError($result);                }                if ($result == 0) {                    // Failed to get the lock, bail with a DB_ERROR_NOT_LOCKED error                    return $this->mysqlRaiseError(DB_ERROR_NOT_LOCKED);                }                // add the default value                $result = $this->query("REPLACE INTO ${seqname} (id) VALUES (0)");                if (DB::isError($result)) {                    return $this->raiseError($result);                }                // Release the lock                $result = $this->getOne("SELECT RELEASE_LOCK('${seqname}_lock')");                if (DB::isError($result)) {                    return $this->raiseError($result);                }                // We know what the result will be, so no need to try again                return 1;            /** ONDEMAND TABLE CREATION **/            } elseif ($ondemand && DB::isError($result) &&                $result->getCode() == DB_ERROR_NOSUCHTABLE)            {                $result = $this->createSequence($seq_name);                // Since createSequence initializes the ID to be 1,                // we do not need to retrieve the ID again (or we will get 2)                if (DB::isError($result)) {                    return $this->raiseError($result);                } else {                    // First ID of a newly created sequence is 1                    return 1;                }            /** BACKWARDS COMPAT **/            } elseif (DB::isError($result) &&                      $result->getCode() == DB_ERROR_ALREADY_EXISTS)            {                // see _BCsequence() comment                $result = $this->_BCsequence($seqname);                if (DB::isError($result)) {                    return $this->raiseError($result);                }                $repeat = 1;            }        } while ($repeat);        return $this->raiseError($result);    }    /**     * Creates a new sequence     *     * @param string $seq_name  name of the new sequence     *     * @return int  DB_OK on success.  A DB_Error object is returned if     *              problems arise.     *     * @internal     * @see DB_common::createSequence()     * @access public     */    function createSequence($seq_name)    {        $seqname = $this->getSequenceName($seq_name);        $res = $this->query("CREATE TABLE ${seqname} ".                            '(id INTEGER UNSIGNED AUTO_INCREMENT NOT NULL,'.                            ' PRIMARY KEY(id))');        if (DB::isError($res)) {            return $res;        }        // insert yields value 1, nextId call will generate ID 2        return $this->query("INSERT INTO ${seqname} (id) VALUES (0)");    }    // }}}    // {{{ dropSequence()    /**     * Deletes a sequence     *     * @param string $seq_name  name of the sequence to be deleted     *     * @return int  DB_OK on success.  DB_Error if problems.

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?