Zend Framework入门教程之Zend_Db数据库操作详解

本文实例讲述了Zend Framework中Zend_Db数据库操作方法。分享给大家供大家参考,具体如下:

引言:Zend操作数据库通过Zend_Db_Adapter

它可以连接多种数据库,可以是DB2数据库、MySQli数据库、Oracle数据库。等等。

只需要配置相应的参数就可以了。

下面通过案例来展示一下其连接数据库的过程。

连接mysql数据库

代码:

'127.0.0.1','username'=>'root','password'=>'','dbname'=>'test' ); $db = Zend_Db::factory('PDO_Mysql',$params);

点评:

这是连接mysql的代码案例,提供相应的参数就可以了。连接不同的数据库,提供不同的参数。下面是sqlite的例子

代码:

'test.mdb'); $db = Zend_Db::factory('PDO_Sqlite',$params);

点评:

sqlite明显参数不一样了,只需要提供数据库名字就可以了。 连接完数据库之后,就可以查询数据库信息以及操作数据库信息了。 如果查询呢?

下面是查询的代码案例:

'127.0.0.1',$params); $sql = $db->quoteInto('SELECT * FROM user WHERE idquery($sql); //执行SQL查询 $r_a = $result->fetchAll(); //返回结果数组 print_r($r_a);

点评:

执行完上述代码,就会展示出数据库中前五条记录的信息。

那么这其中的玄机是什么呢?

我们来看一下源码。

我们来看看Db.php中的factory方法

toArray(); } /* * Convert Zend_Config argument to plain string * adapter name and separate config object. */ if ($adapter instanceof Zend_Config) { if (isset($adapter->params)) { $config = $adapter->params->toArray(); } if (isset($adapter->adapter)) { $adapter = (string) $adapter->adapter; } else { $adapter = null; } } /* * Verify that adapter parameters are in an array. */ if (!is_array($config)) { /** * @see Zend_Db_Exception */ require_once 'Zend/Db/Exception.php'; throw new Zend_Db_Exception('Adapter parameters must be in an array or a Zend_Config object'); } /* * Verify that an adapter name has been specified. */ if (!is_string($adapter) || empty($adapter)) { /** * @see Zend_Db_Exception */ require_once 'Zend/Db/Exception.php'; throw new Zend_Db_Exception('Adapter name must be specified in a string'); } /* * Form full adapter class name */ $adapterNamespace = 'Zend_Db_Adapter'; if (isset($config['adapterNamespace'])) { if ($config['adapterNamespace'] != '') { $adapterNamespace = $config['adapterNamespace']; } unset($config['adapterNamespace']); } // Adapter no longer normalized- see http://framework.zend.com/issues/browse/ZF-5606 $adapterName = $adapterNamespace . '_'; $adapterName .= str_replace(' ','_',ucwords(str_replace('_',' ',strtolower($adapter)))); print_r($adapterName);exit; /* * Load the adapter class. This throws an exception * if the specified class cannot be loaded. */ if (!class_exists($adapterName)) { require_once 'Zend/Loader.php'; Zend_Loader::loadClass($adapterName); } /* * Create an instance of the adapter class. * Pass the config to the adapter class constructor. */ $dbAdapter = new $adapterName($config); /* * Verify that the object created is a descendent of the abstract adapter type. */ if (! $dbAdapter instanceof Zend_Db_Adapter_Abstract) { /** * @see Zend_Db_Exception */ require_once 'Zend/Db/Exception.php'; throw new Zend_Db_Exception("Adapter class '$adapterName' does not extend Zend_Db_Adapter_Abstract"); } return $dbAdapter; }

点评:这个方法就是核心了,代码量不多,但是作用很明确,它会通过你提供的两个参数,自动生成相应的数据库连接类的对象。具有一定的灵活性,机动性。

主要是其中的

这段代码会引入相应的数据库连接类,比如前面的两个例子,就是分别引入了Zend目录下Db目录下Adapter目录下Pdo目录下的mysql.php类。

不同的数据库,会引入不同的数据库文件。

我们来看看mysql.php类中的内容:

