Собственно вся проблема в том что не могу найти как это красиво сделать PHP: <?php function loadThis($where) { $this->salf_array = @$this->db->selectRow('SELECT * FROM ?# WHERE ?a', $this->table_names, $where); } ?> Если передать что то типа PHP: <?php loadThis(array('userid'=>'UserName')); ?> То все в порядке запрос получится следующий [sql] SELECT * FROM users WHERE `userid` = 'UserName' [/sql] Но если PHP: <?php loadThis(array('userid'=>'UserName', 'password'=>'scret_password')); ?> То получится не красиво [sql] SELECT * FROM users WHERE `userid` = 'UserName', `password` = 'scret_password' [/sql] Что совсем не устраивает ни сервер не меня.... А мне нужно чтобы была возможность передать и AND и OR и переменное количество условий????? Т.Е. стандартное решение с макроподстановкой (WHERE 1=1 {......}) не устраивает по причине "переменное количество условий" Помогите, может кто знает красивое решение???
[sql] SELECT * FROM users WHERE `userid` = 'UserName', `password` = 'scret_password' SELECT * FROM users WHERE `userid` = 'UserName' AND `password` = 'scret_password' [/sql] Обрати внимание на AND в запросе.
=) дык обрати внимание на мой вопрос: ты о чем? может я просто не в теме, ты расскажи. Просто я не понимаю твоего вопроса. Если тебе надо АНД поставить, дык ты поставь, в чем беда?
Беда в том что в DBSimple работа построена на плейсхолдерах (довольно таки удобно) и я не знаю и не нашел в доках как эти конструкции использовать чтобы давать DBSimple массив а она в него вместо запятых в нужном месте AND или OR ставила.
jov27384 блин, а кто тебя дернул на эту бдсимпл? чем mysqli не угодил? ладно, молчу. Личное дело каждого с чем... и в какую дырку.
=) Удобная она, да и время на "своё" не хочется тратить, а тут блин - засада на самом интересном месте хоть бери да сам пиши....
jov27384 открой файл с классом и найди где и как это делается, если нету допиши, если не можешь полностью сам составляй запрос
jov27384 удобная? о_О чем запись 'SELECT * FROM ?# WHERE ?a', $переменная_раз, $переменная_два проще чем "SELECT * FROM $переменная_раз WHERE $переменная_два"? =) кроме простоты получения геморроя упомянутого в первом сообщении? не, я все. я молчу.
PHP: <?php /** * Description of MyObject * * @author oleg */ class MyObject { //Массив с полями обьекта protected $salf_array; //Ссылка на обьект protected $db; //Условие по умолчанию protected $default_where; //Имя таблицы private $table_names; //Список полей защищенных от записи private $protected_fields; public function __construct(DbSimple_Generic_Database $db, $default_where) { $this->db = &$db; $this->default_where = $default_where; $this->protected_fields = array(); $this->table_names = array(); } public function __get($name) { if($name == "salf_array") return $this->salf_array; elseif(isset ($this->salf_array[$name])) return $this->salf_array[$name]; else return false; } public function __set($name, $value) { if(array_search($name, $this->protected_fields, true)) return false; elseif(isset ($this->salf_array[$name])) { $this->salf_array[$name] = $value; return true; } else return false; } protected function addProtectedField($field_name) { $this->protected_fields[] = $field_name; } protected function addTableName($table_name) { $this->table_names[] = $table_name; } protected function loadThis() { $this->salf_array = @$this->db->selectRow('SELECT * FROM ?# WHERE ?a', $this->table_names, $this->default_where); } protected function safeThis() { @$this->db->query('UPDATE ?# SET ?a WHERE ?a', $this->table_names, $this->getSaveSalfArray(), $this->default_where); } protected function newThis() { @$this->db->query('INSERT INTO ?#(?#) VALUES(?a)', $this->table_names, array_keys($this->salf_array), array_values($this->salf_array)); } protected function deleteThis() { @$this->db->query('DELETE FROM ?# WHERE ?a', $this->table_names, $this->default_where); } private function getSaveSalfArray() { $result = $this->salf_array; for($i = 0; $i<count($this->protected_fields); $i++){ unset ($result[$this->protected_fields[$i]]); } return $result; } } ?>
Люди, а может кому известно о классах/библиотеках чтобы запрос выполнялся в виде??? PHP: <? $db->query($array); ?> Тут у человека была похожая проблема
У меня есть вот такие методы: PHP: <?php public function getSelect($arr, $tab=null, $where=null, $numUnion=0){ if (is_array($arr)){ if (empty($tab) || !is_string($tab)) throw new FormatException("Не задана таблица для выбора","Неверный тип данных"); $fields=""; foreach($arr as $val){ $fields .=$this->escapeKeys($val).","; } $fields=trim($fields,","); $expr=$this->getWhere($where); $sql="select $fields from $tab ".$expr; //Создаем запрос } else{ $sql=trim($arr.""); } $this->checkQuery($sql, $numUnion); return $sql; } public function getWhere($where){ if (is_array($where)) return " where ".$this->getAssignmentString($where, " and"); if (is_int($where)) return " where id=".$where; if (!empty($where)) return " where ".$where; return''; } public function getAssignmentString($arr, $delim){ $rez=""; foreach($arr as $key=>$val){ $rez .= $this->escapeKeys($key)."=".$this->escapeString($val).$delim; } $rez=substr($rez,0,-strlen($delim)); return $rez; } public function escapeString($str){ if (is_array($str)){ foreach($str as $key=>$val){ $str[$key]=$this->escapeString($val); } return $str; } if (is_null($str)) return "NULL"; if (is_string($str)) return "'".$this->escape($str)."'"; return $str; } public function escapeKeys($key){ if ($key==="*") return "*"; return $this->LKS.$key.$this->RKS; }
Спасибо, интересно, но не решает вопрос о более сложном WHERE, т.е. более сложный придется писать и эскейпить. Сейчас сижу велосипед придумываю, зацените: PHP: <?php $query = array( 'type'=>'query', 'statement'=>'select', 'query'=>array( 'select_option'=>'', //[DISTINCT | DISTINCTROW | ALL] 'field_names'=>'*', // '*' | массив с именами полей | асоциативный массив для псемдонимов 'teble_names'=>'users', //или массив с именами таблиц 'where'=>array( array('user_id'=>586, 'first'), array('password'=>md5('суперсекретныйпароль'), 'operation'=>'and'), array('active'=>'true', 'operation'=>'and') ) ) ); print_r($query); $query = new SQLQuery($query); print $query->getSQLQuery(); ?>
Застрял на вопросе а как при помощи этого сделать что то вроде: [sql] SELECT * FROM `table` WHERE 1=1 AND (`int1`-`int2`)>225 [/sql]
Млин во я велосипедист..... Сейчас читаю код Doctrine и вижу что они написали то что я так долго выдумывал.... Вечно так, что ни придумаю, то уже кто то написал... ))))
jov27384 Я бы тебе посоветовал сразу начать изучать класс работы с БД PDO, т.к. если я не ошибаюсь он один из самых современных (если я не прав поправьте) и позволяет работать с разными БД, а не только с mysql. Написать свой класс конечно полезно для общего развития, но на практике лучше применять, что-то более проверенное. Под проверкой я подразумеваю то, что написано не только вами, а несколькими людьми и признано также несколькими, причем более опытными чем вы (это не про себя, а про тех кто создал и пользуется). По изучайте лучше PDO, придумать какое-нибудь расширение для него.
Друзья, прежде чем что либо сказать, пожалуйста, прочтите все что написано выше и постарайтесь вникнуть в суть вопроса. Спасибо.
А вот собственно та замудренная штука что я выдумывал... (только её у меня украли))) ) http://www.phpactiverecord.org/
PHP: <?php class Zapis { /** * Объект для работы с БД. * @var object */ protected $db; /** * Имя таблицы, из которой беруться записи. * @var string */ protected $table; /** * Имя поля с идентификатором. * @var string */ protected $idField; /** * Массив полей записи. Ключи - имена полей. * @var array */ protected $fields=array(); /** * Массив полей пустой записи. Ключи - имена полей. * @var array */ protected $emptyFields=array("id"=>-1); /** * Конструктор. * * @param string $table Имя таблицы, из которой беруться записи. * @param mixed $id Если задан этот параметр, то запись инициализируется соответствующей строчкой из таблицы. * Если это строка или число, то считается идентификатором записи. * Если это массив, то ключи - имена полей, значения - значения полей. * По сути $id передается в {@link Zapis::select()} * @param string $idField Имя поля идентификатора. * @param object $db Объект для работы с БД. */ public function __construct($table, $id=null, $idField='id', $db=null){ $this->db=$db ? $db : SQLDBFactory::getDB(); if (is_array($id)){ $dbId=$id; }elseif(!is_null($id)){ $dbId=$this->db->escapeString($id); } $this->table=$table; $this->idField=$idField; if(!is_null($id)){ $this->select($dbId); } } /** * Магическое получение значения поля. * * @param string $var Имя поля * @return mixed Значение поля */ public function __get($var){ $method="get".ucfirst($var); if (method_exists($this, $method)){ return $this->$method(); } return $this->fields[$var]; } /** * Магическая запись значения поля. * * @param string $var Имя поля * @param mixed $val Значение поля */ public function __set($var, $val){ $method="set".ucfirst($var); if (method_exists($this, $method)){ $this->$method($val); }else{ $this->fields[$var]=$val; } } /** * Подготовка с сериализации */ public function __sleep(){ return array("table", "idField", "fields", "emptyFields"); } /** * Восстановление соединения при десериализации. */ public function __wakeup(){ $this->db=SQLDBFactory::getDB(); } /** * Сбрасывает данные о полях записи. */ public function reset(){ $this->fields=array(); } /** * Выбор записи по идентификатору * * @param mixed $fields Если это строка или число, считается идентификатором записи. * Если это массив, то ключи - имена полей, значения - значения полей. */ public function select($fields){ if (is_null($fields) || is_object($fields)){ $this->fields=$this->emptyFields; return; } if (!is_array($fields)){ $dbFields=array($this->idField=>$fields); }else{ $dbFields=$fields; } $row=$this->db->getAssoc(array("*"), $this->table, $dbFields); $this->fields= $row ? $row : $this->emptyFields; } /** * Вставка записи в таблицу. * * Вставляет текущую запись в таблицу. * Затем выбирает ее в текущий объект. * Это нужно для заполнения значений по умолчанию и прочих значений, которые выставляются самой СУБД. */ public function insert(){ $fields=$this->fields; if (isset($fields[$this->idField])){ unset($fields[$this->idField]); } $newId=$this->db->insert($fields, $this->table); $this->select($newId+0); } /** * Обновляет информацию в таблице в соответствии с данными объекта. */ public function update(){ $fields=$this->fields; if (isset($fields[$this->idField])){ $id=$fields[$this->idField]; unset($fields[$this->idField]); } $this->db->update($fields, $this->table, array($this->idField=>$id)); $fields[$this->idField]=$id; } /** * Обновляет существующую запись или вставляет новую если запись не существует. */ public function insertOrUpdate(){ if ($this->id==-1){ $this->insert(); }else{ $this->update(); } } /** * Выбирает существующую запись или вставляет новую если запись не существует. * * @param mixed $fields Если это строка или число, считается идентификатором записи. * Если это массив, то ключи - имена полей, значения - значения полей. */ public function selectOrInsert($fields){ $this->select($fields); if (!$this->exists()){ $this->fields=$fields; $this->insert(); } } /** * Удаляет запись из таблицы. */ public function delete(){ $this->db->delete($this->table, array($this->idField=>$this->id)); } /** * Определяет определен ли объект записью из базы. * * @return bool true - если объект соответствует записи в базе, false - в противном случае. */ public function exists(){ return $this->id!=-1; } }
У меня была идея в следующем два исходных класса Object и Objects Т.е. при работе с одним конкретным объектом берем PHP: <?php class User extends Object ..... User->userName = 'Пользователь'; User->saveUser(); ?> И т.д. А при работе с множеством объектов Users extends Objects ..... Ну и вытекающие PHP: <?php //Представление $pepresentation = new Pepresentation((array('userid'=>'Имя пользователя')); //Запрос Users->setPepresentation($pepresentation); //вывод print Users->getHTMLtable(); ?> Генерация форм и т.д.