Всем приветик. Я вот набросал для себя класс для работы с MySQL-базой через MySQLi-расширение: PHP: <?php class db { private $conn; private $error=''; private $host; private $user; private $pass; private $db; private $query=''; private $count=0; public static function check($var) { if((is_object($var)) && (get_class($var)==='db')) { return true; } else { return false; } } public function __construct() { if(func_num_args()) { $array=array('', '', '', '', 0); for($i=0; $i<count(func_get_args()); $i++) { $array[$i]=func_get_arg($i); } $this->host=$array[0]; $this->user=$array[1]; $this->pass=$array[2]; $this->db=$array[3]; $c=(int)$array[4]; if($c===1) { $this->connect(); } } } public function checkConn() { return $this->conn; } public function getLastError() { if(isset($this->error)) { return $this->error; } else { return false; } } public function connect() { if($this->conn) { mysqli_close($this->conn); } unset($this->conn); unset($this->error); $this->conn=@mysqli_connect($this->host, $this->user, $this->pass, $this->db); return $this; } public function close() { if($this->conn) { mysqli_close($this->conn); } unset($this->conn); } public function execQuery() { if(func_num_args()===1) { $query=func_get_arg(0); } if(func_num_args()===0) { $query=$this->query; } if(!empty($query)) { $result=mysqli_query($this->conn, trim($query)); if(mysqli_errno($this->conn)) { $this->error=mysqli_error($this->conn); } $this->count++; return $result; } return false; } public function printQuery() { if(func_num_args()===1) { $query=func_get_arg(0); } if(func_num_args()===0) { $query=$this->query; } if(!empty($query)) { printf("<p>%s</p>", $query); } else { echo 'No query!'; } return $this; } public function select() { if(func_num_args()) { $this->query="SELECT "; foreach(func_get_args() as $arg) { $arg=mysqli_real_escape_string($this->conn, $arg); $this->query.='`'.$arg.'`, '; } $this->query[strlen($this->query)-2]=''; } return $this; } public function insertInto() { if(func_num_args()) { $this->query="INSERT INTO "; foreach(func_get_args() as $arg) { $arg=mysqli_real_escape_string($this->conn, $arg); $this->query.='`'.$arg.'`, '; } $this->query[strlen($this->query)-2]=''; } return $this; } public function values() { if(func_num_args()) { $this->query.="VALUES ("; foreach(func_get_args() as $arg) { $arg=mysqli_real_escape_string($this->conn, $arg); $this->query.="'".$arg."', "; } $this->query[strlen($this->query)-2]=''; $this->query[strlen($this->query)-1]=''; $this->query.=")"; } return $this; } public function fields() { if(func_num_args()) { $this->query.="("; foreach(func_get_args() as $arg) { $arg=mysqli_real_escape_string($this->conn, $arg); $this->query.="`".$arg."`, "; } $this->query[strlen($this->query)-2]=''; $this->query[strlen($this->query)-1]=''; $this->query.=") "; } return $this; } } ?> Теперь пытаюсь выполнить такой скрипт: PHP: <?php $file='allo mudak'; include("class/db.php"); $db=new db('servir', 'uzir', 'porol', 'baza', 1); $answer=$db ->insertInto('downloads') ->fields("ip", "time", "path") ->values($_SERVER['REMOTE_ADDR'], time(), $file) ->printQuery() ->execQuery(); echo $db->getLastError(); ?> А мне в ответ: INSERT INTO `downloads` (`ip`, `time`, `path`) VALUES ('192.168.137.100', '1318438947', 'allo mudak') You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1 Сама кверя, формируемая методами, вроде бы верная (во всяком случае проверил в Navicat - запрос выполняется). Структура таблицы: [sql]CREATE TABLE `downloads` ( `id` int(11) NOT NULL AUTO_INCREMENT, `ip` varchar(255) DEFAULT NULL, `time` bigint(20) DEFAULT NULL, `path` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=cp1251;[/sql] Где я ошибся? Почему через Навик запрос выполняется, а средствами PHP - нет? Если нужны какие-либо другие характеристики - напишу.
оказалось, у меня не убирались лишние пробелы, причем гугл хром эти пробелы не выводил. запустил через оперу - все увидел и пофиксил. ДОЛБАНЫЙ ХРОМ.
PHP: <?php public function fields() { if(func_num_args()) { $this->query.="("; foreach(func_get_args() as $arg) { $arg=mysqli_real_escape_string($this->conn, $arg); $this->query.="`".$arg."`, "; } $this->query[strlen($this->query)-2]=''; $this->query[strlen($this->query)-1]=''; $this->query.=") "; } return $this; } А почему бы не так? PHP: <?php public function fields() { $args = func_num_args(); if($args) { $this->query.="(`" . implode("`, `", $args) . "`)"; } return $this; }
tommyangelo кстати, да! спасибо большое про имплод даже что-то и не подумал. + не надо возиться с запятой в конце.
krow7 Я когда-то тож возился, пока не подсказали) А еще в классе смутило, что нельзя изменить порядок вызова методов. Имхо, правильнее будет сохранять значения во внутренние переменные, а запрос лепить непосредственно перед выполнением.
tommyangelo хм, как-то даже не задумывался над порядком. теперь интересно стало - перепишу еще раз спасибо за ценные советы.
krow7 У меня как раз недавно была ситуация - в зависимости от определенных условий запрос менялся. Т.е. в начале экшена сделал "основу" запроса - указал таблицу, набор извлекаемых полей, сортировку. А потом в зависимости от фильтров добавлял различные where и order Так что произвольный порядок бывает нужен.