Я как-то еще не дорос до placeholder'ов... =)) Я пошел по другому пути: escape - определяет тип переданной переменной и возвращает строку в кавычках, число или NULL. Естественно проходится обработка типа mysql_real_escape_string. select, insert, update, delete - могут принимать готовый запрос, а могут принимать имя таблицы и массивы и уже на их основе составлять запросы.
флоппик да, но неудобно писать так: PHP: <?php $_db->prepare('INSERT INTO table SET field1=:f1, field2=:f3'); $_db->bind('f1', $_GET['f1'], PDO::INTEGER); $_db->bind('f2', $_GET['f2'], PDO::STRING); куда лучше так: PHP: <?php $_db->query('INSERT INTO table SET field1=?i, field2=?s', $_GET['f1'], $_GET['f2']);
PHP: <?php $pdo->prepare('INSERT INTO table SET field1=?, field2=?'); $pdo->execute(array($_GET['f1'], $_GET['f2']));
каким образом будут преобразованы переменные? У меня strict mode и оборачивать int'ы кавычками нельзя
учитывая то, что данные от пользователя приходят в виде строк, то нужно либо писать bind + PDO::INTEGER либо внутри execute приводить их к нужному типу. Довольно напряжно [для меня]. Я остаюсь при своем мнении - типизированным плейсхолдерам (?i, ?s, ?f) быть.
флоппик кстати то что ?arrlk у Mr.M.I.T. очень классная штука, чтобы не использовать отдельные билдеры. И вообще prepare->execute может замедлять работу с БД в полтора раза
в моих велосипедных библиотеках тоже так можно =) но, кстати, мы не замеряли во сколько раз наши либы замедляют работы с БД
?n - ?d или ?i логичнее, имхо. ?n выделить под null. ?arr* - ?ap или просто ?a. Соответственно, для ключей ?ak и ?av - для значений. ?arrand и ?arrand на мой взгляд лишние сущности.
флоппик да ладно, чё морозишься, поясни нам, чё делать? пофиг, замедляет только взаимодействие с БД, а один preg_replace или типа того ничёго не замедляет...
http://bicycle-libraries.googlecode.com ... holder.php только используйте windows-1251 кодировку. Там написано какие преобразования поддерживаются
глянь какой у меня там парсер и кешер =) можно сказать ради него писал. всё парсится только один раз. lexa да можно поменять без труда. там всё в switch'е но это на любителя. мне лично вообще без разницы, если не доходит до такого Koc это твоя?
Mr.M.I.T. Да, но не тестированная толком. И я еще не решил, что лучше возвращать - объект Mysqli_result или свой объект BL_Database_ Result.
мм? если ты о результате, дело не в LIKE'е у меня круче =) зачем тебе свой обжект? и тем более почему _Result. уж не итератор ли?
нет, спасибо =) PHP: <? public function fetch($result, $fetch) { $fetch = strToLower($fetch); if ((!$fetch) || ($fetch == 'no')) { return $result; } if ($fetch == 'id') { return $this->insert_id; } if ($fetch == 'ar') { return $this->affected_rows; } $numRows = $result->num_rows; if ($fetch == 'num') { return $numRows; } if ($fetch == 'row') { $A = Array(); for ($i = 0; $i < $numRows; $i++) { $A[] = $result->fetch_row(); } return $A; } if ($fetch == 'assoc') { $A = Array(); for ($i = 0; $i < $numRows; $i++) { $A[] = $result->fetch_assoc(); } return $A; } if ($fetch == 'col') { $A = Array(); for ($i = 0; $i < $numRows; $i++) { $r = $result->fetch_row(); $A[] = $r[0]; } return $A; } if ($fetch == 'object') { $A = Array(); for ($i = 0; $i < $numRows; $i++) { $A[] = $result->fetch_object(); } return $A; } if ($fetch == 'vars') { $A = Array(); for ($i = 0; $i < $numRows; $i++) { $r = $result->fetch_row(); $A[$r[0]] = $r[1]; } return $A; } if ($fetch == 'irow') { return new goDBResultRow($result); } if ($fetch == 'iassoc') { return new goDBResultAssoc($result); } if ($fetch == 'icol') { return new goDBResultCol($result); } if ($fetch == 'iobject') { return new goDBResultObject($result); } if ($numRows == 0) { return false; } if ($fetch == 'rowrow') { return $result->fetch_row(); } if ($fetch == 'rowassoc') { return $result->fetch_assoc(); } if ($fetch == 'rowobject') { return $result->fetch_object(); } if ($fetch == 'el') { $r = $result->fetch_row(); return $r[0]; } return true; } /*........*/ class goDBResultRow extends goDBResult { protected function getEl() { return $this->result->fetch_row(); } } class goDBResultAssoc extends goDBResult { protected function getEl() { return $this->result->fetch_assoc(); } } class goDBResultCol extends goDBResult { protected function getEl() { $r = $this->result->fetch_row(); return $r[0]; } } class goDBResultObject extends goDBResult { protected function getEl() { return $this->result->fetch_object(); } }
не понял. Что значит зря? Пользуюсь год где-то, доволен. А чем твое творение лучше goDB? А как дело было: я использовал sprintf для приведения типов. Потом увидел goDB и плейсхолдеры в ней. Через неделю узнал, что оказывается у нас на работе тоже класс для работы с БД с плейсхолдерами. Удивился, я тогда 3 месяца уже проработал в этой конторе и тут такая новость. Ну в goDB мне сразу не понравилось то, что подставляемые параметры идут в массиве. Мне удобнее их аргументами вставлять и через func_get_args разбирать. На работе так и сделано. Еще не понравилось то, что для разбора результатов нужно какую-то строку отправлять. Я предпочитаю автодополнение. Сделал адаптер к goDB, который разруливает 2 вышеперечисленных недочета. Потом решил сам написать. Через некоторое время решил глянуть ман для Zend_DB и PDO. Был приятно удивлен, что многие методы одинаково названы у меня (fetch, fetchAll, ...). Итого, можно сказать что мой класс для работы БД - синтез из: пары капель Zend_DB (добавлю еще пару капель - fetchParis, еще че-то) ложки goDB (тип справа от "?". На работе кроме "?" еще есть "!" и прочее. Это неудобно) ложки класса с работы половника своего писалова