/**
  * Get the name of columns returned from a SELECT statement
  * @param object $result_obj A result object obtained from 
  *  a query against the database
  * @return array $colNames
  */
 public function columnHeadings($result_obj)
 {
     $field_names = array();
     $field_info = $result_obj->fetch_fields();
     foreach ($field_info as $value) {
         $field_names[] = $value->name;
     }
     return $field_names;
 }
 /**
  * Executes the prepared statement. If the prepared statement included parameter
  * markers, you must either:
  * <ul>
  * <li>call {@link \TYPO3\CMS\Core\Database\PreparedStatement::bindParam()} to bind PHP variables
  * to the parameter markers: bound variables pass their value as input</li>
  * <li>or pass an array of input-only parameter values</li>
  * </ul>
  *
  * $input_parameters behave as in {@link \TYPO3\CMS\Core\Database\PreparedStatement::bindParams()}
  * and work for both named parameters and question mark parameters.
  *
  * Example 1:
  * <code>
  * $statement = $GLOBALS['TYPO3_DB']->prepare_SELECTquery('*', 'bugs', 'reported_by = ? AND bug_status = ?');
  * $statement->execute(array('goofy', 'FIXED'));
  * </code>
  *
  * Example 2:
  * <code>
  * $statement = $GLOBALS['TYPO3_DB']->prepare_SELECTquery('*', 'bugs', 'reported_by = :nickname AND bug_status = :status');
  * $statement->execute(array(':nickname' => 'goofy', ':status' => 'FIXED'));
  * </code>
  *
  * @param array $input_parameters An array of values with as many elements as there are bound parameters in the SQL statement being executed. The PHP type of each array value will be used to decide which PARAM_* type to use (int, string, boolean, NULL), so make sure your variables are properly casted, if needed.
  * @return bool Returns TRUE on success or FALSE on failure.
  * @throws \InvalidArgumentException
  * @api
  */
 public function execute(array $input_parameters = array())
 {
     $parameterValues = $this->parameters;
     if (!empty($input_parameters)) {
         $parameterValues = array();
         foreach ($input_parameters as $key => $value) {
             $parameterValues[$key] = array('value' => $value, 'type' => $this->guessValueType($value));
         }
     }
     if ($this->statement !== NULL) {
         // The statement has already been executed, we try to reset it
         // for current run but will set it to NULL if it fails for some
         // reason, just as if it were the first run
         if (!@$this->statement->reset()) {
             $this->statement = NULL;
         }
     }
     if ($this->statement === NULL) {
         // The statement has never been executed so we prepare it and
         // store it for further reuse
         $query = $this->query;
         $precompiledQueryParts = $this->precompiledQueryParts;
         $this->convertNamedPlaceholdersToQuestionMarks($query, $parameterValues, $precompiledQueryParts);
         if (!empty($precompiledQueryParts)) {
             $query = implode('', $precompiledQueryParts['queryParts']);
         }
         $this->statement = $GLOBALS['TYPO3_DB']->prepare_PREPAREDquery($query, $precompiledQueryParts);
         if ($this->statement === NULL) {
             return FALSE;
         }
     }
     $combinedTypes = '';
     $values = array();
     foreach ($parameterValues as $parameterValue) {
         switch ($parameterValue['type']) {
             case self::PARAM_NULL:
                 $type = 's';
                 $value = NULL;
                 break;
             case self::PARAM_INT:
                 $type = 'i';
                 $value = (int) $parameterValue['value'];
                 break;
             case self::PARAM_STR:
                 $type = 's';
                 $value = $parameterValue['value'];
                 break;
             case self::PARAM_BOOL:
                 $type = 'i';
                 $value = $parameterValue['value'] ? 1 : 0;
                 break;
             default:
                 throw new \InvalidArgumentException(sprintf('Unknown type %s used for parameter %s.', $parameterValue['type'], $key), 1281859196);
         }
         $combinedTypes .= $type;
         $values[] = $value;
     }
     // ->bind_param requires second up to last arguments as references
     if (!empty($combinedTypes)) {
         $bindParamArguments = array();
         $bindParamArguments[] = $combinedTypes;
         $numberOfExtraParamArguments = count($values);
         for ($i = 0; $i < $numberOfExtraParamArguments; $i++) {
             $bindParamArguments[] =& $values[$i];
         }
         call_user_func_array(array($this->statement, 'bind_param'), $bindParamArguments);
     }
     $success = $this->statement->execute();
     // Store result
     if (!$success || $this->statement->store_result() === FALSE) {
         return FALSE;
     }
     if (empty($this->fields)) {
         // Store the list of fields
         if ($this->statement instanceof \mysqli_stmt) {
             $result = $this->statement->result_metadata();
             if ($result instanceof \mysqli_result) {
                 $fields = $result->fetch_fields();
                 $result->close();
             }
         } else {
             $fields = $this->statement->fetch_fields();
         }
         if (is_array($fields)) {
             foreach ($fields as $field) {
                 $this->fields[] = $field->name;
             }
         }
     }
     // New result set available
     $this->buffer = NULL;
     // Empty binding parameters
     $this->parameters = array();
     // Return the success flag
     return $success;
 }
