这是我的php文件中的一个函数,用于满足我的android应用程序的请求。
function checkin($DB, $TechID, $ClientID, $SiteID){ $dbConnection = mysql_connect($DB['server'], $DB['loginName'], $DB['password']); if(!$dbConnection){ die('Error! ' . mysql_error()); } mysql_select_db($DB['database'], $dbConnection); $file2 = "C:/wamp/www/file2.txt"; $data2 = "ClientID:".$ClientID." TechID:".$TechID." SiteID:".$SiteID; file_put_contents($file2, $data2); $result1 = mysql_query("SELECT COUNT(*) FROM Log") or die('Error! ' . mysql_error()); $query = "SELECT `Type` FROM `Log` WHERE `TechID` = '".$TechID."' ORDER BY LogTime DESC LIMIT 1"; $file5 = "C:/wamp/www/file5.txt"; file_put_contents($file5, $query); $result2 = mysql_query($query) or die('Error! ' . mysql_error()); while($row1 = mysql_fetch_array($result1)){ $count = $row1['COUNT(*)']; $file3 = "C:/wamp/www/file3.txt"; $data3 = "ClientID:".$ClientID." TechID:".$TechID." SiteID:".$SiteID." Count:".$count; file_put_contents($file3, $data3); while($row2 = mysql_fetch_array($result2)){ $file4 = "C:/wamp/www/file4.txt"; $data3 = "ClientID:".$ClientID." TechID:".$TechID." SiteID:".$SiteID." Count:".$count; file_put_contents($file4, $data3); /*if($row2['Type']!="Checkin"){ $count = $count+1; $Time = date('Y/m/d H:i'); mysql_query("INSERT INTO Log (LogID, TechID, ClientID, SiteID, LogTime, Type) VALUES (".$count.", ".$TechID.", ".$ClientID.", ".$SiteID.", ".$Time.", Checkin)"); }else{ $query2 = "SELECT TechEmail FROM Tech WHERE TechID=".$TechID; $result3 = mysql_query($query2) or die('Error! ' . mysql_error()); $subject = "Please check out"; $message = "You have forgot to logout from the last site, please check out manually"; $from = "devadmin@uniserveit.com"; $header = "Form:".$from; while($row3 = mysql_fetch_array($result3)){ mail($row3['TechEmail'], $subject, $message, $header); } }*/ } } }
您会看到我已经隐藏了一些代码,因为我正在调试它,所以创建了一些文件只是为了查看代码的哪一部分无法执行。我发现程序无法进入应创建file4的区域。我已经发现问题可能出在$ query上,当它执行时,mysql将响应“未知表状态:TABLE_TYPE”,这是我无法理解的。
如上面的注释中所述,您应该分而治之,以使您的生活更轻松(尤其是当您在该大型函数中使用代码时编写代码)。确实很容易做到:
function file_put($number, $data) { $path = sprintf("C:/temp/wamp/www/file%d.txt", $number); file_put_contents($path, $data); }
例如,这只是替换许多重复的行,您只需要在其中放入一些(编号)文件即可。
但是您也可以使用更复杂的内容(例如数据库操作)来执行此操作。您可能希望将错误处理移到您的视线之外,并在需要时小心地连接到数据库,并以更灵活的方式来获取数据。可以通过将(已弃用的)mysql_*函数移至其自己的一两个类中来完成,以使它不被看到。这将使它的使用更加容易(我首先显示):
mysql_*
// Create your database object to use it later on: $config = array( 'server' => 'localhost', 'name' => 'root', 'password' => '', 'db' => 'test', ); $db = new MySql($config);
我称它为数据库类,MySql因为它代表了mysql连接,并且可以与旧的mysql扩展一起使用。您只需要将该数据库对象传递给问题中的函数即可。结合file_put功能,它看起来像这样:
MySql
file_put
function checkin(MySql $DB, $TechID, $ClientID, $SiteID) { $query = sprintf("SELECT `Type` FROM `Log` WHERE `TechID` = '%d' ORDER BY LogTime DESC LIMIT 1", $TechID); file_put(5, $query); $result1 = $DB->query("SELECT COUNT(*) FROM Log"); $result2 = $DB->query($query); foreach ($result1 as $row1) { list($count) = $row1; $data = "ClientID:$ClientID TechID:$TechID SiteID:$SiteID Count:$count" file_put(3, $data); foreach ($result2 as $row2) { file_put(4, $data); } } }
该checkin函数仍然接近大型(已经有12行代码),但是比您的第一个版本短得多,因为它委派了编写文件和访问数据库的工作。我希望这个示范有用。以下是完整的代码示例:
checkin
/** * MySql Exception */ class MySqlException extends RuntimeException { } /** * MySql Database Class */ class MySql { private $server; private $name; private $password; private $db; private $connection; public function __construct(array $config) { $this->server = $config['server']; $this->name = $config['name']; $this->password = $config['password']; $this->db = $config['db']; } private function connect($server, $name, $password) { $this->connection = mysql_connect($server, $name, $password); if (!$this->connection) { $this->error("Unable to connect to '%s' as user '%s'", $server, $name); } } private function select($db) { if (!mysql_select_db($db, $this->connection)) { $this->error("Unable to select database '%s'", $db); } } private function close() { $this->connection && mysql_close($this->connection); } private function connectSelect() { $this->connect($this->server, $this->name, $this->password); $this->select($this->db); } /** * @param $query * @return MySqlResult */ public function query($query) { $this->connection || $this->connectSelect(); $result = mysql_query($query, $this->connection); if (!$result) { $this->error("Unable to execute query '%s'", $query); } return new MySqlResult($result); } /** * @param string $format * @param ... * @throws MySqlException */ private function error($format) { $args = func_get_args(); array_shift($args); $format .= ': %s'; $args[] = $this->connection ? mysql_error($this->connection) : mysql_error(); throw new MySqlException(vsprintf($format, $args)); } public function __destruct() { $this->close(); } } /** * MySql Result Set - Array Based */ class MySqlResult implements Iterator, Countable { private $result; private $index = 0; private $current; public function __construct($result) { $this->result = $result; } public function fetch($result_type = MYSQL_BOTH) { $this->current = mysql_fetch_array($this->result, $result_type); return $this->current; } /** * Return the current element * @link http://php.net/manual/en/iterator.current.php * @return array */ public function current() { return $this->current; } public function next() { $this->current && $this->fetch(); } /** * Return the key of the current element * @link http://php.net/manual/en/iterator.key.php * @return mixed scalar on success, or null on failure. */ public function key() { return $this->current ? $this->index : null; } /** * Checks if current position is valid * @link http://php.net/manual/en/iterator.valid.php * @return boolean The return value will be casted to boolean and then evaluated. * Returns true on success or false on failure. */ public function valid() { return (bool)$this->current; } /** * Rewind the Iterator to the first element * @link http://php.net/manual/en/iterator.rewind.php * @return void Any returned value is ignored. */ public function rewind() { $this->fetch(); } /** * Count of rows. * * @link http://php.net/manual/en/countable.count.php * @return int The count of rows as an integer. */ public function count() { return mysql_num_rows($this->result); } } // Create your database object to use it later on: $config = array( 'server' => 'localhost', 'name' => 'root', 'password' => '', 'db' => 'test', ); $db = new MySql($config); function file_put($number, $data) { $path = sprintf("C:/temp/wamp/www/file%d.txt", $number); file_put_contents($path, $data); } function checkin(MySql $DB, $TechID, $ClientID, $SiteID) { $query = sprintf("SELECT `Type` FROM `Log` WHERE `TechID` = '%d' ORDER BY LogTime DESC LIMIT 1", $TechID); file_put(5, $query); $result1 = $DB->query("SELECT COUNT(*) FROM Log"); $result2 = $DB->query($query); foreach ($result1 as $row1) { list($count) = $row1; $data = "ClientID:$ClientID TechID:$TechID SiteID:$SiteID Count:$count"; file_put(3, $data); foreach ($result2 as $row2) { file_put(4, $data); } } } checkin($db, 1, 2, 3, 4);