| | |
| | | // | Author: Lukas Smith <smith@pooteeweet.org> | |
| | | // +----------------------------------------------------------------------+ |
| | | // |
| | | // $Id: mysqli.php 292715 2009-12-28 14:06:34Z quipo $ |
| | | // $Id: mysqli.php 295587 2010-02-28 17:16:38Z quipo $ |
| | | // |
| | | |
| | | /** |
| | |
| | | return MDB2_OK; //nothing to do |
| | | } |
| | | $query = $this->start_transaction ? 'START TRANSACTION' : 'SET AUTOCOMMIT = 0'; |
| | | $result =& $this->_doQuery($query, true); |
| | | $result = $this->_doQuery($query, true); |
| | | if (PEAR::isError($result)) { |
| | | return $result; |
| | | } |
| | |
| | | 'transactions are not supported', __FUNCTION__); |
| | | } |
| | | |
| | | $result =& $this->_doQuery('COMMIT', true); |
| | | $result = $this->_doQuery('COMMIT', true); |
| | | if (PEAR::isError($result)) { |
| | | return $result; |
| | | } |
| | | if (!$this->start_transaction) { |
| | | $query = 'SET AUTOCOMMIT = 1'; |
| | | $result =& $this->_doQuery($query, true); |
| | | $result = $this->_doQuery($query, true); |
| | | if (PEAR::isError($result)) { |
| | | return $result; |
| | | } |
| | |
| | | } |
| | | |
| | | $query = 'ROLLBACK'; |
| | | $result =& $this->_doQuery($query, true); |
| | | $result = $this->_doQuery($query, true); |
| | | if (PEAR::isError($result)) { |
| | | return $result; |
| | | } |
| | | if (!$this->start_transaction) { |
| | | $query = 'SET AUTOCOMMIT = 1'; |
| | | $result =& $this->_doQuery($query, true); |
| | | $result = $this->_doQuery($query, true); |
| | | if (PEAR::isError($result)) { |
| | | return $result; |
| | | } |
| | |
| | | * READ COMMITTED (prevents dirty reads) |
| | | * REPEATABLE READ (prevents nonrepeatable reads) |
| | | * SERIALIZABLE (prevents phantom reads) |
| | | * @param array some transaction options: |
| | | * 'wait' => 'WAIT' | 'NO WAIT' |
| | | * 'rw' => 'READ WRITE' | 'READ ONLY' |
| | | * |
| | | * @return mixed MDB2_OK on success, a MDB2 error on failure |
| | | * |
| | | * @access public |
| | | * @since 2.1.1 |
| | | */ |
| | | function setTransactionIsolation($isolation) |
| | | function setTransactionIsolation($isolation, $options = array()) |
| | | { |
| | | $this->debug('Setting transaction isolation level', __FUNCTION__, array('is_manip' => true)); |
| | | if (!$this->supports('transactions')) { |
| | |
| | | return $this->_doQuery($query, true, $connection); |
| | | } |
| | | if (!$result = mysqli_set_charset($connection, $charset)) { |
| | | $err =& $this->raiseError(null, null, null, |
| | | $err = $this->raiseError(null, null, null, |
| | | 'Could not set client character set', __FUNCTION__); |
| | | return $err; |
| | | } |
| | |
| | | * @return mixed MDB2_OK on success, a MDB2 error on failure |
| | | * @access public |
| | | */ |
| | | function &standaloneQuery($query, $types = null, $is_manip = false) |
| | | function standaloneQuery($query, $types = null, $is_manip = false) |
| | | { |
| | | $user = $this->options['DBA_username']? $this->options['DBA_username'] : $this->dsn['username']; |
| | | $pass = $this->options['DBA_password']? $this->options['DBA_password'] : $this->dsn['password']; |
| | |
| | | $this->offset = $this->limit = 0; |
| | | $query = $this->_modifyQuery($query, $is_manip, $limit, $offset); |
| | | |
| | | $result =& $this->_doQuery($query, $is_manip, $connection, $this->database_name); |
| | | $result = $this->_doQuery($query, $is_manip, $connection, $this->database_name); |
| | | if (!PEAR::isError($result)) { |
| | | $result = $this->_affectedRows($connection, $result); |
| | | } |
| | |
| | | * @return result or error object |
| | | * @access protected |
| | | */ |
| | | function &_doQuery($query, $is_manip = false, $connection = null, $database_name = null) |
| | | function _doQuery($query, $is_manip = false, $connection = null, $database_name = null) |
| | | { |
| | | $this->last_query = $query; |
| | | $result = $this->debug($query, 'query', array('is_manip' => $is_manip, 'when' => 'pre')); |
| | |
| | | } |
| | | |
| | | if (!$result && 0 !== mysqli_errno($connection)) { |
| | | $err =& $this->raiseError(null, null, null, |
| | | $err = $this->raiseError(null, null, null, |
| | | 'Could not execute statement', __FUNCTION__); |
| | | return $err; |
| | | } |
| | |
| | | if ($this->options['multi_query']) { |
| | | if ($this->options['result_buffering']) { |
| | | if (!($result = @mysqli_store_result($connection))) { |
| | | $err =& $this->raiseError(null, null, null, |
| | | $err = $this->raiseError(null, null, null, |
| | | 'Could not get the first result from a multi query', __FUNCTION__); |
| | | return $err; |
| | | } |
| | | } elseif (!($result = @mysqli_use_result($connection))) { |
| | | $err =& $this->raiseError(null, null, null, |
| | | $err = $this->raiseError(null, null, null, |
| | | 'Could not get the first result from a multi query', __FUNCTION__); |
| | | return $err; |
| | | } |
| | |
| | | * @access public |
| | | * @see bindParam, execute |
| | | */ |
| | | function &prepare($query, $types = null, $result_types = null, $lobs = array()) |
| | | function prepare($query, $types = null, $result_types = null, $lobs = array()) |
| | | { |
| | | // connect to get server capabilities (http://pear.php.net/bugs/16147) |
| | | $connection = $this->getConnection(); |
| | |
| | | if ($this->options['emulate_prepared'] |
| | | || $this->supported['prepared_statements'] !== true |
| | | ) { |
| | | $obj =& parent::prepare($query, $types, $result_types, $lobs); |
| | | return $obj; |
| | | return parent::prepare($query, $types, $result_types, $lobs); |
| | | } |
| | | $is_manip = ($result_types === MDB2_PREPARE_MANIP); |
| | | $offset = $this->offset; |
| | |
| | | $regexp = '/^.{'.($position+1).'}('.$this->options['bindname_format'].').*$/s'; |
| | | $parameter = preg_replace($regexp, '\\1', $query); |
| | | if ($parameter === '') { |
| | | $err =& $this->raiseError(MDB2_ERROR_SYNTAX, null, null, |
| | | $err = $this->raiseError(MDB2_ERROR_SYNTAX, null, null, |
| | | 'named parameter name must match "bindname_format" option', __FUNCTION__); |
| | | return $err; |
| | | } |
| | |
| | | $statement_name = substr(strtolower($statement_name), 0, $this->options['max_identifiers_length']); |
| | | $query = "PREPARE $statement_name FROM ".$this->quote($query, 'text'); |
| | | |
| | | $statement =& $this->_doQuery($query, true, $connection); |
| | | $statement = $this->_doQuery($query, true, $connection); |
| | | if (PEAR::isError($statement)) { |
| | | return $statement; |
| | | } |
| | |
| | | } else { |
| | | $statement = @mysqli_prepare($connection, $query); |
| | | if (!$statement) { |
| | | $err =& $this->raiseError(null, null, null, |
| | | $err = $this->raiseError(null, null, null, |
| | | 'Unable to create prepared statement handle', __FUNCTION__); |
| | | return $err; |
| | | } |
| | |
| | | |
| | | $table = $this->quoteIdentifier($table, true); |
| | | $query = "REPLACE INTO $table ($query) VALUES ($values)"; |
| | | $result =& $this->_doQuery($query, true, $connection); |
| | | $result = $this->_doQuery($query, true, $connection); |
| | | if (PEAR::isError($result)) { |
| | | return $result; |
| | | } |
| | |
| | | $query = "INSERT INTO $sequence_name ($seqcol_name) VALUES (NULL)"; |
| | | $this->pushErrorHandling(PEAR_ERROR_RETURN); |
| | | $this->expectError(MDB2_ERROR_NOSUCHTABLE); |
| | | $result =& $this->_doQuery($query, true); |
| | | $result = $this->_doQuery($query, true); |
| | | $this->popExpect(); |
| | | $this->popErrorHandling(); |
| | | if (PEAR::isError($result)) { |
| | |
| | | $value = $this->lastInsertID(); |
| | | if (is_numeric($value)) { |
| | | $query = "DELETE FROM $sequence_name WHERE $seqcol_name < $value"; |
| | | $result =& $this->_doQuery($query, true); |
| | | $result = $this->_doQuery($query, true); |
| | | if (PEAR::isError($result)) { |
| | | $this->warnings[] = 'nextID: could not delete previous sequence table values from '.$seq_name; |
| | | } |
| | |
| | | * @return int data array on success, a MDB2 error on failure |
| | | * @access public |
| | | */ |
| | | function &fetchRow($fetchmode = MDB2_FETCHMODE_DEFAULT, $rownum = null) |
| | | function fetchRow($fetchmode = MDB2_FETCHMODE_DEFAULT, $rownum = null) |
| | | { |
| | | if (null !== $rownum) { |
| | | $seek = $this->seek($rownum); |
| | |
| | | 'resultset has already been freed', __FUNCTION__); |
| | | return $err; |
| | | } |
| | | $null = null; |
| | | return $null; |
| | | return null; |
| | | } |
| | | $mode = $this->db->options['portability'] & MDB2_PORTABILITY_EMPTY_TO_NULL; |
| | | $rtrim = false; |
| | |
| | | * a MDB2 error on failure |
| | | * @access private |
| | | */ |
| | | function &_execute($result_class = true, $result_wrap_class = false) |
| | | function _execute($result_class = true, $result_wrap_class = false) |
| | | { |
| | | if (null === $this->statement) { |
| | | $result =& parent::_execute($result_class, $result_wrap_class); |
| | | $result = parent::_execute($result_class, $result_wrap_class); |
| | | return $result; |
| | | } |
| | | $this->db->last_query = $this->query; |
| | |
| | | $query = 'EXECUTE '.$this->statement; |
| | | } |
| | | if (!empty($this->positions)) { |
| | | $paramReferences = array(); |
| | | $parameters = array(0 => $this->statement, 1 => ''); |
| | | $lobs = array(); |
| | | $i = 0; |
| | |
| | | } |
| | | } else { |
| | | if (is_resource($value) || $type == 'clob' || $type == 'blob') { |
| | | $parameters[] = null; |
| | | $paramReferences[$i] = null; |
| | | // mysqli_stmt_bind_param() requires parameters to be passed by reference |
| | | $parameters[] =& $paramReferences[$i]; |
| | | $parameters[1].= 'b'; |
| | | $lobs[$i] = $parameter; |
| | | } else { |
| | | $quoted = $this->db->quote($value, $type, false); |
| | | if (PEAR::isError($quoted)) { |
| | | return $quoted; |
| | | $paramReferences[$i] = $this->db->quote($value, $type, false); |
| | | if (PEAR::isError($paramReferences[$i])) { |
| | | return $paramReferences[$i]; |
| | | } |
| | | $parameters[] = $quoted; |
| | | // mysqli_stmt_bind_param() requires parameters to be passed by reference |
| | | $parameters[] =& $paramReferences[$i]; |
| | | $parameters[1].= $this->db->datatype->mapPrepareDatatype($type); |
| | | } |
| | | ++$i; |
| | |
| | | if (!is_object($this->statement)) { |
| | | $query.= ' USING @'.implode(', @', array_values($this->positions)); |
| | | } else { |
| | | $result = @call_user_func_array('mysqli_stmt_bind_param', $parameters); |
| | | $result = call_user_func_array('mysqli_stmt_bind_param', $parameters); |
| | | if (false === $result) { |
| | | $err =& $this->db->raiseError(null, null, null, |
| | | $err = $this->db->raiseError(null, null, null, |
| | | 'Unable to bind parameters', __FUNCTION__); |
| | | return $err; |
| | | } |
| | |
| | | return $affected_rows; |
| | | } |
| | | |
| | | $result =& $this->db->_wrapResult($result, $this->result_types, |
| | | $result = $this->db->_wrapResult($result, $this->result_types, |
| | | $result_class, $result_wrap_class, $this->limit, $this->offset); |
| | | } else { |
| | | if (!@mysqli_stmt_execute($this->statement)) { |
| | | $err =& $this->db->raiseError(null, null, null, |
| | | //echo '<pre>'; var_dump($this->statement, mysqli_stmt_error($this->statement));exit; |
| | | |
| | | if (!mysqli_stmt_execute($this->statement)) { |
| | | echo '<pre>'; var_dump($this->statement, mysqli_stmt_error($this->statement));exit; |
| | | $err = $this->db->raiseError(null, null, null, |
| | | 'Unable to execute statement', __FUNCTION__); |
| | | return $err; |
| | | } |
| | |
| | | @mysqli_stmt_store_result($this->statement); |
| | | } |
| | | |
| | | $result =& $this->db->_wrapResult($this->statement, $this->result_types, |
| | | $result = $this->db->_wrapResult($this->statement, $this->result_types, |
| | | $result_class, $result_wrap_class, $this->limit, $this->offset); |
| | | } |
| | | |