Вот функция в моем 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); } }*/ } } }
вы можете видеть, что я скрыл некоторые коды, так как я отлаживаю его, я создаю несколько файлов, чтобы увидеть, какая часть кодов не может быть выполнена. Я обнаружил, что программа не может войти в область, где должен быть создан файл4. Я искал, вероятно, проблема возникает из запроса $, когда он выполняется, то mysql будет отвечать «неизвестный статус таблицы: TABLE_TYPE», который я не могу понять, почему.
Как написано выше, вы должны делиться и побеждать, чтобы облегчить вашу жизнь (особенно, когда вы пишете код, когда играете с ним в этой большой функции). Это работает так же просто, как:
function file_put($number, $data) { $path = sprintf("C:/temp/wamp/www/file%d.txt", $number); file_put_contents($path, $data); }
например, это просто замена многих повторяющихся строк, где вам просто нужен нумерованный файл, в который вы помещаете некоторую строку.
Но вы также можете сделать это с более сложными вещами, такими как операция с базой данных. Вероятно, вы захотите перенести обработку ошибок с вашего зрения, а также позаботиться о необходимости подключения к базе данных, когда это необходимо, и более гибкий способ получения данных. Это можно сделать, перемещая (мягко устаревшие) 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
это будет выглядеть так:
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 строк кода), но намного короче, чем ваша первая версия, потому что она делегирует работу для записи файлов и доступа к базе данных. Я надеюсь, что эта демонстрация будет полезна. Ниже приведен полный пример кода:
/** * 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);
Простой ответ:
mysql_query("INSERT INTO Log (LogID, TechID, ClientID, SiteID, LogTime, Type) VALUES (".$count.", ".$TechID.", ".$ClientID.", ".$SiteID.", ".$Time.", Checkin)");
удалите цитаты из $ vars. или одинарной кавычки. Также удалите точки. Подобно:
mysql_query("INSERT INTO Log (LogID, TechID, ClientID, SiteID, LogTime, Type) VALUES ('$count', '$TechID', '$ClientID', '$SiteID', '$Time', Checkin)");