setDriver($driver); } } /** * @param \Zend\Db\Adapter\Driver\Mysqli\Mysqli|\Zend\Db\Adapter\Driver\Pdo\Pdo||\mysqli|\PDO $driver * @throws \Zend\Db\Adapter\Exception\InvalidArgumentException * @return $this */ public function setDriver($driver) { // handle Zend\Db drivers if ($driver instanceof Mysqli\Mysqli || ($driver instanceof Pdo\Pdo && $driver->getDatabasePlatformName() == 'Mysql') || ($driver instanceof \mysqli) || ($driver instanceof \PDO && $driver->getAttribute(\PDO::ATTR_DRIVER_NAME) == 'mysql') ) { $this->resource = $driver; return $this; } throw new Exception\InvalidArgumentException('$driver must be a Mysqli or Mysql PDO Zend\Db\Adapter\Driver, Mysqli instance or MySQL PDO instance'); } /** * Get name * * @return string */ public function getName() { return 'MySQL'; } /** * Get quote identifier symbol * * @return string */ public function getQuoteIdentifierSymbol() { return '`'; } /** * Quote identifier * * @param string $identifier * @return string */ public function quoteIdentifier($identifier) { return '`' . str_replace('`', '``', $identifier) . '`'; } /** * Quote identifier chain * * @param string|string[] $identifierChain * @return string */ public function quoteIdentifierChain($identifierChain) { $identifierChain = str_replace('`', '``', $identifierChain); if (is_array($identifierChain)) { $identifierChain = implode('`.`', $identifierChain); } return '`' . $identifierChain . '`'; } /** * Get quote value symbol * * @return string */ public function getQuoteValueSymbol() { return '\''; } /** * Quote value * * @param string $value * @return string */ public function quoteValue($value) { if ($this->resource instanceof DriverInterface) { $this->resource = $this->resource->getConnection()->getResource(); } if ($this->resource instanceof \mysqli) { return '\'' . $this->resource->real_escape_string($value) . '\''; } if ($this->resource instanceof \PDO) { return $this->resource->quote($value); } trigger_error( 'Attempting to quote a value in ' . __CLASS__ . ' without extension/driver support ' . 'can introduce security vulnerabilities in a production environment.' ); return '\'' . addcslashes($value, "\x00\n\r\\'\"\x1a") . '\''; } /** * Quote Trusted Value * * The ability to quote values without notices * * @param $value * @return mixed */ public function quoteTrustedValue($value) { if ($this->resource instanceof DriverInterface) { $this->resource = $this->resource->getConnection()->getResource(); } if ($this->resource instanceof \mysqli) { return '\'' . $this->resource->real_escape_string($value) . '\''; } if ($this->resource instanceof \PDO) { return $this->resource->quote($value); } return '\'' . addcslashes($value, "\x00\n\r\\'\"\x1a") . '\''; } /** * Quote value list * * @param string|string[] $valueList * @return string */ public function quoteValueList($valueList) { if (!is_array($valueList)) { return $this->quoteValue($valueList); } $value = reset($valueList); do { $valueList[key($valueList)] = $this->quoteValue($value); } while ($value = next($valueList)); return implode(', ', $valueList); } /** * Get identifier separator * * @return string */ public function getIdentifierSeparator() { return '.'; } /** * Quote identifier in fragment * * @param string $identifier * @param array $safeWords * @return string */ public function quoteIdentifierInFragment($identifier, array $safeWords = array()) { // regex taken from @link http://dev.mysql.com/doc/refman/5.0/en/identifiers.html $parts = preg_split('#([^0-9,a-z,A-Z$_])#', $identifier, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY); if ($safeWords) { $safeWords = array_flip($safeWords); $safeWords = array_change_key_case($safeWords, CASE_LOWER); } foreach ($parts as $i => $part) { if ($safeWords && isset($safeWords[strtolower($part)])) { continue; } switch ($part) { case ' ': case '.': case '*': case 'AS': case 'As': case 'aS': case 'as': break; default: $parts[$i] = '`' . str_replace('`', '``', $part) . '`'; } } return implode('', $parts); } }