function dump_properties($mysqli) { printf("\nClass variables:\n"); $variables = array_keys(get_class_vars(get_class($mysqli))); sort($variables); foreach ($variables as $k => $var) { printf("%s = '%s'\n", $var, var_export(@$mysqli->{$var}, true)); } printf("\nObject variables:\n"); $variables = array_keys(get_object_vars($mysqli)); foreach ($variables as $k => $var) { printf("%s = '%s'\n", $var, var_export(@$mysqli->{$var}, true)); } printf("\nMagic, magic properties:\n"); assert(@mysqli_affected_rows($mysqli) === @$mysqli->affected_rows); printf("mysqli->affected_rows = '%s'/%s ('%s'/%s)\n", @$mysqli->affected_rows, gettype(@$mysqli->affected_rows), @mysqli_affected_rows($mysqli), gettype(@mysqli_affected_rows($mysqli))); assert(@mysqli_get_client_info() === @$mysqli->client_info); printf("mysqli->client_info = '%s'/%s ('%s'/%s)\n", @$mysqli->client_info, gettype(@$mysqli->client_info), @mysqli_get_client_info(), gettype(@mysqli_get_client_info())); assert(@mysqli_get_client_version() === @$mysqli->client_version); printf("mysqli->client_version = '%s'/%s ('%s'/%s)\n", @$mysqli->client_version, gettype(@$mysqli->client_version), @mysqli_get_client_version(), gettype(@mysqli_get_client_version())); assert(@mysqli_errno($mysqli) === @$mysqli->errno); printf("mysqli->errno = '%s'/%s ('%s'/%s)\n", @$mysqli->errno, gettype(@$mysqli->errno), @mysqli_errno($mysqli), gettype(@mysqli_errno($mysqli))); assert(@mysqli_error($mysqli) === @$mysqli->error); printf("mysqli->error = '%s'/%s ('%s'/%s)\n", @$mysqli->error, gettype(@$mysqli->error), @mysqli_error($mysqli), gettype(@mysqli_error($mysqli))); assert(@mysqli_field_count($mysqli) === @$mysqli->field_count); printf("mysqli->field_count = '%s'/%s ('%s'/%s)\n", @$mysqli->field_count, gettype(@$mysqli->field_count), @mysqli_field_count($mysqli), gettype(@mysqli_field_count($mysqli))); assert(@mysqli_insert_id($mysqli) === @$mysqli->insert_id); printf("mysqli->insert_id = '%s'/%s ('%s'/%s)\n", @$mysqli->insert_id, gettype(@$mysqli->insert_id), @mysqli_insert_id($mysqli), gettype(@mysqli_insert_id($mysqli))); assert(@mysqli_sqlstate($mysqli) === @$mysqli->sqlstate); printf("mysqli->sqlstate = '%s'/%s ('%s'/%s)\n", @$mysqli->sqlstate, gettype(@$mysqli->sqlstate), @mysqli_sqlstate($mysqli), gettype(@mysqli_sqlstate($mysqli))); assert(@mysqli_get_host_info($mysqli) === @$mysqli->host_info); printf("mysqli->host_info = '%s'/%s ('%s'/%s)\n", @$mysqli->host_info, gettype(@$mysqli->host_info), @mysqli_get_host_info($mysqli), gettype(@mysqli_get_host_info($mysqli))); /* note that the data types are different */ assert(@mysqli_info($mysqli) == @$mysqli->info); printf("mysqli->info = '%s'/%s ('%s'/%s)\n", @$mysqli->info, gettype(@$mysqli->info), @mysqli_info($mysqli), gettype(@mysqli_info($mysqli))); assert(@mysqli_thread_id($mysqli) > @$mysqli->thread_id); assert(gettype(@$mysqli->thread_id) == gettype(@mysqli_thread_id($mysqli))); printf("mysqli->thread_id = '%s'/%s ('%s'/%s)\n", @$mysqli->thread_id, gettype(@$mysqli->thread_id), @mysqli_thread_id($mysqli), gettype(@mysqli_thread_id($mysqli))); assert(@mysqli_get_proto_info($mysqli) === @$mysqli->protocol_version); printf("mysqli->protocol_version = '%s'/%s ('%s'/%s)\n", @$mysqli->protocol_version, gettype(@$mysqli->protocol_version), @mysqli_get_proto_info($mysqli), gettype(@mysqli_get_proto_info($mysqli))); assert(@mysqli_get_server_info($mysqli) === @$mysqli->server_info); printf("mysqli->server_info = '%s'/%s ('%s'/%s)\n", @$mysqli->server_info, gettype(@$mysqli->server_info), @mysqli_get_server_info($mysqli), gettype(@mysqli_get_server_info($mysqli))); assert(@mysqli_get_server_version($mysqli) === @$mysqli->server_version); printf("mysqli->server_version = '%s'/%s ('%s'/%s)\n", @$mysqli->server_version, gettype(@$mysqli->server_version), @mysqli_get_server_version($mysqli), gettype(@mysqli_get_server_version($mysqli))); assert(@mysqli_warning_count($mysqli) === @$mysqli->warning_count); printf("mysqli->warning_count = '%s'/%s ('%s'/%s)\n", @$mysqli->warning_count, gettype(@$mysqli->warning_count), @mysqli_warning_count($mysqli), gettype(@mysqli_warning_count($mysqli))); printf("\nAccess to undefined properties:\n"); printf("mysqli->unknown = '%s'\n", @$mysqli->unknown); @($mysqli->unknown = 13); printf("setting mysqli->unknown, @mysqli_unknown = '%s'\n", @$mysqli->unknown); $unknown = 'friday'; @($mysqli->unknown = $unknown); printf("setting mysqli->unknown, @mysqli_unknown = '%s'\n", @$mysqli->unknown); printf("\nAccess hidden properties for MYSLQI_STATUS_INITIALIZED (TODO documentation):\n"); assert(@mysqli_connect_error() === @$mysqli->connect_error); printf("mysqli->connect_error = '%s'/%s ('%s'/%s)\n", @$mysqli->connect_error, gettype(@$mysqli->connect_error), @mysqli_connect_error(), gettype(@mysqli_connect_error())); assert(@mysqli_connect_errno() === @$mysqli->connect_errno); printf("mysqli->connect_errno = '%s'/%s ('%s'/%s)\n", @$mysqli->connect_errno, gettype(@$mysqli->connect_errno), @mysqli_connect_errno(), gettype(@mysqli_connect_errno())); }
/** * Executes the query that was previously passed to the constructor. * * @param mixed $arg Query arguments to escape and insert at ? placeholders in $query * @param mixed ... Additional arguments **/ function execute() { // Load the function arguments, minus the query itself, which we already extracted $args = func_get_args(); // Split out sub-arrays, etc.. $args = Database::smart_args($args); // Were enough arguments passed in? if (count($args) != $this->num_args_needed) { trigger_error('Database_Query_mysqlicompat called with ' . count($args) . " arguments, but requires {$this->num_args_needed}.", E_USER_ERROR); } // Finish any previous statements $this->finish(); // Replace in the arguments $this->last_query = ''; foreach ($this->query as $part) { $this->last_query .= $part; if (count($args)) { $arg = array_shift($args); $this->last_query .= is_null($arg) ? 'NULL' : "'" . mysqli_real_escape_string($this->dbh, $arg) . "'"; } } // Perform the query // If we don't have a valid connection, fataly error out. if ($this->dbh === false) { $this->db->error(); trigger_error($this->db->error, E_USER_ERROR); } $this->sh = mysqli_query($this->dbh, $this->last_query); // Cache these so the warning count below doesn't interfere if (is_bool($this->sh)) { $this->insert_id = mysqli_insert_id($this->dbh); $this->affected_rows = mysqli_affected_rows($this->dbh); } else { $this->num_rows = mysqli_num_rows($this->sh); } // On each execute, we clear the warnings of the statement handle, so it doesn't // store them up $this->warnings = array(); // Check the warnings and store them if (mysqli_warning_count($this->dbh)) { if ($sh = mysqli_query($this->dbh, 'SHOW WARNINGS')) { while ($row = mysqli_fetch_row($sh)) { $this->warnings[] = array('#' => $row[1], 'MSG' => $row[2]); } mysqli_free_result($sh); // This is used in errors.php to output in the backtrace global $_DEBUG; $_DEBUG['Database Warnings'][] = array('Query' => $this->last_query, 'Warnings' => $this->warnings); } } if ($this->sh === false) { if ($this->db->fatal_errors) { trigger_error('SQL Error: ' . mysqli_error($this->dbh) . ' [#' . mysqli_errno($this->dbh) . ']', E_USER_ERROR); } else { $this->db->error(); } } }
/** * Executes the query that was previously passed to the constructor. * * @param mixed $arg Query arguments to escape and insert at ? placeholders in $query * @param mixed ... Additional arguments **/ public function execute() { // We can't very well perform a query wtihout an active connection. if (!(is_object($this->dbh) && $this->dbh instanceof mysqli)) { $this->db->error('Lost connection to database.'); return; } // Finish any previous statements $this->finish(); // Replace in the arguments. Yes, we're doing it manually. While MySQLi // has prepared statements, the binding method requires that we know the // type of value being passed. We can't guess it with certainty. $this->last_query = $this->replaceholders(Database::smart_args(func_get_args())); if (!$this->last_query) { return; } // Wrap the actual query execution in a bit of benchmarking. $before = microtime(true); $this->sh = mysqli_query($this->dbh, $this->last_query); $after = microtime(true); $this->db->mysql_time += $after - $before; // Non-select statements return a boolean, which means we call affected_rows. if (is_bool($this->sh)) { $this->insert_id = mysqli_insert_id($this->dbh); $this->affected_rows = mysqli_affected_rows($this->dbh); } else { $this->num_rows = mysqli_num_rows($this->sh); } // Can we pull down warnings from the server? $this->warnings = array(); if ($this->db->enable_warning_logging && mysqli_warning_count($this->dbh)) { if ($sh = mysqli_query($this->dbh, 'SHOW WARNINGS')) { while ($row = mysqli_fetch_row($sh)) { $this->warnings[] = array('#' => $row[1], 'MSG' => $row[2]); } mysqli_free_result($sh); // Push it upstream. $GLOBALS['_DEBUG']['Database Warnings'][] = array('Query' => $this->last_query, 'Warnings' => $this->warnings); } } // Did it even work? if ($this->sh === false) { $this->db->error('SQL Error:'); return false; } return true; }
/** * runs a query and returns the result * * @uses PMA_DBI_QUERY_STORE * @uses PMA_DBI_QUERY_UNBUFFERED * @uses PMA_MYSQL_INT_VERSION * @uses $GLOBALS['userlink'] * @uses PMA_convert_charset() * @uses MYSQLI_STORE_RESULT * @uses MYSQLI_USE_RESULT * @uses mysqli_query() * @uses defined() * @param string $query query to execute * @param object mysqli $link mysqli object * @param integer $options * @return mixed true, false or result object */ function PMA_DBI_try_query($query, $link = null, $options = 0) { if ($options == ($options | PMA_DBI_QUERY_STORE)) { $method = MYSQLI_STORE_RESULT; } elseif ($options == ($options | PMA_DBI_QUERY_UNBUFFERED)) { $method = MYSQLI_USE_RESULT; } else { $method = 0; } if (empty($link)) { if (isset($GLOBALS['userlink'])) { $link = $GLOBALS['userlink']; } else { return false; } } if (defined('PMA_MYSQL_INT_VERSION') && PMA_MYSQL_INT_VERSION < 40100) { $query = PMA_convert_charset($query); } $result = mysqli_query($link, $query, $method); if (mysqli_warning_count($link)) { /** * @todo check $method ? */ $warning_result = mysqli_query($link, 'SHOW WARNINGS'); if ($warning_result) { $warning_row = mysqli_fetch_row($warning_result); $GLOBALS['warning'] = sprintf("%s (%d): %s", $warning_row[0], $warning_row[1], $warning_row[2]); } } else { unset($GLOBALS['warning']); } return $result; // From the PHP manual: // "note: returns true on success or false on failure. For SELECT, // SHOW, DESCRIBE or EXPLAIN, mysqli_query() will return a result object" // so, do not use the return value to feed mysqli_num_rows() if it's // a boolean }
public function simpleQuery($query, $debug = false) { global $lC_MessageStack, $lC_Services; if ($this->isConnected()) { $this->number_of_queries++; if ($debug === false && $this->debug === true) { $debug = true; } if (isset($lC_Services) && $lC_Services->isStarted('debug')) { if ($debug === false && SERVICE_DEBUG_OUTPUT_DB_QUERIES == '1') { $debug = true; } if (!lc_empty(SERVICE_DEBUG_EXECUTION_TIME_LOG) && SERVICE_DEBUG_LOG_DB_QUERIES == '1') { @error_log('QUERY ' . $query . "\n", 3, SERVICE_DEBUG_EXECUTION_TIME_LOG); } } elseif ($debug === true) { $debug = false; } if ($debug === true) { $time_start = $this->getMicroTime(); } $resource = @mysqli_query($this->link, $query); if ($debug === true) { $time_end = $this->getMicroTime(); $query_time = number_format($time_end - $time_start, 5); if ($this->debug === true) { $this->time_of_queries += $query_time; } echo '<div style="font-family: Verdana, Arial, sans-serif; font-size: 7px; font-weight: bold;">[<a href="#query' . $this->number_of_queries . '">#' . $this->number_of_queries . '</a>]</div>'; $lC_MessageStack->add('debug', '<a name=\'query' . $this->number_of_queries . '\'></a>[#' . $this->number_of_queries . ' - ' . $query_time . 's] ' . $query, 'warning'); } if ($resource !== false) { $this->error = false; $this->error_number = null; $this->error_query = null; if (mysqli_warning_count($this->link) > 0) { $warning_query = @mysqli_query($this->link, 'show warnings'); while ($warning = @mysqli_fetch_row($warning_query)) { @trigger_error(sprintf('[MYSQL] %s (%d): %s [QUERY] ' . $query, $warning[0], $warning[1], $warning[2]), E_USER_WARNING); } mysqli_free_result($warning_query); } return $resource; } else { $this->setError(mysqli_error($this->link), mysqli_errno($this->link), $query); return false; } } else { return false; } }
/** * This function determines whether the last query caused warning messages * and stores them in $this->Queries. */ function warnings() { $Warnings = array(); if (mysqli_warning_count($this->LinkID)) { $e = mysqli_get_warnings($this->LinkID); do { if ($e->errno == 1592) { // 1592: Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. continue; } $Warnings[] = 'Code ' . $e->errno . ': ' . display_str($e->message); } while ($e->next()); } $this->Queries[count($this->Queries) - 1][2] = $Warnings; }
<?php require_once "connect.inc"; /*** test mysqli_connect 127.0.0.1 ***/ $link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket); mysqli_select_db($link, $db); mysqli_query($link, "DROP TABLE IF EXISTS test_warnings"); mysqli_query($link, "DROP TABLE IF EXISTS test_warnings"); var_dump(mysqli_warning_count($link)); mysqli_close($link); print "done!";
public function getWarning() { $war = ""; if (mysqli_warning_count(self::$connection[self::$active])) { $e = mysqli_get_warnings(self::$connection[self::$active]); $war .= "<b>Aviso:</b>"; do { $war .= " {$e->errno} - {$e->message}\n<br>"; } while ($e->next()); } return $war; }
SendPacket($Packet); while ($Row = mysqli_fetch_array($result, MYSQL_NUM)) { $Packet = ''; $Lengths = mysqli_fetch_lengths($result); for ($i = 0; $i < mysqli_num_fields($result); $i++) { if (!isset($Row[$i])) { $Packet .= "û"; } else { $Packet .= PackLength($Lengths[$i]) . $Row[$i]; } } SendPacket($Packet); } $Packet = ''; $Packet .= "þ"; $Packet .= pack('v', mysqli_warning_count($mysqli)); if ($MorePackets || mysqli_more_results($mysqli)) { $Packet .= pack('v', 0x8); } else { $Packet .= pack('v', 0x0); } // Server Status SendPacket($Packet); FlushPackets(); mysqli_free_result($result); } } } while (mysqli_next_result($mysqli)); } } }
require_once "connect.inc"; $tmp = NULL; $link = NULL; if (!is_null($tmp = @mysqli_warning_count())) { printf("[001] Expecting NULL, got %s/%s\n", gettype($tmp), $tmp); } if (!is_null($tmp = @mysqli_warning_count($link))) { printf("[002] Expecting NULL, got %s/%s\n", gettype($tmp), $tmp); } require 'table.inc'; if (NULL !== ($tmp = @mysqli_warning_count($link, "too_many"))) { printf("[003] Expecting NULL, got %s/%s\n", gettype($tmp), $tmp); } if (!($res = mysqli_query($link, "SELECT id, label FROM test"))) { printf("[004] [%d] %s\n", mysqli_errno($link), mysqli_error($link)); } if (0 !== ($tmp = mysqli_warning_count($link))) { printf("[005] Expecting int/0, got %s/%s\n", gettype($tmp), $tmp); } if (!mysqli_query($link, "DROP TABLE IF EXISTS this_table_does_not_exist")) { printf("[006] [%d] %s\n", mysqli_errno($link), mysqli_error($link)); } if (1 !== ($tmp = mysqli_warning_count($link))) { printf("[007] Expecting int/1, got %s/%s\n", gettype($tmp), $tmp); } mysqli_close($link); if (NULL !== ($tmp = mysqli_warning_count($link))) { printf("[010] Expecting NULL, got %s/%s\n", gettype($tmp), $tmp); } print "done!";
printf("mysqli->stat = '%s'/%s ('%s'/%s)\n", $mysqli->stat, gettype($mysqli->stat), mysqli_stat($link), gettype(mysqli_stat($link))); assert(mysqli_get_host_info($link) === $mysqli->host_info); printf("mysqli->host_info = '%s'/%s ('%s'/%s)\n", $mysqli->host_info, gettype($mysqli->host_info), mysqli_get_host_info($link), gettype(mysqli_get_host_info($link))); /* note that the data types are different */ assert(mysqli_info($link) == $mysqli->info); printf("mysqli->info = '%s'/%s ('%s'/%s)\n", $mysqli->info, gettype($mysqli->info), mysqli_info($link), gettype(mysqli_info($link))); assert(mysqli_thread_id($link) > $mysqli->thread_id); assert(gettype($mysqli->thread_id) == gettype(mysqli_thread_id($link))); printf("mysqli->thread_id = '%s'/%s ('%s'/%s)\n", $mysqli->thread_id, gettype($mysqli->thread_id), mysqli_thread_id($link), gettype(mysqli_thread_id($link))); assert(mysqli_get_proto_info($link) === $mysqli->protocol_version); printf("mysqli->protocol_version = '%s'/%s ('%s'/%s)\n", $mysqli->protocol_version, gettype($mysqli->protocol_version), mysqli_get_proto_info($link), gettype(mysqli_get_proto_info($link))); assert(mysqli_get_server_info($link) === $mysqli->server_info); printf("mysqli->server_info = '%s'/%s ('%s'/%s)\n", $mysqli->server_info, gettype($mysqli->server_info), mysqli_get_server_info($link), gettype(mysqli_get_server_info($link))); assert(mysqli_get_server_version($link) === $mysqli->server_version); printf("mysqli->server_version = '%s'/%s ('%s'/%s)\n", $mysqli->server_version, gettype($mysqli->server_version), mysqli_get_server_version($link), gettype(mysqli_get_server_version($link))); assert(mysqli_warning_count($link) === $mysqli->warning_count); printf("mysqli->warning_count = '%s'/%s ('%s'/%s)\n", $mysqli->warning_count, gettype($mysqli->warning_count), mysqli_warning_count($link), gettype(mysqli_warning_count($link))); printf("\nAccess to undefined properties:\n"); printf("mysqli->unknown = '%s'\n", @$mysqli->unknown); @($mysqli->unknown = 13); printf("setting mysqli->unknown, mysqli_unknown = '%s'\n", @$mysqli->unknown); $unknown = 'friday'; @($mysqli->unknown = $unknown); printf("setting mysqli->unknown, mysqli_unknown = '%s'\n", @$mysqli->unknown); $mysqli = new my_mysqli($host, $user, $passwd, $db, $port, $socket); printf("\nAccess hidden properties for MYSLQI_STATUS_INITIALIZED (TODO documentation):\n"); assert(mysqli_connect_error() === $mysqli->connect_error); printf("mysqli->connect_error = '%s'/%s ('%s'/%s)\n", $mysqli->connect_error, gettype($mysqli->connect_error), mysqli_connect_error(), gettype(mysqli_connect_error())); assert(mysqli_connect_errno() === $mysqli->connect_errno); printf("mysqli->connect_errno = '%s'/%s ('%s'/%s)\n", $mysqli->connect_errno, gettype($mysqli->connect_errno), mysqli_connect_errno(), gettype(mysqli_connect_errno())); print "done!";
} if (!is_string($warning->sqlstate) || '' == $warning->sqlstate) { /* NULL or not there at all */ printf("[012] Expecting string/not empty, got %s/%s\n", gettype($warning->sqlstate), $warning->sqlstate); } if (!is_int($warning->errno) || 0 == $warning->errno) { /* NULL or not there at all */ printf("[013] Expecting int/not 0, got %s/%s\n", gettype($warning->errno), $warning->errno); } if (false !== ($tmp = $warning->next())) { printf("[014] Expecting boolean/true, got %s/%s\n", gettype($tmp), $tmp); } if (!mysqli_query($link, "INSERT INTO test (id) VALUES (1000000), (1000001)")) { printf("[015] [%d] %s\n", mysqli_errno($link), mysqli_error($link)); } if (($tmp = mysqli_warning_count($link)) !== 2) { printf("[016] Expecting 2 warnings, got %d warnings", $tmp); } if (!is_object($warning = mysqli_get_warnings($link)) || 'mysqli_warning' != get_class($warning)) { printf("[017] Expecting object/mysqli_warning, got %s/%s\n", gettype($tmp), is_object($tmp) ? var_dump($tmp, true) : $tmp); } if (true !== ($tmp = $warning->next())) { printf("[018] Expecting boolean/true, got %s/%s\n", gettype($tmp), $tmp); } if (false !== ($tmp = $warning->next())) { printf("[020] Expecting boolean/false, got %s/%s\n", gettype($tmp), $tmp); } mysqli_close($link); if (!($mysqli = new my_mysqli($host, $user, $passwd, $db, $port, $socket))) { printf("[021] Cannot create mysqli object: [%d] %s\n", mysqli_connect_errno(), mysqli_connect_error()); }