Zend_Db::INT_TYPE,Zend_Db::BIGINT_TYPE => Zend_Db::BIGINT_TYPE,Zend_Db::FLOAT_TYPE => Zend_Db::FLOAT_TYPE,'INT' => Zend_Db::INT_TYPE,'INTEGER' => Zend_Db::INT_TYPE,'MEDIUMINT' => Zend_Db::INT_TYPE,'SMALLINT' => Zend_Db::INT_TYPE,'TINYINT' => Zend_Db::INT_TYPE,'BIGINT' => Zend_Db::BIGINT_TYPE,'SERIAL' => Zend_Db::BIGINT_TYPE,'DEC' => Zend_Db::FLOAT_TYPE,'DECIMAL' => Zend_Db::FLOAT_TYPE,'DOUBLE' => Zend_Db::FLOAT_TYPE,'DOUBLE PRECISION' => Zend_Db::FLOAT_TYPE,'FIXED' => Zend_Db::FLOAT_TYPE,'FLOAT' => Zend_Db::FLOAT_TYPE ); /** * Override _dsn() and ensure that charset is incorporated in mysql * @see Zend_Db_Adapter_Pdo_Abstract::_dsn() */ protected function _dsn() { $dsn = parent::_dsn(); if (isset($this->_config['charset'])) { $dsn .= ';charset=' . $this->_config['charset']; } return $dsn; } /** * Creates a PDO object and connects to the database. * * @return void * @throws Zend_Db_Adapter_Exception */ protected function _connect() { if ($this->_connection) { return; } if (!empty($this->_config['charset'])) { $initCommand = "SET NAMES '" . $this->_config['charset'] . "'"; $this->_config['driver_options'][1002] = $initCommand; // 1002 = PDO::MYSQL_ATTR_INIT_COMMAND } parent::_connect(); } /** * @return string */ public function getQuoteIdentifierSymbol() { return "`"; } /** * Returns a list of the tables in the database. * * @return array */ public function listTables() { return $this->fetchCol('SHOW TABLES'); } /** * Returns the column descriptions for a table. * * The return value is an associative array keyed by the column name,* as returned by the RDBMS. * * The value of each array element is an associative array * with the following keys: * * SCHEMA_NAME => string; name of database or schema * TABLE_NAME => string; * COLUMN_NAME => string; column name * COLUMN_POSITION => number; ordinal position of column in table * DATA_TYPE => string; SQL datatype name of column * DEFAULT => string; default expression of column,null if none * NULLABLE => boolean; true if column can have nulls * LENGTH => number; length of CHAR/VARCHAR * SCALE => number; scale of NUMERIC/DECIMAL * PRECISION => number; precision of NUMERIC/DECIMAL * UNSIGNED => boolean; unsigned property of an integer type * PRIMARY => boolean; true if column is part of the primary key * PRIMARY_POSITION => integer; position of column in primary key * IDENTITY => integer; true if column is auto-generated with unique values * * @param string $tableName * @param string $schemaName OPTIONAL * @return array */ public function describeTable($tableName,$schemaName = null) { // @todo use INFORMATION_SCHEMA someday when MySQL's // implementation has reasonably good performance and // the version with this improvement is in wide use. if ($schemaName) { $sql = 'DESCRIBE ' . $this->quoteIdentifier("$schemaName.$tableName",true); } else { $sql = 'DESCRIBE ' . $this->quoteIdentifier($tableName,true); } $stmt = $this->query($sql); // Use FETCH_NUM so we are not dependent on the CASE attribute of the PDO connection $result = $stmt->fetchAll(Zend_Db::FETCH_NUM); $field = 0; $type = 1; $null = 2; $key = 3; $default = 4; $extra = 5; $desc = array(); $i = 1; $p = 1; foreach ($result as $row) { list($length,$scale,$precision,$unsigned,$primary,$primaryPosition,$identity) = array(null,null,false,false); if (preg_match('/unsigned/',$row[$type])) { $unsigned = true; } if (preg_match('/^((?:var)?char)\((\d+)\)/',$row[$type],$matches)) { $row[$type] = $matches[1]; $length = $matches[2]; } else if (preg_match('/^decimal\((\d+),(\d+)\)/',$matches)) { $row[$type] = 'decimal'; $precision = $matches[1]; $scale = $matches[2]; } else if (preg_match('/^float\((\d+),$matches)) { $row[$type] = 'float'; $precision = $matches[1]; $scale = $matches[2]; } else if (preg_match('/^((?:big|medium|small|tiny)?int)\((\d+)\)/',$matches)) { $row[$type] = $matches[1]; // The optional argument of a MySQL int type is not precision // or length; it is only a hint for display width. } if (strtoupper($row[$key]) == 'PRI') { $primary = true; $primaryPosition = $p; if ($row[$extra] == 'auto_increment') { $identity = true; } else { $identity = false; } ++$p; } $desc[$this->foldCase($row[$field])] = array( 'SCHEMA_NAME' => null,// @todo 'TABLE_NAME' => $this->foldCase($tableName),'COLUMN_NAME' => $this->foldCase($row[$field]),'COLUMN_POSITION' => $i,'DATA_TYPE' => $row[$type],'DEFAULT' => $row[$default],'NULLABLE' => (bool) ($row[$null] == 'YES'),'LENGTH' => $length,'SCALE' => $scale,'PRECISION' => $precision,'UNSIGNED' => $unsigned,'PRIMARY' => $primary,'PRIMARY_POSITION' => $primaryPosition,'IDENTITY' => $identity ); ++$i; } return $desc; } /** * Adds an adapter-specific LIMIT clause to the SELECT statement. * * @param string $sql * @param integer $count * @param integer $offset OPTIONAL * @throws Zend_Db_Adapter_Exception * @return string */ public function limit($sql,$count,$offset = 0) { $count = intval($count); if ($count <= 0) { /** @see Zend_Db_Adapter_Exception */ require_once 'Zend/Db/Adapter/Exception.php'; throw new Zend_Db_Adapter_Exception("LIMIT argument count=$count is not valid"); } $offset = intval($offset); if ($offset < 0) { /** @see Zend_Db_Adapter_Exception */ require_once 'Zend/Db/Adapter/Exception.php'; throw new Zend_Db_Adapter_Exception("LIMIT argument offset=$offset is not valid"); } $sql .= " LIMIT $count"; if ($offset > 0) { $sql .= " OFFSET $offset"; } return $sql; } }

这里又引入了一个Abstract类,抽象类

_config settings. * * @return string */ protected function _dsn() { // baseline of DSN parts $dsn = $this->_config; // don't pass the username,password,charset,persistent and driver_options in the DSN unset($dsn['username']); unset($dsn['password']); unset($dsn['options']); unset($dsn['charset']); unset($dsn['persistent']); unset($dsn['driver_options']); // use all remaining parts in the DSN foreach ($dsn as $key => $val) { $dsn[$key] = "$key=$val"; } return $this->_pdoType . ':' . implode(';',$dsn); } /** * Creates a PDO object and connects to the database. * * @return void * @throws Zend_Db_Adapter_Exception */ protected function _connect() { // if we already have a PDO object,no need to re-connect. if ($this->_connection) { return; } // get the dsn first,because some adapters alter the $_pdoType $dsn = $this->_dsn(); // check for PDO extension if (!extension_loaded('pdo')) { /** * @see Zend_Db_Adapter_Exception */ require_once 'Zend/Db/Adapter/Exception.php'; throw new Zend_Db_Adapter_Exception('The PDO extension is required for this adapter but the extension is not loaded'); } // check the PDO driver is available if (!in_array($this->_pdoType,PDO::getAvailableDrivers())) { /** * @see Zend_Db_Adapter_Exception */ require_once 'Zend/Db/Adapter/Exception.php'; throw new Zend_Db_Adapter_Exception('The ' . $this->_pdoType . ' driver is not currently installed'); } // create PDO connection $q = $this->_profiler->queryStart('connect',Zend_Db_Profiler::CONNECT); // add the persistence flag if we find it in our config array if (isset($this->_config['persistent']) && ($this->_config['persistent'] == true)) { $this->_config['driver_options'][PDO::ATTR_PERSISTENT] = true; } try { $this->_connection = new PDO( $dsn,$this->_config['username'],$this->_config['password'],$this->_config['driver_options'] ); $this->_profiler->queryEnd($q); // set the PDO connection to perform case-folding on array keys,or not $this->_connection->setAttribute(PDO::ATTR_CASE,$this->_caseFolding); // always use exceptions. $this->_connection->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); } catch (PDOException $e) { /** * @see Zend_Db_Adapter_Exception */ require_once 'Zend/Db/Adapter/Exception.php'; throw new Zend_Db_Adapter_Exception($e->getMessage(),$e->getCode(),$e); } } /** * Test if a connection is active * * @return boolean */ public function isConnected() { return ((bool) ($this->_connection instanceof PDO)); } /** * Force the connection to close. * * @return void */ public function closeConnection() { $this->_connection = null; } /** * Prepares an SQL statement. * * @param string $sql The SQL statement with placeholders. * @param array $bind An array of data to bind to the placeholders. * @return PDOStatement */ public function prepare($sql) { $this->_connect(); $stmtClass = $this->_defaultStmtClass; if (!class_exists($stmtClass)) { require_once 'Zend/Loader.php'; Zend_Loader::loadClass($stmtClass); } $stmt = new $stmtClass($this,$sql); $stmt->setFetchMode($this->_fetchMode); return $stmt; } /** * Gets the last ID generated automatically by an IDENTITY/AUTOINCREMENT column. * * As a convention,on RDBMS brands that support sequences * (e.g. Oracle,PostgreSQL,DB2),this method forms the name of a sequence * from the arguments and returns the last id generated by that sequence. * On RDBMS brands that support IDENTITY/AUTOINCREMENT columns,this method * returns the last value generated for such a column,and the table name * argument is disregarded. * * On RDBMS brands that don't support sequences,$tableName and $primaryKey * are ignored. * * @param string $tableName OPTIONAL Name of table. * @param string $primaryKey OPTIONAL Name of primary key column. * @return string */ public function lastInsertId($tableName = null,$primaryKey = null) { $this->_connect(); return $this->_connection->lastInsertId(); } /** * Special handling for PDO query(). * All bind parameter names must begin with ':' * * @param string|Zend_Db_Select $sql The SQL statement with placeholders. * @param array $bind An array of data to bind to the placeholders. * @return Zend_Db_Statement_Pdo * @throws Zend_Db_Adapter_Exception To re-throw PDOException. */ public function query($sql,$bind = array()) { if (empty($bind) && $sql instanceof Zend_Db_Select) { $bind = $sql->getBind(); } if (is_array($bind)) { foreach ($bind as $name => $value) { if (!is_int($name) && !preg_match('/^:/',$name)) { $newName = ":$name"; unset($bind[$name]); $bind[$newName] = $value; } } } try { return parent::query($sql,$bind); } catch (PDOException $e) { /** * @see Zend_Db_Statement_Exception */ require_once 'Zend/Db/Statement/Exception.php'; throw new Zend_Db_Statement_Exception($e->getMessage(),$e); } } /** * Executes an SQL statement and return the number of affected rows * * @param mixed $sql The SQL statement with placeholders. * May be a string or Zend_Db_Select. * @return integer Number of rows that were modified * or deleted by the SQL statement */ public function exec($sql) { if ($sql instanceof Zend_Db_Select) { $sql = $sql->assemble(); } try { $affected = $this->getConnection()->exec($sql); if ($affected === false) { $errorInfo = $this->getConnection()->errorInfo(); /** * @see Zend_Db_Adapter_Exception */ require_once 'Zend/Db/Adapter/Exception.php'; throw new Zend_Db_Adapter_Exception($errorInfo[2]); } return $affected; } catch (PDOException $e) { /** * @see Zend_Db_Adapter_Exception */ require_once 'Zend/Db/Adapter/Exception.php'; throw new Zend_Db_Adapter_Exception($e->getMessage(),$e); } } /** * Quote a raw string. * * @param string $value Raw string * @return string Quoted string */ protected function _quote($value) { if (is_int($value) || is_float($value)) { return $value; } $this->_connect(); return $this->_connection->quote($value); } /** * Begin a transaction. */ protected function _beginTransaction() { $this->_connect(); $this->_connection->beginTransaction(); } /** * Commit a transaction. */ protected function _commit() { $this->_connect(); $this->_connection->commit(); } /** * Roll-back a transaction. */ protected function _rollBack() { $this->_connect(); $this->_connection->rollBack(); } /** * Set the PDO fetch mode. * * @todo Support FETCH_CLASS and FETCH_INTO. * * @param int $mode A PDO fetch mode. * @return void * @throws Zend_Db_Adapter_Exception */ public function setFetchMode($mode) { //check for PDO extension if (!extension_loaded('pdo')) { /** * @see Zend_Db_Adapter_Exception */ require_once 'Zend/Db/Adapter/Exception.php'; throw new Zend_Db_Adapter_Exception('The PDO extension is required for this adapter but the extension is not loaded'); } switch ($mode) { case PDO::FETCH_LAZY: case PDO::FETCH_ASSOC: case PDO::FETCH_NUM: case PDO::FETCH_BOTH: case PDO::FETCH_NAMED: case PDO::FETCH_OBJ: $this->_fetchMode = $mode; break; default: /** * @see Zend_Db_Adapter_Exception */ require_once 'Zend/Db/Adapter/Exception.php'; throw new Zend_Db_Adapter_Exception("Invalid fetch mode '$mode' specified"); break; } } /** * Check if the adapter supports real SQL parameters. * * @param string $type 'positional' or 'named' * @return bool */ public function supportsParameters($type) { switch ($type) { case 'positional': case 'named': default: return true; } } /** * Retrieve server version in PHP style * * @return string */ public function getServerVersion() { $this->_connect(); try { $version = $this->_connection->getAttribute(PDO::ATTR_SERVER_VERSION); } catch (PDOException $e) { // In case of the driver doesn't support getting attributes return null; } $matches = null; if (preg_match('/((?:[0-9]{1,2}\.){1,3}[0-9]{1,2})/',$version,$matches)) { return $matches[1]; } else { return null; } } }

这个抽象类中又有另一个核心的抽象类。一些核心的方法都在这里

Zend_Db::FLOAT_TYPE ); /** Weither or not that object can get serialized * * @var bool */ protected $_allowSerialization = true; /** * Weither or not the database should be reconnected * to that adapter when waking up * * @var bool */ protected $_autoReconnectOnUnserialize = false; /** * Constructor. * * $config is an array of key/value pairs or an instance of Zend_Config * containing configuration options. These options are common to most adapters: * * dbname => (string) The name of the database to user * username => (string) Connect to the database as this username. * password => (string) Password associated with the username. * host => (string) What host to connect to,defaults to localhost * * Some options are used on a case-by-case basis by adapters: * * port => (string) The port of the database * persistent => (boolean) Whether to use a persistent connection or not,defaults to false * protocol => (string) The network protocol,defaults to TCPIP * caseFolding => (int) style of case-alteration used for identifiers * socket => (string) The socket or named pipe that should be used * * @param array|Zend_Config $config An array or instance of Zend_Config having configuration data * @throws Zend_Db_Adapter_Exception */ public function __construct($config) { /* * Verify that adapter parameters are in an array. */ if (!is_array($config)) { /* * Convert Zend_Config argument to a plain array. */ if ($config instanceof Zend_Config) { $config = $config->toArray(); } else { /** * @see Zend_Db_Adapter_Exception */ require_once 'Zend/Db/Adapter/Exception.php'; throw new Zend_Db_Adapter_Exception('Adapter parameters must be in an array or a Zend_Config object'); } } $this->_checkRequiredOptions($config); $options = array( Zend_Db::CASE_FOLDING => $this->_caseFolding,Zend_Db::AUTO_QUOTE_IDENTIFIERS => $this->_autoQuoteIdentifiers,Zend_Db::FETCH_MODE => $this->_fetchMode,); $driverOptions = array(); /* * normalize the config and merge it with the defaults */ if (array_key_exists('options',$config)) { // can't use array_merge() because keys might be integers foreach ((array) $config['options'] as $key => $value) { $options[$key] = $value; } } if (array_key_exists('driver_options',$config)) { if (!empty($config['driver_options'])) { // can't use array_merge() because keys might be integers foreach ((array) $config['driver_options'] as $key => $value) { $driverOptions[$key] = $value; } } } if (!isset($config['charset'])) { $config['charset'] = null; } if (!isset($config['persistent'])) { $config['persistent'] = false; } $this->_config = array_merge($this->_config,$config); $this->_config['options'] = $options; $this->_config['driver_options'] = $driverOptions; // obtain the case setting,if there is one if (array_key_exists(Zend_Db::CASE_FOLDING,$options)) { $case = (int) $options[Zend_Db::CASE_FOLDING]; switch ($case) { case Zend_Db::CASE_LOWER: case Zend_Db::CASE_UPPER: case Zend_Db::CASE_NATURAL: $this->_caseFolding = $case; break; default: /** @see Zend_Db_Adapter_Exception */ require_once 'Zend/Db/Adapter/Exception.php'; throw new Zend_Db_Adapter_Exception('Case must be one of the following constants: ' . 'Zend_Db::CASE_NATURAL,Zend_Db::CASE_LOWER,Zend_Db::CASE_UPPER'); } } if (array_key_exists(Zend_Db::FETCH_MODE,$options)) { if (is_string($options[Zend_Db::FETCH_MODE])) { $constant = 'Zend_Db::FETCH_' . strtoupper($options[Zend_Db::FETCH_MODE]); if(defined($constant)) { $options[Zend_Db::FETCH_MODE] = constant($constant); } } $this->setFetchMode((int) $options[Zend_Db::FETCH_MODE]); } // obtain quoting property if there is one if (array_key_exists(Zend_Db::AUTO_QUOTE_IDENTIFIERS,$options)) { $this->_autoQuoteIdentifiers = (bool) $options[Zend_Db::AUTO_QUOTE_IDENTIFIERS]; } // obtain allow serialization property if there is one if (array_key_exists(Zend_Db::ALLOW_SERIALIZATION,$options)) { $this->_allowSerialization = (bool) $options[Zend_Db::ALLOW_SERIALIZATION]; } // obtain auto reconnect on unserialize property if there is one if (array_key_exists(Zend_Db::AUTO_RECONNECT_ON_UNSERIALIZE,$options)) { $this->_autoReconnectOnUnserialize = (bool) $options[Zend_Db::AUTO_RECONNECT_ON_UNSERIALIZE]; } // create a profiler object $profiler = false; if (array_key_exists(Zend_Db::PROFILER,$this->_config)) { $profiler = $this->_config[Zend_Db::PROFILER]; unset($this->_config[Zend_Db::PROFILER]); } $this->setProfiler($profiler); } /** * Check for config options that are mandatory. * Throw exceptions if any are missing. * * @param array $config * @throws Zend_Db_Adapter_Exception */ protected function _checkRequiredOptions(array $config) { // we need at least a dbname if (! array_key_exists('dbname',$config)) { /** @see Zend_Db_Adapter_Exception */ require_once 'Zend/Db/Adapter/Exception.php'; throw new Zend_Db_Adapter_Exception("Configuration array must have a key for 'dbname' that names the database instance"); } if (! array_key_exists('password',$config)) { /** * @see Zend_Db_Adapter_Exception */ require_once 'Zend/Db/Adapter/Exception.php'; throw new Zend_Db_Adapter_Exception("Configuration array must have a key for 'password' for login credentials"); } if (! array_key_exists('username',$config)) { /** * @see Zend_Db_Adapter_Exception */ require_once 'Zend/Db/Adapter/Exception.php'; throw new Zend_Db_Adapter_Exception("Configuration array must have a key for 'username' for login credentials"); } } /** * Returns the underlying database connection object or resource. * If not presently connected,this initiates the connection. * * @return object|resource|null */ public function getConnection() { $this->_connect(); return $this->_connection; } /** * Returns the configuration variables in this adapter. * * @return array */ public function getConfig() { return $this->_config; } /** * Set the adapter's profiler object. * * The argument may be a boolean,an associative array,an instance of * Zend_Db_Profiler,or an instance of Zend_Config. * * A boolean argument sets the profiler to enabled if true,or disabled if * false. The profiler class is the adapter's default profiler class,* Zend_Db_Profiler. * * An instance of Zend_Db_Profiler sets the adapter's instance to that * object. The profiler is enabled and disabled separately. * * An associative array argument may contain any of the keys 'enabled',* 'class',and 'instance'. The 'enabled' and 'instance' keys correspond to the * boolean and object types documented above. The 'class' key is used to name a * class to use for a custom profiler. The class must be Zend_Db_Profiler or a * subclass. The class is instantiated with no constructor arguments. The 'class' * option is ignored when the 'instance' option is supplied. * * An object of type Zend_Config may contain the properties 'enabled','class',and * 'instance',just as if an associative array had been passed instead. * * @param Zend_Db_Profiler|Zend_Config|array|boolean $profiler * @return Zend_Db_Adapter_Abstract Provides a fluent interface * @throws Zend_Db_Profiler_Exception if the object instance or class specified * is not Zend_Db_Profiler or an extension of that class. */ public function setProfiler($profiler) { $enabled = null; $profilerClass = $this->_defaultProfilerClass; $profilerInstance = null; if ($profilerIsObject = is_object($profiler)) { if ($profiler instanceof Zend_Db_Profiler) { $profilerInstance = $profiler; } else if ($profiler instanceof Zend_Config) { $profiler = $profiler->toArray(); } else { /** * @see Zend_Db_Profiler_Exception */ require_once 'Zend/Db/Profiler/Exception.php'; throw new Zend_Db_Profiler_Exception('Profiler argument must be an instance of either Zend_Db_Profiler' . ' or Zend_Config when provided as an object'); } } if (is_array($profiler)) { if (isset($profiler['enabled'])) { $enabled = (bool) $profiler['enabled']; } if (isset($profiler['class'])) { $profilerClass = $profiler['class']; } if (isset($profiler['instance'])) { $profilerInstance = $profiler['instance']; } } else if (!$profilerIsObject) { $enabled = (bool) $profiler; } if ($profilerInstance === null) { if (!class_exists($profilerClass)) { require_once 'Zend/Loader.php'; Zend_Loader::loadClass($profilerClass); } $profilerInstance = new $profilerClass(); } if (!$profilerInstance instanceof Zend_Db_Profiler) { /** @see Zend_Db_Profiler_Exception */ require_once 'Zend/Db/Profiler/Exception.php'; throw new Zend_Db_Profiler_Exception('Class ' . get_class($profilerInstance) . ' does not extend ' . 'Zend_Db_Profiler'); } if (null !== $enabled) { $profilerInstance->setEnabled($enabled); } $this->_profiler = $profilerInstance; return $this; } /** * Returns the profiler for this adapter. * * @return Zend_Db_Profiler */ public function getProfiler() { return $this->_profiler; } /** * Get the default statement class. * * @return string */ public function getStatementClass() { return $this->_defaultStmtClass; } /** * Set the default statement class. * * @return Zend_Db_Adapter_Abstract Fluent interface */ public function setStatementClass($class) { $this->_defaultStmtClass = $class; return $this; } /** * Prepares and executes an SQL statement with bound data. * * @param mixed $sql The SQL statement with placeholders. * May be a string or Zend_Db_Select. * @param mixed $bind An array of data to bind to the placeholders. * @return Zend_Db_Statement_Interface */ public function query($sql,$bind = array()) { // connect to the database if needed $this->_connect(); // is the $sql a Zend_Db_Select object? if ($sql instanceof Zend_Db_Select) { if (empty($bind)) { $bind = $sql->getBind(); } $sql = $sql->assemble(); } // make sure $bind to an array; // don't use (array) typecasting because // because $bind may be a Zend_Db_Expr object if (!is_array($bind)) { $bind = array($bind); } // prepare and execute the statement with profiling $stmt = $this->prepare($sql); $stmt->execute($bind); // return the results embedded in the prepared statement object $stmt->setFetchMode($this->_fetchMode); return $stmt; } /** * Leave autocommit mode and begin a transaction. * * @return Zend_Db_Adapter_Abstract */ public function beginTransaction() { $this->_connect(); $q = $this->_profiler->queryStart('begin',Zend_Db_Profiler::TRANSACTION); $this->_beginTransaction(); $this->_profiler->queryEnd($q); return $this; } /** * Commit a transaction and return to autocommit mode. * * @return Zend_Db_Adapter_Abstract */ public function commit() { $this->_connect(); $q = $this->_profiler->queryStart('commit',Zend_Db_Profiler::TRANSACTION); $this->_commit(); $this->_profiler->queryEnd($q); return $this; } /** * Roll back a transaction and return to autocommit mode. * * @return Zend_Db_Adapter_Abstract */ public function rollBack() { $this->_connect(); $q = $this->_profiler->queryStart('rollback',Zend_Db_Profiler::TRANSACTION); $this->_rollBack(); $this->_profiler->queryEnd($q); return $this; } /** * Inserts a table row with specified data. * * @param mixed $table The table to insert data into. * @param array $bind Column-value pairs. * @return int The number of affected rows. * @throws Zend_Db_Adapter_Exception */ public function insert($table,array $bind) { // extract and quote col names from the array keys $cols = array(); $vals = array(); $i = 0; foreach ($bind as $col => $val) { $cols[] = $this->quoteIdentifier($col,true); if ($val instanceof Zend_Db_Expr) { $vals[] = $val->__toString(); unset($bind[$col]); } else { if ($this->supportsParameters('positional')) { $vals[] = '?'; } else { if ($this->supportsParameters('named')) { unset($bind[$col]); $bind[':col'.$i] = $val; $vals[] = ':col'.$i; $i++; } else { /** @see Zend_Db_Adapter_Exception */ require_once 'Zend/Db/Adapter/Exception.php'; throw new Zend_Db_Adapter_Exception(get_class($this) ." doesn't support positional or named binding"); } } } } // build the statement $sql = "INSERT INTO " . $this->quoteIdentifier($table,true) . ' (' . implode(',',$cols) . ') ' . 'VALUES (' . implode(',$vals) . ')'; // execute the statement and return the number of affected rows if ($this->supportsParameters('positional')) { $bind = array_values($bind); } $stmt = $this->query($sql,$bind); $result = $stmt->rowCount(); return $result; } /** * Updates table rows with specified data based on a WHERE clause. * * @param mixed $table The table to update. * @param array $bind Column-value pairs. * @param mixed $where UPDATE WHERE clause(s). * @return int The number of affected rows. * @throws Zend_Db_Adapter_Exception */ public function update($table,array $bind,$where = '') { /** * Build "col = ?" pairs for the statement,* except for Zend_Db_Expr which is treated literally. */ $set = array(); $i = 0; foreach ($bind as $col => $val) { if ($val instanceof Zend_Db_Expr) { $val = $val->__toString(); unset($bind[$col]); } else { if ($this->supportsParameters('positional')) { $val = '?'; } else { if ($this->supportsParameters('named')) { unset($bind[$col]); $bind[':col'.$i] = $val; $val = ':col'.$i; $i++; } else { /** @see Zend_Db_Adapter_Exception */ require_once 'Zend/Db/Adapter/Exception.php'; throw new Zend_Db_Adapter_Exception(get_class($this) ." doesn't support positional or named binding"); } } } $set[] = $this->quoteIdentifier($col,true) . ' = ' . $val; } $where = $this->_whereExpr($where); /** * Build the UPDATE statement */ $sql = "UPDATE " . $this->quoteIdentifier($table,true) . ' SET ' . implode(',$set) . (($where) ? " WHERE $where" : ''); /** * Execute the statement and return the number of affected rows */ if ($this->supportsParameters('positional')) { $stmt = $this->query($sql,array_values($bind)); } else { $stmt = $this->query($sql,$bind); } $result = $stmt->rowCount(); return $result; } /** * Deletes table rows based on a WHERE clause. * * @param mixed $table The table to update. * @param mixed $where DELETE WHERE clause(s). * @return int The number of affected rows. */ public function delete($table,$where = '') { $where = $this->_whereExpr($where); /** * Build the DELETE statement */ $sql = "DELETE FROM " . $this->quoteIdentifier($table,true) . (($where) ? " WHERE $where" : ''); /** * Execute the statement and return the number of affected rows */ $stmt = $this->query($sql); $result = $stmt->rowCount(); return $result; } /** * Convert an array,string,or Zend_Db_Expr object * into a string to put in a WHERE clause. * * @param mixed $where * @return string */ protected function _whereExpr($where) { if (empty($where)) { return $where; } if (!is_array($where)) { $where = array($where); } foreach ($where as $cond => &$term) { // is $cond an int? (i.e. Not a condition) if (is_int($cond)) { // $term is the full condition if ($term instanceof Zend_Db_Expr) { $term = $term->__toString(); } } else { // $cond is the condition with placeholder,// and $term is quoted into the condition $term = $this->quoteInto($cond,$term); } $term = '(' . $term . ')'; } $where = implode(' AND ',$where); return $where; } /** * Creates and returns a new Zend_Db_Select object for this adapter. * * @return Zend_Db_Select */ public function select() { return new Zend_Db_Select($this); } /** * Get the fetch mode. * * @return int */ public function getFetchMode() { return $this->_fetchMode; } /** * Fetches all SQL result rows as a sequential array. * Uses the current fetchMode for the adapter. * * @param string|Zend_Db_Select $sql An SQL SELECT statement. * @param mixed $bind Data to bind into SELECT placeholders. * @param mixed $fetchMode Override current fetch mode. * @return array */ public function fetchAll($sql,$bind = array(),$fetchMode = null) { if ($fetchMode === null) { $fetchMode = $this->_fetchMode; } $stmt = $this->query($sql,$bind); $result = $stmt->fetchAll($fetchMode); return $result; } /** * Fetches the first row of the SQL result. * Uses the current fetchMode for the adapter. * * @param string|Zend_Db_Select $sql An SQL SELECT statement. * @param mixed $bind Data to bind into SELECT placeholders. * @param mixed $fetchMode Override current fetch mode. * @return mixed Array,object,or scalar depending on fetch mode. */ public function fetchRow($sql,$bind); $result = $stmt->fetch($fetchMode); return $result; } /** * Fetches all SQL result rows as an associative array. * * The first column is the key,the entire row array is the * value. You should construct the query to be sure that * the first column contains unique values,or else * rows with duplicate values in the first column will * overwrite previous data. * * @param string|Zend_Db_Select $sql An SQL SELECT statement. * @param mixed $bind Data to bind into SELECT placeholders. * @return array */ public function fetchAssoc($sql,$bind = array()) { $stmt = $this->query($sql,$bind); $data = array(); while ($row = $stmt->fetch(Zend_Db::FETCH_ASSOC)) { $tmp = array_values(array_slice($row,1)); $data[$tmp[0]] = $row; } return $data; } /** * Fetches the first column of all SQL result rows as an array. * * @param string|Zend_Db_Select $sql An SQL SELECT statement. * @param mixed $bind Data to bind into SELECT placeholders. * @return array */ public function fetchCol($sql,$bind); $result = $stmt->fetchAll(Zend_Db::FETCH_COLUMN,0); return $result; } /** * Fetches all SQL result rows as an array of key-value pairs. * * The first column is the key,the second column is the * value. * * @param string|Zend_Db_Select $sql An SQL SELECT statement. * @param mixed $bind Data to bind into SELECT placeholders. * @return array */ public function fetchPairs($sql,$bind); $data = array(); while ($row = $stmt->fetch(Zend_Db::FETCH_NUM)) { $data[$row[0]] = $row[1]; } return $data; } /** * Fetches the first column of the first row of the SQL result. * * @param string|Zend_Db_Select $sql An SQL SELECT statement. * @param mixed $bind Data to bind into SELECT placeholders. * @return string */ public function fetchOne($sql,$bind); $result = $stmt->fetchColumn(0); return $result; } /** * Quote a raw string. * * @param string $value Raw string * @return string Quoted string */ protected function _quote($value) { if (is_int($value)) { return $value; } elseif (is_float($value)) { return sprintf('%F',$value); } return "'" . addcslashes($value,"\000\n\r\\'\"\032") . "'"; } /** * Safely quotes a value for an SQL statement. * * If an array is passed as the value,the array values are quoted * and then returned as a comma-separated string. * * @param mixed $value The value to quote. * @param mixed $type OPTIONAL the SQL datatype name,or constant,or null. * @return mixed An SQL-safe quoted value (or string of separated values). */ public function quote($value,$type = null) { $this->_connect(); if ($value instanceof Zend_Db_Select) { return '(' . $value->assemble() . ')'; } if ($value instanceof Zend_Db_Expr) { return $value->__toString(); } if (is_array($value)) { foreach ($value as &$val) { $val = $this->quote($val,$type); } return implode(',$value); } if ($type !== null && array_key_exists($type = strtoupper($type),$this->_numericDataTypes)) { $quotedValue = '0'; switch ($this->_numericDataTypes[$type]) { case Zend_Db::INT_TYPE: // 32-bit integer $quotedValue = (string) intval($value); break; case Zend_Db::BIGINT_TYPE: // 64-bit integer // ANSI SQL-style hex literals (e.g. x'[\dA-F]+') // are not supported here,because these are string // literals,not numeric literals. if (preg_match('/^( [+-]? # optional sign (?: 0[Xx][\da-fA-F]+ # ODBC-style hexadecimal |\d+ # decimal or octal,or MySQL ZEROFILL decimal (?:[eE][+-]?\d+)? # optional exponent on decimals or octals ) )/x',(string) $value,$matches)) { $quotedValue = $matches[1]; } break; case Zend_Db::FLOAT_TYPE: // float or decimal $quotedValue = sprintf('%F',$value); } return $quotedValue; } return $this->_quote($value); } /** * Quotes a value and places into a piece of text at a placeholder. * * The placeholder is a question-mark; all placeholders will be replaced * with the quoted value. For example: * * * $text = "WHERE date < ?"; * $date = "2005-01-02"; * $safe = $sql->quoteInto($text,$date); * // $safe = "WHERE date < '2005-01-02'" * * * @param string $text The text with a placeholder. * @param mixed $value The value to quote. * @param string $type OPTIONAL SQL datatype * @param integer $count OPTIONAL count of placeholders to replace * @return string An SQL-safe quoted value placed into the original text. */ public function quoteInto($text,$value,$type = null,$count = null) { if ($count === null) { return str_replace('?',$this->quote($value,$type),$text); } else { while ($count > 0) { if (strpos($text,'?') !== false) { $text = substr_replace($text,strpos($text,'?'),1); } --$count; } return $text; } } /** * Quotes an identifier. * * Accepts a string representing a qualified indentifier. For Example: * * $adapter->quoteIdentifier('myschema.mytable') * * Returns: "myschema"."mytable" * * Or,an array of one or more identifiers that may form a qualified identifier: * * $adapter->quoteIdentifier(array('myschema','my.table')) * * Returns: "myschema"."my.table" * * The actual quote character surrounding the identifiers may vary depending on * the adapter. * * @param string|array|Zend_Db_Expr $ident The identifier. * @param boolean $auto If true,heed the AUTO_QUOTE_IDENTIFIERS config option. * @return string The quoted identifier. */ public function quoteIdentifier($ident,$auto=false) { return $this->_quoteIdentifierAs($ident,$auto); } /** * Quote a column identifier and alias. * * @param string|array|Zend_Db_Expr $ident The identifier or expression. * @param string $alias An alias for the column. * @param boolean $auto If true,heed the AUTO_QUOTE_IDENTIFIERS config option. * @return string The quoted identifier and alias. */ public function quoteColumnAs($ident,$alias,$auto); } /** * Quote a table identifier and alias. * * @param string|array|Zend_Db_Expr $ident The identifier or expression. * @param string $alias An alias for the table. * @param boolean $auto If true,heed the AUTO_QUOTE_IDENTIFIERS config option. * @return string The quoted identifier and alias. */ public function quoteTableAs($ident,$alias = null,$auto = false) { return $this->_quoteIdentifierAs($ident,$auto); } /** * Quote an identifier and an optional alias. * * @param string|array|Zend_Db_Expr $ident The identifier or expression. * @param string $alias An optional alias. * @param boolean $auto If true,heed the AUTO_QUOTE_IDENTIFIERS config option. * @param string $as The string to add between the identifier/expression and the alias. * @return string The quoted identifier and alias. */ protected function _quoteIdentifierAs($ident,$auto = false,$as = ' AS ') { if ($ident instanceof Zend_Db_Expr) { $quoted = $ident->__toString(); } elseif ($ident instanceof Zend_Db_Select) { $quoted = '(' . $ident->assemble() . ')'; } else { if (is_string($ident)) { $ident = explode('.',$ident); } if (is_array($ident)) { $segments = array(); foreach ($ident as $segment) { if ($segment instanceof Zend_Db_Expr) { $segments[] = $segment->__toString(); } else { $segments[] = $this->_quoteIdentifier($segment,$auto); } } if ($alias !== null && end($ident) == $alias) { $alias = null; } $quoted = implode('.',$segments); } else { $quoted = $this->_quoteIdentifier($ident,$auto); } } if ($alias !== null) { $quoted .= $as . $this->_quoteIdentifier($alias,$auto); } return $quoted; } /** * Quote an identifier. * * @param string $value The identifier or expression. * @param boolean $auto If true,heed the AUTO_QUOTE_IDENTIFIERS config option. * @return string The quoted identifier and alias. */ protected function _quoteIdentifier($value,$auto=false) { if ($auto === false || $this->_autoQuoteIdentifiers === true) { $q = $this->getQuoteIdentifierSymbol(); return ($q . str_replace("$q","$q$q",$value) . $q); } return $value; } /** * Returns the symbol the adapter uses for delimited identifiers. * * @return string */ public function getQuoteIdentifierSymbol() { return '"'; } /** * Return the most recent value from the specified sequence in the database. * This is supported only on RDBMS brands that support sequences * (e.g. Oracle,DB2). Other RDBMS brands return null. * * @param string $sequenceName * @return string */ public function lastSequenceId($sequenceName) { return null; } /** * Generate a new value from the specified sequence in the database,and return it. * This is supported only on RDBMS brands that support sequences * (e.g. Oracle,DB2). Other RDBMS brands return null. * * @param string $sequenceName * @return string */ public function nextSequenceId($sequenceName) { return null; } /** * Helper method to change the case of the strings used * when returning result sets in FETCH_ASSOC and FETCH_BOTH * modes. * * This is not intended to be used by application code,* but the method must be public so the Statement class * can invoke it. * * @param string $key * @return string */ public function foldCase($key) { switch ($this->_caseFolding) { case Zend_Db::CASE_LOWER: $value = strtolower((string) $key); break; case Zend_Db::CASE_UPPER: $value = strtoupper((string) $key); break; case Zend_Db::CASE_NATURAL: default: $value = (string) $key; } return $value; } /** * called when object is getting serialized * This disconnects the DB object that cant be serialized * * @throws Zend_Db_Adapter_Exception * @return array */ public function __sleep() { if ($this->_allowSerialization == false) { /** @see Zend_Db_Adapter_Exception */ require_once 'Zend/Db/Adapter/Exception.php'; throw new Zend_Db_Adapter_Exception(get_class($this) ." is not allowed to be serialized"); } $this->_connection = false; return array_keys(array_diff_key(get_object_vars($this),array('_connection'=>false))); } /** * called when object is getting unserialized * * @return void */ public function __wakeup() { if ($this->_autoReconnectOnUnserialize == true) { $this->getConnection(); } } /** * Abstract Methods */ /** * Returns a list of the tables in the database. * * @return array */ abstract public function listTables(); /** * Returns the column descriptions for a table. * * The return value is an associative array keyed by the column name,* as returned by the RDBMS. * * The value of each array element is an associative array * with the following keys: * * SCHEMA_NAME => string; name of database or schema * TABLE_NAME => string; * COLUMN_NAME => string; column name * COLUMN_POSITION => number; ordinal position of column in table * DATA_TYPE => string; SQL datatype name of column * DEFAULT => string; default expression of column,null if none * NULLABLE => boolean; true if column can have nulls * LENGTH => number; length of CHAR/VARCHAR * SCALE => number; scale of NUMERIC/DECIMAL * PRECISION => number; precision of NUMERIC/DECIMAL * UNSIGNED => boolean; unsigned property of an integer type * PRIMARY => boolean; true if column is part of the primary key * PRIMARY_POSITION => integer; position of column in primary key * * @param string $tableName * @param string $schemaName OPTIONAL * @return array */ abstract public function describeTable($tableName,$schemaName = null); /** * Creates a connection to the database. * * @return void */ abstract protected function _connect(); /** * Test if a connection is active * * @return boolean */ abstract public function isConnected(); /** * Force the connection to close. * * @return void */ abstract public function closeConnection(); /** * Prepare a statement and return a PDOStatement-like object. * * @param string|Zend_Db_Select $sql SQL query * @return Zend_Db_Statement|PDOStatement */ abstract public function prepare($sql); /** * Gets the last ID generated automatically by an IDENTITY/AUTOINCREMENT column. * * As a convention,and the table name * argument is disregarded. * * @param string $tableName OPTIONAL Name of table. * @param string $primaryKey OPTIONAL Name of primary key column. * @return string */ abstract public function lastInsertId($tableName = null,$primaryKey = null); /** * Begin a transaction. */ abstract protected function _beginTransaction(); /** * Commit a transaction. */ abstract protected function _commit(); /** * Roll-back a transaction. */ abstract protected function _rollBack(); /** * Set the fetch mode. * * @param integer $mode * @return void * @throws Zend_Db_Adapter_Exception */ abstract public function setFetchMode($mode); /** * Adds an adapter-specific LIMIT clause to the SELECT statement. * * @param mixed $sql * @param integer $count * @param integer $offset * @return string */ abstract public function limit($sql,$offset = 0); /** * Check if the adapter supports real SQL parameters. * * @param string $type 'positional' or 'named' * @return bool */ abstract public function supportsParameters($type); /** * Retrieve server version in PHP style * * @return string */ abstract public function getServerVersion(); }

到此,我已经晕了。你呢???

哈哈哈。。。

下面看一些简单的案例

插入数据到数据库:

'127.0.0.1',$params); $row = array( 'username'=>'Jiqing','password'=>'jiqing90061234' ); $table = 'user'; $res = $db->insert($table,$row); if($res){ echo "成功插入新的记录!"; echo "

"; $last_insert_id = $db->lastInsertId($table); echo "新记录的ID值为:"; echo $last_insert_id; echo "

"; echo "其内容为:"; $sql = "select * from $table where id=$last_insert_id"; $result = $db->fetchRow($sql); echo "

"; foreach($result as $key=>$val){ echo $key; echo "值为:"; echo $val; echo "

"; } }else{ echo "插入数据有误"; }

结果为:

修改update方法

删除delete方法

都大同小异,首先连接数据库,然后填写相应参数,执行即可。

查询方法总结:

常用的是第一个和最后一个方法,其他的方法用的不是很多。

更多关于zend相关内容感兴趣的读者可查看本站专题:《》、《》、《》、《》、《》、《》及《

希望本文所述对大家基于Zend Framework框架的PHP程序设计有所帮助。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


文章浏览阅读8.4k次,点赞8次,收藏7次。SourceCodester Online Tours & Travels Management System pay.php sql injectionLine 16 of pay.php invokes a SQL query built using unvalidated input. This call could allow an attacker to modify the statement’s meaning or to execute arbitrary SQL commands.SQL
文章浏览阅读3.4k次,点赞46次,收藏51次。本文为大家介绍在windwos系统搭建typecho博客+cpolar内网穿透工具将博客发布到公共网络环境,实现远程也可以访问和操作。_windows搭建typecho
文章浏览阅读1.1k次。- php是最优秀, 最原生的模板语言, 替代语法,让php更加的优雅的与html生活在一起 -->请放心, 最终生成的,或者说用户最终看到的,仍然是一个html文档, php代码中的内容不会被泄漏的。-- 将php与html代码混编的时候,大括号很容易造成配对错误,最好杜绝它 -->php标签内部代码由php.exe解释, php标签之外的代码原样输出,仍由web服务器解析。-- 所以php的流程控制语句, 都提供了替代语法,用冒号代替大括号 -->php echo '百变鹏仔'?_利用php将静态页面修改为动态页面
文章浏览阅读1.1k次,点赞18次,收藏15次。整理K8s网络相关笔记博文内容涉及 Linux network namespace 认知以及彼此通信Demo,实际中的应用理解不足小伙伴帮忙指正不必太纠结于当下,也不必太忧虑未来,当你经历过一些事情的时候,眼前的风景已经和从前不一样了。——村上春树。_linux network namespace 多端通信 模式认知
文章浏览阅读1.2k次,点赞22次,收藏19次。此网络模型提供了一个逻辑二层(L2)网络,该网络封装在跨 Kubernetes 集群节点的现有三层(L3)网络拓扑上。使用此模型,可以为容器提供一个隔离的 L2 网络,而无需分发路由。封装网络带来了少量的处理开销以及由于覆盖封装生成 IP header 造成的 IP 包大小增加。封装信息由 Kubernetes worker 之间的 UDP 端口分发,交换如何访问 MAC 地址的网络控制平面信息。此类网络模型中常用的封装是 VXLAN、Internet 协议安全性 (IPSec) 和 IP-in-IP。_k8s网络组件对比
文章浏览阅读1.1k次,点赞14次,收藏19次。当我们谈论网络安全时,我们正在讨论的是保护我们的在线空间,这是我们所有人的共享责任。网络安全涉及保护我们的信息,防止被未经授权的人访问、披露、破坏或修改。
文章浏览阅读1.3w次,点赞3次,收藏7次。尽管您可以通过 ping 命令解析出网站的 IP 地址,但是可能在浏览器中访问时仍然遇到问题,这可能是因为浏览器使用的 DNS 解析结果不同于 ping 命令使用的解析结果。可能是因为您的网络或设备上设置了防火墙,阻止了对特定网站的访问。有些国家或组织可能会对特定的域名进行屏蔽,从而阻止访问相关网站。如果您的网络使用代理服务器进行访问控制,可能会由于代理服务器的配置问题导致无法访问某些网站。即使您的网络和设备一切正常,目标网站本身可能也存在问题,例如服务器故障、维护或过载,导致无法访问。_能ping通打不开网页
文章浏览阅读839次,点赞22次,收藏19次。本系统带文档lw万字以上文末可领取本课题的JAVA源码参考。
文章浏览阅读2.1k次,点赞31次,收藏22次。基于微信小程序奶茶点餐外卖系统设计与实现(PHP后台+Mysql)可行性分析毕设源代码毕业设计,数据安全和系统稳定性以及团队能力和资源配备方面都具备较好的条件。因此,该项目的可行性较高。:黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,CSDN博客专家,在线教育专家,CSDN钻石讲师;微信小程序作为一种快捷、方便的移动应用形式,成为很多用户点餐外卖的首选。项目的界面和功能都可以定制,包安装运行!项目配有对应开发文档、开题报告、任务书、PPT、论文模版等。
文章浏览阅读1.8k次,点赞52次,收藏38次。本文主要通过对系统的前台系统和后台管理系统进行了功能性需求分析,对系统的安全性和可扩展性进行了非功能性需求分析。在详细的需求分析的基础上,根据系统的功能设计确定了数据库结构,实现完整的代码编写。Lucky+Baby母婴用品网站使用 Dreamweaver、HBuilder代码编辑器、Apache服务器等开发工具,完成了系统的主要模块的页面设计和功能实现。本文展示了首页页面的实现效果图,并通过代码和页面介绍了用户注册功能、商品搜索功能、生成订单和查看我的订单功能、在线付款功能功能的实现过程。
文章浏览阅读1.5k次,点赞45次,收藏40次。本设计主要实现集人性化、高效率、便捷等优点于一身的人事信息管理系统,完成首页、系统用户、通知公告、部门信息、员工薪资、考勤签到、员工请假、招聘信息、应聘信息等功能模块。
文章浏览阅读1k次。该错误通常出现在数据库读取结果集数据时,比如当我们写好SQL语句从数据库读取数据时,本身应该返回结果集,再给结果集中读取数据。解决思路:这种错误一般是因为echo后面输出了一个数组导致的,或者是数组作为字符串进行拼接运算时导致的。该错误直译为:警告:mysqli_fetch_assoc函数期望参数1是mysqli的结果集,但是给了一个布尔值。这种错误是PHP解析器在解析时遇到了语法错误,直译为:解析错误:语法错误,意料之外的...该错误直译为:提示:未定义的索引:username。_array to string conversion in
文章浏览阅读2.7w次。解决http请求报错context deadline exceeded (Client.Timeout exceeded while awaiting headers)_context deadline exceeded (client.timeout exceeded while awaiting headers)
文章浏览阅读1.3k次,点赞26次,收藏24次。复杂网络是一种由大量相互连接的元素(节点或顶点)组成的网络结构,这些连接通常是非常复杂和动态的。这些网络可以在各种领域中发现,包括社交网络、生物学系统、信息技术和交通系统等。_代理建模
文章浏览阅读2.6k次,点赞76次,收藏71次。epoll详解,事件模型,ET/LT模式,并通过三个示例进行代码实现。
文章浏览阅读3.3k次。罗拉ROLA-IP是一家来自纽约的代理IP提供商,由李嘉诚先生投资建设,韩国人工智能、自动驾驶、虚拟现实方面的领军企业World IT Show投资入股,由美国纽约大学IT管理教授团队研究开发,进入中国市场6年多,全世界设有多个分子公司。接下来,我们要检查代理和防火墙的设置,因为在绝大多数情况下,它们是导致这个错误的原因,尤其是当用户使用免费代理时。对网站的访问受阻实际上是一个非常常见的错误,它既可能是由于物理原因(硬件问题)造成的,也可能是由于软件错误引起的。检查代理设置,并确保其正确配置。_无法访问此网站,检查代理服务器和防火墙
文章浏览阅读1.1k次,点赞14次,收藏20次。本系统带文档lw万字以上文末可领取本课题的JAVA源码参考。_php洗车服务预约管理系统php源码
文章浏览阅读1.1k次。桶排序是计数排序的升级版。它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定。同时,对于桶中元素的排序,选择何种比较排序算法对于性能的影响至关重要。
文章浏览阅读936次,点赞22次,收藏17次。本系统带文档lw万字以上文末可领取本课题的JAVA源码参考。
文章浏览阅读822次,点赞15次,收藏14次。在整个设计过程中,要确定可能的具体解决方案,以实现每一个小的最终目标,对于每一个小目标,我们首先必须了解一些相关的需求分析信息。除了以上作品下面是2023-2024年最新100套计算机专业原创的毕业设计源码+数据库,是近期作品,如果你的题目刚好在下面可以文末领取java源码参考。springboot基于springboot的在线考试系统。springboot基于springboot的商城购物系统。springboot基于微信小程序的智慧校园设计与实现。springboot基于用户的协同过滤算法的话题推荐。