Exemple #3
0
    /**
     * @return void
     */
    protected function setMetadata()
    {
        static $numbers = array('MYSQLI_TYPE_BIT', 'MYSQLI_TYPE_CHAR', 'MYSQLI_TYPE_DECIMAL', 'MYSQLI_TYPE_DOUBLE', 'MYSQLI_TYPE_FLOAT', 'MYSQLI_TYPE_INT24', 'MYSQLI_TYPE_LONG', 'MYSQLI_TYPE_LONGLONG', 'MYSQLI_TYPE_NEWDECIMAL', 'MYSQLI_TYPE_SHORT', 'MYSQLI_TYPE_TINY');
        $doubles = array('MYSQLI_TYPE_DECIMAL', 'MYSQLI_TYPE_DOUBLE', 'MYSQLI_TYPE_FLOAT', 'MYSQLI_TYPE_NEWDECIMAL');
        static $alignRight = array('MYSQLI_TYPE_BIT', 'MYSQLI_TYPE_CHAR', 'MYSQLI_TYPE_DATE', 'MYSQLI_TYPE_DATETIME', 'MYSQLI_TYPE_DECIMAL', 'MYSQLI_TYPE_DOUBLE', 'MYSQLI_TYPE_FLOAT', 'MYSQLI_TYPE_INT24', 'MYSQLI_TYPE_INTERVAL', 'MYSQLI_TYPE_LONG', 'MYSQLI_TYPE_LONGLONG', 'MYSQLI_TYPE_NEWDATE', 'MYSQLI_TYPE_NEWDECIMAL', 'MYSQLI_TYPE_NULL', 'MYSQLI_TYPE_SHORT', 'MYSQLI_TYPE_TIME', 'MYSQLI_TYPE_TIMESTAMP', 'MYSQLI_TYPE_TINY', 'MYSQLI_TYPE_YEAR');
        if (!$this->stmt) {
            return false;
        }
        $a = get_defined_constants('mysqli');
        $a = $a['mysqli'];
        $types = array();
        $flags = array();
        foreach ($a as $k => $v) {
            if (preg_match('/_TYPE_/', $k)) {
                $types[$v] = $k;
            }
            if (preg_match('/_FLAG$/', $k)) {
                $flags[$v] = $k;
            }
        }
        ksort($types);
        ksort($flags);
        $fields = $this->stmt->fetch_fields();
        $max_places = $this->getOption(self::OPTION_MAX_PLACES);
        $not_nums = $this->getOption(self::OPTION_NOT_NUMS);
        $tables = array();
        for ($i = 0; $i < count($fields); ++$i) {
            if ($fields[$i]->orgtable) {
                if (isset($fields[$i]->db)) {
                    $tables[$fields[$i]->db . '.' . $fields[$i]->orgtable] = sprintf("('%s','%s')", $fields[$i]->db, $fields[$i]->orgtable);
                } else {
                    $tables[$fields[$i]->orgtable] = sprintf("('','%s')", $fields[$i]->orgtable);
                }
            }
            $fields[$i]->field_type = $types[$fields[$i]->type];
            $fields[$i]->numeric = in_array($fields[$i]->field_type, $numbers);
            $fields[$i]->double = in_array($fields[$i]->field_type, $doubles);
            $fields[$i]->alignment = in_array($fields[$i]->field_type, $alignRight) ? 'right' : 'left';
            $fields[$i]->format = false;
            $fields[$i]->places = 0;
            if ($fields[$i]->numeric) {
                $fields[$i]->format = true;
                if ($fields[$i]->decimals > 0) {
                    $fields[$i]->places = $fields[$i]->decimals > $fields[$i]->max_length ? $fields[$i]->max_length : $fields[$i]->decimals;
                    $fields[$i]->places = min($fields[$i]->places, $max_places);
                }
            }
            if (preg_match($not_nums, $fields[$i]->name)) {
                $fields[$i]->format = false;
            }
            $fields[$i]->flag = array();
            foreach ($flags as $k => $v) {
                $fields[$i]->flag[$v] = ($fields[$i]->flags & $k) == $k;
            }
        }
        if ($tables) {
            $tables_sql = join(",\n", array_values($tables));
            $sql = <<<EOT
SELECT
table_schema,
table_name,
column_name,
index_type,
seq_in_index
FROM
information_schema.statistics
WHERE
(table_schema, table_name) IN (
{$tables_sql}
)
ORDER BY
table_schema,
table_name,
column_name,
index_type,
seq_in_index
EOT;
            $rows = $this->getData($sql);
            $indexes = array();
            foreach ($rows as $row) {
                if (!isset($indexes[$row['table_schema']])) {
                    $indexes[$row['table_schema']] = array();
                }
                if (!isset($indexes[$row['table_schema']][$row['table_name']])) {
                    $indexes[$row['table_schema']][$row['table_name']] = array();
                }
                $indexes[$row['table_schema']][$row['table_name']][$row['column_name']] = array('type' => $row['index_type'], 'seq' => $row['seq_in_index']);
            }
            for ($i = 0; $i < count($fields); ++$i) {
                $db = isset($fields[$i]->db) ? $fields[$i]->db : '';
                $fields[$i]->index_type = isset($indexes[$db][$fields[$i]->orgtable][$fields[$i]->orgname]) ? $indexes[$db][$fields[$i]->orgtable][$fields[$i]->orgname]['type'] : false;
                $fields[$i]->index_sequence = isset($indexes[$db][$fields[$i]->orgtable][$fields[$i]->orgname]) ? $indexes[$db][$fields[$i]->orgtable][$fields[$i]->orgname]['seq'] : false;
            }
        }
        $this->metadata = $fields;
        return true;
    }