Форум dkLab и Denwer
Здесь общаются Web-разработчики.
Генеральный спонсор:
Хостинг «Джино»

6_DbSimple version 1.x: лаконичная работа с различными СУБД (Дмитрий Котеров, оценка: 6)
Goto page Previous  1, 2, 3, 4, 5, 6, 7, 8, 9, 10  Next
Author Message
Rumata
Профессионал



Joined: 17 Aug 2003
Posts: 1850
Карма: 185
   поощрить/наказать


PostPosted: Wed Mar 22, 2006 6:48 pm (написано за 31 секунду)
   Post subject:
Reply with quote

Rumata wrote:
пользовать библиотеку по своему разумению
это направление обсуждения считаю закрытым
Back to top
View user's profile Send private message
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 413
   поощрить/наказать


PostPosted: Wed Mar 22, 2006 7:45 pm (спустя 56 минут; написано за 3 минуты 45 секунд)
   Post subject:
Reply with quote

По поводу optional-блоков. Вот тут пытаюсь их использовать в реальном проекте, и зематил, что:

1. Логика вложенных блоков: блок удаляется только в случае, если НЕПОСРЕДСТВЕННО ОН содержит DBSIMPLE_SKIP. Если его дочерний блок опускается, это НЕ означает, что должен пропуститься и родитель. Иначе нарушается вся логика.

2. В placeholder-е ?a значение array() (пустой массив) можно спокойно воспринимать как признак пропуска блока (наряду с DBSIMPLE_SKIP). Поскольку не существует такой ситуации, когда вставка пустого массива оказалась бы синтаксически корректной (в выражении IN() пустые скобки недопустимы).

3. В принципе, null и false используются настолько редко, что на практике их можно было бы объявить синонимами для DBSIMPLE_SKIP. Но это еще надо думать.
Back to top
View user's profile Send private message Send e-mail
Путник
Участник форума



Joined: 19 Mar 2006
Posts: 40
Карма: 1
   поощрить/наказать


PostPosted: Wed Mar 22, 2006 8:56 pm (спустя 1 час 11 минут; написано за 5 минут 10 секунд)
   Post subject:
Reply with quote

Дмитрий Кóтеров wrote:
Это не "хитрый способ", и отношения к DbSimple он не имеет. Читайте pear.php.net/manual/en/standards.naming.php
Дмитрий, я не совсем понимаю, причем здесь правила именования классов, функций и переменных?! Может быть я не совсем правильно сформулировал свой вопрос...

В документации к библиотеке вы пишете:
Code (php): скопировать код в буфер обмена
<?php #
require_once "../../lib/config.php";
require_once "DbSimple/DSN.php";
?>
Зачем нужен этот самый файл config.php? Почему бы просто не подключать файл DSN.php? Например так:
Code (php): скопировать код в буфер обмена
<?php ## Подключение к БД.
require_once "./lib/DbSimple/DSN.php"; # Используется путь относительно текущей директории
require_once dirname (www.php.net/dirname)(__FILE__) . "/DbSimple/DSN.php"; # Используется абсолютный путь
?>
Back to top
View user's profile Send private message Send e-mail
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 413
   поощрить/наказать


PostPosted: Thu Mar 23, 2006 12:22 am (спустя 3 часа 25 минут; написано за 2 минуты 1 секунду)
   Post subject:
Reply with quote


М

Еще раз: в PEAR принято, что путь к директории библиотек прописан в include_path, а все ссылки в require_once идут относительные (БЕЗ указания корневой директории библиотек). Как он попадет в include_path - это уже дело второе. В примерах, приведенных на сайте, его туда записывает config.php, но Вы можете его туда запихать каким угодно способом. Ваш вопрос не имеет никакого отношения к конкретной библиотеке, читайте про стандарты PEAR.
Back to top
View user's profile Send private message Send e-mail
five
Заглянувший



Joined: 31 Jul 2003
Posts: 9
Карма: 0
   поощрить/наказать


PostPosted: Thu Mar 30, 2006 4:44 pm (спустя 7 дней 16 часов 22 минуты; написано за 1 минуту 12 секунд)
   Post subject: selectpage
Reply with quote

Code (php): скопировать код в буфер обмена
$rows = $DB->selectPage($totalRows,'SELECT * FROM ?_users LIMIT ?d, ?d', $from, $pageSize);
//
//
//
 
$pageSize - кол-во выбираемых записей, а что должно быть в переменной $from ? Никак не могу сообразить.
Back to top
View user's profile Send private message
Лобач Олег
Участник форума



Joined: 05 May 2003
Posts: 72
Карма: 6
   поощрить/наказать

Location: Новокузнецк

PostPosted: Sun Apr 02, 2006 5:36 pm (спустя 3 дня 52 минуты; написано за 3 минуты 57 секунд)
   Post subject:
Reply with quote

С какой позиции начинать. Например, если хотите посмотреть вторую страницу при 10 элементах/стр., то во $from должно быть 10.
В общем:
Code (php): скопировать код в буфер обмена
$from = $pageNumber * $pageSize;
где:
$pageNumber - номер страницы,
$pageSize - кол-во элементов на странице.
Back to top
View user's profile Send private message
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 413
   поощрить/наказать


PostPosted: Mon Apr 03, 2006 11:52 am (спустя 18 часов 15 минут; написано за 2 минуты 9 секунд)
   Post subject:
Reply with quote

Лобач Олег wrote:
$from = $pageNumber * $pageSize;
Хотя это немного и оффтопик, я все же рекомендую передавать в GET-параметрах страницы не номер страницы, а текущую позицию, начиная с которой идет показ элементов. Т.е. не 1, 2, 3, а 10, 20, 30 и т.д. Так удобнее, во-первых, для SQL-запросов, а во-вторых - для случая, если будет реализована возможность изменять параметр "число элементов на странице". Если выбрана позиция, то новое число элементов на странице начнет показываться с нее, т.е. просто увеличится "облать обзора" как бы.
Back to top
View user's profile Send private message Send e-mail
Maus
Модератор



Joined: 29 Jun 2003
Posts: 8151
Карма: 271
   поощрить/наказать

Location: пос. Омсукчан Магаданской области

PostPosted: Mon Apr 03, 2006 2:43 pm (спустя 2 часа 50 минут; написано за 34 секунды)
   Post subject:
Reply with quote

Дмитрий Котеров
как понимаю, префиксный плейсхолдер рабоатет для имен таблиц, но не баз?
Back to top
View user's profile Send private message
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 413
   поощрить/наказать


PostPosted: Mon Apr 03, 2006 7:35 pm (спустя 4 часа 52 минуты; написано за 26 секунд)
   Post subject:
Reply with quote

Он вообще ничего не знает ни про какие таблицы и базы.
Back to top
View user's profile Send private message Send e-mail
Maus
Модератор



Joined: 29 Jun 2003
Posts: 8151
Карма: 271
   поощрить/наказать

Location: пос. Омсукчан Магаданской области

PostPosted: Tue Apr 04, 2006 12:23 pm (спустя 16 часов 47 минут; написано за 35 секунд)
   Post subject:
Reply with quote

Дмитрий Котеров
извиняюсь, был невнимателен: константу поставил, но пропустил строчку
Code (php): скопировать код в буфер обмена
$DB->database->setIdentPrefix(TABLE_PREFIX);
Back to top
View user's profile Send private message
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 413
   поощрить/наказать


PostPosted: Wed Apr 05, 2006 12:05 am (спустя 11 часов 41 минуту; написано за 10 секунд)
   Post subject:
Reply with quote

Как правильно задавать вопросы: статья, обязательная к прочтению (citforum.ru/howto/smart-questions-ru.shtml)
Back to top
View user's profile Send private message Send e-mail
mot
Участник форума



Joined: 16 Mar 2006
Posts: 37
Карма: 3
   поощрить/наказать


PostPosted: Wed Apr 05, 2006 5:57 pm (спустя 17 часов 52 минуты; написано за 4 минуты 43 секунды)
   Post subject:
Reply with quote

У меня есть два вопроса:
1. Почему при выборках Select() в случае отсутствия в БД строк, удовлетворяющих условиям выборки возвращается NULL? Ведь сразу за строкой с $rows = DB->Select() идёт (в набле)строка foreach ($rows as $numRow=>$row), которая пораждает ошибку в таком случае.
Приходиться использовать конструкцию вида:
Code (php): скопировать код в буфер обмена
$rows = $DB->select('SELECT * FROM table where field = ?', $field);

if(is_null (www.php.net/is_null)($rows) {
        $rows = array (www.php.net/array)();
}

foreach ($rows as $numRow=>$row) {
  ...
}
2. Почему при любых выборках тип данных в ячейках - string, независимо от типа данных в БД?
Back to top
View user's profile Send private message Send e-mail
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 413
   поощрить/наказать


PostPosted: Thu Apr 06, 2006 10:08 am (спустя 16 часов 10 минут; написано за 2 минуты 31 секунду)
   Post subject:
Reply with quote

mot wrote:
Почему при выборках Select() в случае отсутствия в БД строк, удовлетворяющих условиям выборки возвращается NULL?
Если все действительно так, как Вы говорите, то это баг. Однозначно должен возвращаться пустой массив (по-моему, он и возвращается все же).
mot wrote:
Почему при любых выборках тип данных в ячейках - string, независимо от типа данных в БД?
Что PHP-функции работы с базой возвращают, то возвращает и библиотека. Никаких преобразований не делается, вряд ли они целесообразны. Но даже если и сделать ручное преобразование типов, все равно в PHP типов меньше, чем в большинстве СУБД, так что однозначно преобразовать не удастся.

Зачем Вам типы?
Back to top
View user's profile Send private message Send e-mail
mot
Участник форума



Joined: 16 Mar 2006
Posts: 37
Карма: 3
   поощрить/наказать


PostPosted: Fri Apr 07, 2006 4:00 pm (спустя 1 день 5 часов 51 минуту; написано за 10 минут 9 секунд)
   Post subject:
Reply with quote

Дмитрий Котеров wrote:
Если все действительно так, как Вы говорите, то это баг. Однозначно должен возвращаться пустой массив (по-моему, он и возвращается все же).
Прошу прощения, писал по памяти, ошибся.
Вот что я на самом деле хотел сказать: при использовании selectRow() в случае отсутствия в БД строк, удовлетворяющих условиям выборки, возвращается bool(false). Как мне кажется, правильнее возвращать array(). Поясню на примере:
Code (php): скопировать код в буфер обмена
$oDatabase = DbSimple_DSN::connect("mysql://user:pass@host/base");
$oDbc = $oDatabase->transaction();
/*
$oDbc->query('
CREATE TABLE `test` (
  `id` int(11) unsigned NOT NULL auto_increment, 
  `text` varchar(255) default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;
');
*/


$aRows = $oDbc->selectRow('select id, text from test where id = ?', 1);

var_dump (www.php.net/var_dump)($aRows);//bool(false)

var_dump (www.php.net/var_dump)($aRows['id']);//NULL
//
 
Дмитрий Котеров wrote:
Что PHP-функции работы с базой возвращают, то возвращает и библиотека.
Я снова прошу извинений. При работе с Firebird, PHP возвращает элементы выборки с таким типом (ну не совсем с таким, во всяком случае есть разделение на int и string), как он был в БД.
Я же стал пробовать вашу библиотеку с MySQL, но не учёл того, что PHP возвращает все элементы выборки с типом string.
Продолжу предыдущий код:
Code (php): скопировать код в буфер обмена
$oDbc->query('insert into test (id, text) values (?, ?)', 10, 'test string');

$mCell = $oDbc->selectCell('select id from test where id = ?', 10);

var_dump (www.php.net/var_dump)($mCell);//string(2) "10"
//
 
Дмитрий Котеров wrote:
Зачем Вам типы?
Да куча всего, хотя бы для элементов массива с типом string делать htmlspecialchars().
Back to top
View user's profile Send private message Send e-mail
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 413
   поощрить/наказать


PostPosted: Fri Apr 07, 2006 5:44 pm (спустя 1 час 44 минуты; написано за 4 минуты 27 секунд)
   Post subject:
Reply with quote

mot wrote:
при использовании selectRow() в случае отсутствия в БД строк, удовлетворяющих условиям выборки, возвращается bool(false)
Скорее всего, не false, а null. По крайней мере, так задумывалось.

Но Вы правы:
Code (php): скопировать код в буфер обмена
<?
$a = null;
echo (www.php.net/echo) $a['a'];
?>
никаких нотисов не выдает (что крайне странно!), а вот если присвоить array(), тогда все ОК.

Видимо, в новой версии будет возвращать array() все же - хотя это и неверно идеологически: array() - это по смыслу строка с нулевым набором полей, а не отсутствующая строка. Набор таких "пустых" строк можно получить, например, запросом $DB->select('SELECT ID AS ARRAY_KEY FROM tbl').
mot wrote:
хотя бы для элементов массива с типом string делать htmlspecialchars().
Так делайте для всех: числу от htmlspecialchar-а хуже не станет.

Ну откуда я Вам возьму типы, если PHP о них ничего не знает? Можно, конечно, еще дополнительные запросы делать о типах полей, но я не вижу все-таки, зачем заморачиваться и тратить процессорные ресурсы.
Back to top
View user's profile Send private message Send e-mail
mot
Участник форума



Joined: 16 Mar 2006
Posts: 37
Карма: 3
   поощрить/наказать


PostPosted: Fri Apr 07, 2006 7:11 pm (спустя 1 час 26 минут; написано за 7 минут 58 секунд)
   Post subject:
Reply with quote

Дмитрий Котеров wrote:
Скорее всего, не false, а null. По крайней мере, так задумывалось.
Перепроверил свой пример - нет, выдаёт именно false.
Quote:
Видимо, в новой версии будет возвращать array() все же - хотя это и неверно идеологически: array() - это по смыслу строка с нулевым набором полей, а не отсутствующая строка.
Да, очень хотелось бы. Это избавит от ряда проблем...
Quote:
Ну откуда я Вам возьму типы, если PHP о них ничего не знает?
Нет-нет, к Вам никаких претензий, я написал что был не прав.
Back to top
View user's profile Send private message Send e-mail
Путник
Участник форума



Joined: 19 Mar 2006
Posts: 40
Карма: 1
   поощрить/наказать


PostPosted: Sun Apr 09, 2006 9:38 pm (спустя 2 дня 2 часа 27 минут; написано за 4 секунды)
   Post subject:
Reply with quote

Еще раз про именованные placeholder'ы. В форуме уже говорилось об их нецелесообразности. Но если рассмотреть такой вариант, как поиск с учетом релевантности?

Вот фрагмент PHP кода:
Code (php): скопировать код в буфер обмена
$sql = '
   SELECT *, MATCH (field1, field2)
   AGAINST (?) AS rel
   FROM table
   WHERE MATCH (field1, field2)
   AGAINST (?)
'
;
$result = $db->select($sql, $query, $query)
В запросе к БД переменную $query приходится указывать 2 раза. Теоретически может возникнуть необходимость использовать одно и то же значение и более 2 раз. В этом случае использование именованных placeholder'ов могло быть оправданным.

Пожалуйста, подскажите, если не использовать именованные placeholder'ы, как должен выглядеть такой запрос?
Back to top
View user's profile Send private message Send e-mail
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 413
   поощрить/наказать


PostPosted: Tue Apr 11, 2006 11:50 am (спустя 1 день 14 часов 11 минут; написано за 45 секунд)
   Post subject:
Reply with quote

Путник wrote:
Теоретически может возникнуть необходимость использовать одно и то же значение и более 2 раз.
Ну так и напишите его в списке параметров 2 раза. Какая разница, где дублировать идентификатор: внутри строковой константы SQL-запроса или же в списке параметров?
Back to top
View user's profile Send private message Send e-mail
mot
Участник форума



Joined: 16 Mar 2006
Posts: 37
Карма: 3
   поощрить/наказать


PostPosted: Thu Apr 20, 2006 3:57 pm (спустя 9 дней 4 часа 6 минут; написано за 13 минут 18 секунд)
   Post subject:
Reply with quote

Хотелось бы озвучить ещё один момент.
У меня есть стойкое желание использовать нижний (или смешанный) регистр в именах столбцов/таблиц и прочее, но никак не только верхний.

1. MySQL.
При выборках из БД имена столбцов в таком же регистре, что и в sql-запросе.
Code (php): скопировать код в буфер обмена
$aRow = $oDbc->selectRow('SELECT data FROM test WHERE id = ?', $id);
var_dump (www.php.net/var_dump)($aRow);//array(1) {  ["data"]=> string(3) "..."}

$aRow = $oDbc->selectRow('SELECT DATA FROM test WHERE id = ?', $id);
var_dump (www.php.net/var_dump)($aRow);//array(1) {  ["DATA"]=> string(3) "..."}
 
2.1 Firebird, диалект 1.
При выборках из БД имена столбцов всегда в верхнем регистре.
Code (php): скопировать код в буфер обмена
$aRow = $oDbc->selectRow('SELECT data FROM test WHERE id = ?', $id);
var_dump (www.php.net/var_dump)($aRow);//array(1) {  ["DATA"]=> string(3) "..."}
 
То есть, первый диалект не подходит.

2.2 Firebird, диалект 3.

Имеем таблицу, имена столбцов в ней - в нижнем регистре.
При выборках из БД необходимо имена выбираемых столбцов заключать в двойные кавычки ("). В противном случае получим ошибку.

Соотвественно код выглядит так:
Code (php): скопировать код в буфер обмена
$aRow = $oDbc->selectRow('SELECT "data" FROM test WHERE id = ?', $id);
var_dump (www.php.net/var_dump)($aRow);//array(1) {  ["data"]=> string(3) "..."}
 
Обратите внимание - имя столбца в нижнем регистре. PHP работает с БД корректно.

Но этот код не будет работать с MySQL. Чтобы он был совместим с MySQL нужно использовать идентификационные плейсхолдеры для имён столбцов:
Code (php): скопировать код в буфер обмена
$aRow = $oDbc->selectRow('SELECT ?# FROM test WHERE id = ?', 'data', $id);
var_dump (www.php.net/var_dump)($aRow);//array(1) {  ["FIELD_00"]=> string(3) "..."}
 
Но в данном случае получаем неудобоваримое имя столбца.
Вылечить не получается:
Code (php): скопировать код в буфер обмена
$aRow = $oDbc->selectRow('SELECT ?# as data FROM test WHERE id = ?', 'data', $id);
var_dump (www.php.net/var_dump)($aRow);//array(1) {  ["DATA"]=> string(3) "..."}
 
Что делать?
Back to top
View user's profile Send private message Send e-mail
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 413
   поощрить/наказать


PostPosted: Fri Apr 21, 2006 1:36 am (спустя 9 часов 39 минут; написано за 1 минуту 57 секунд)
   Post subject:
Reply with quote

Ничего не делать. DbSimple не предназначена для абстрагирования от различных СУБД, она позволяет удобно работать с конкретной выбранной СУБД. А если хотите абстракцию на уровне "хоть MySQL, хоть Postgres, хоть FireBird" - нужно написать и использовать более высокий слой абстракции, расположенный над DbSimple. Конечно, если я правильно понял вопрос.
mot wrote:
FIELD_00
Откуда это имя?
Back to top
View user's profile Send private message Send e-mail
mot
Участник форума



Joined: 16 Mar 2006
Posts: 37
Карма: 3
   поощрить/наказать


PostPosted: Fri Apr 21, 2006 12:20 pm (спустя 10 часов 44 минуты; написано за 4 минуты 50 секунд)
   Post subject:
Reply with quote

Собственно весь вопрос в том, чтоб при использовании ссылочного плейсхолдера имя выбираемого столбца было равно тому, что подставляется.
Дмитрий Кóтеров wrote:
mot wrote:
FIELD_00
Откуда это имя?
По коду вроде бы понятно - из DbSimple при использовании ?# плейсхолдера. Если бы вместо такого имени было то, что подставляется (в данном случае - data), то проблема решена.
Back to top
View user's profile Send private message Send e-mail
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 413
   поощрить/наказать


PostPosted: Fri Apr 21, 2006 1:07 pm (спустя 46 минут; написано за 1 минуту 32 секунды)
   Post subject:
Reply with quote

mot wrote:
$aRow = $oDbc->selectRow('SELECT ?# as data FROM test WHERE id = ?', 'data', $id);
var_dump($aRow);//array(1) { ["DATA"]=> string(3) "..."}
Вы хотите сказать, что на место ?# в запрос подставляется не 'data', а 'FIELD_00'?
Вы уверены? Вряд ли такое может быть, во всей библиотеки нет ни одной подстроки "FIELD".
Скорее всего, глюк где-то еще - возможно, в функциях для работы с FB выставлен какой-то не такой режим (вот Вы упоминали диалект).
Back to top
View user's profile Send private message Send e-mail
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 413
   поощрить/наказать


PostPosted: Fri Apr 21, 2006 1:07 pm (спустя 23 секунды; написано за 18 секунд)
   Post subject:
Reply with quote

Включите логирование запросов, как описано в статье, и посмотрите, какие запросы реально посылаются в базу.
Back to top
View user's profile Send private message Send e-mail
mot
Участник форума



Joined: 16 Mar 2006
Posts: 37
Карма: 3
   поощрить/наказать


PostPosted: Fri Apr 21, 2006 4:10 pm (спустя 3 часа 3 минуты; написано за 2 минуты 52 секунды)
   Post subject:
Reply with quote

Дмитрий Котеров wrote:
mot wrote:
$aRow = $oDbc->selectRow('SELECT ?# as data FROM test WHERE id = ?', 'data', $id);
var_dump($aRow);//array(1) { ["DATA"]=> string(3) "..."}
Вы хотите сказать, что на место ?# в запрос подставляется не 'data', а 'FIELD_00'?
Вы уверены? Вряд ли такое может быть, во всей библиотеки нет ни одной подстроки "FIELD".
Скорее всего, глюк где-то еще - возможно, в функциях для работы с FB выставлен какой-то не такой режим (вот Вы упоминали диалект).
Нет, в запрос подставляется 'data', возвращается значение именно этого столбца, вот только имя столбца получается как 'FIELD_00'.
Сейчас попробую логирование запросов.
Back to top
View user's profile Send private message Send e-mail
mot
Участник форума



Joined: 16 Mar 2006
Posts: 37
Карма: 3
   поощрить/наказать


PostPosted: Fri Apr 21, 2006 4:23 pm (спустя 12 минут; написано за 2 минуты 27 секунд)
   Post subject:
Reply with quote

Code (php): скопировать код в буфер обмена
$oDatabase = DbSimple_DSN::connect("ibase://user:pass@ip/path?ROLE=&CHARSET=win1251&DIALECT=3");
$oDbc = $oDatabase->transaction();

$oDbc->database->setLogger('myLogger');

$aRow = $oDbc->selectRow('SELECT ?# FROM test', 'data');
var_dump (www.php.net/var_dump)($aRow);
Получаем:
Code (any language): скопировать код в буфер обмена
SELECT "data" FROM test
  -- 6 ms = 5+1; returned ('data')
array(1) { ["FIELD_00"]=> string(4) "data" }
-- COMMIT
Back to top
View user's profile Send private message Send e-mail
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 413
   поощрить/наказать


PostPosted: Fri Apr 21, 2006 4:29 pm (спустя 5 минут)
   Post subject:
Reply with quote

Дмитрий Котеров wrote:
Скорее всего, глюк где-то еще - возможно, в функциях для работы с FB выставлен какой-то не такой режим (вот Вы упоминали диалект).
Back to top
View user's profile Send private message Send e-mail
Путник
Участник форума



Joined: 19 Mar 2006
Posts: 40
Карма: 1
   поощрить/наказать


PostPosted: Mon May 01, 2006 1:39 pm (спустя 9 дней 21 час 10 минут; написано за 12 секунд)
   Post subject:
Reply with quote

Дмитрий, скажите пожалуйста, почему при передаче нескольких запросов к базе данных, библиотека возвращает сообщение об ошибке?

Вот пример, который взят из документации MySQL (попытка заменить именованные плейсхолдеры на пользовательские переменные MySQL):
Code (SQL): скопировать код в буфер обмена
SET @t1=0, @t2=0, @t3=0;
SELECT @t1:=(@t2:=1)+@t3:=4,@t1,@t2,@t3;
Вот PHP код:
Code (php): скопировать код в буфер обмена
$sql = '
        SET @t1=0, @t2=0, @t3=0;
        SELECT @t1:=(@t2:=1)+@t3:=4,@t1,@t2,@t3;
'
;
$result = $db->select($sql);
Так выглядит сообщение об ошибке: SQL Error: 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 '; SELECT @t1:=(@t2:=1)+@t3:=4,@t1,@t2,@t3' at line 1.

Если же попытаться выполнить приведенный выше запрос с помощью phpMyAdmin, то получается результат, идентичный приведенному в примере:
Code (any language): скопировать код в буфер обмена
+----------------------+------+------+------+
| @t1:=(@t2:=1)+@t3:=4 | @t1  | @t2  | @t3  |
+----------------------+------+------+------+
|                    5 |    5 |    1 |    4 |
+----------------------+------+------+------+
И еще хотелось бы узнать, как скоро предстанет перед благодарными вам пользователями DbSimple 2 со обещаными "вкусностями"?
Back to top
View user's profile Send private message Send e-mail
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 413
   поощрить/наказать


PostPosted: Mon May 01, 2006 1:45 pm (спустя 5 минут; написано за 1 минуту 3 секунды)
   Post subject:
Reply with quote

Читайте документацию MySQL, там сказано, что отправлять 2 запроса в одном обращении нельзя.
phpMyAdmin вручную разбивает тексто по ";" и выполняет в цикле, причем иногда ошибается в этом деле.
Back to top
View user's profile Send private message Send e-mail
Путник
Участник форума



Joined: 19 Mar 2006
Posts: 40
Карма: 1
   поощрить/наказать


PostPosted: Mon May 01, 2006 1:50 pm (спустя 5 минут; написано за 1 минуту 11 секунд)
   Post subject:
Reply with quote

Ясно-понятно. Да уж, тогда наверно лучше несколько раз передавать в запрос одну переменную, чем выполнять два запроса... А по поводу второго вопроса?
Back to top
View user's profile Send private message Send e-mail
Rin
Участник форума



Joined: 01 Jun 2005
Posts: 515
Карма: 184
   поощрить/наказать

Location: Москва

PostPosted: Sat May 06, 2006 1:38 pm (спустя 4 дня 23 часа 48 минут; написано за 2 минуты 47 секунд)
   Post subject:
Reply with quote

Класс получается отличный.
Хотелось бы увидеть в новой версии поддержку mysqli.

Для тех, кому нужно выполнить нескольких запросов:
sql_split: функция для разделения сложного SQL-запроса по разделителю ";" (forum.dklab.ru/viewtopic.php?t=16069)

Last edited by Rin on Mon Aug 07, 2006 10:46 pm; edited 1 time in total
Back to top
View user's profile Send private message Send e-mail
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 413
   поощрить/наказать


PostPosted: Sat May 06, 2006 1:50 pm (спустя 11 минут; написано за 6 секунд)
   Post subject:
Reply with quote

А зачем?
Back to top
View user's profile Send private message Send e-mail
Rin
Участник форума



Joined: 01 Jun 2005
Posts: 515
Карма: 184
   поощрить/наказать

Location: Москва

PostPosted: Sat May 06, 2006 3:00 pm (спустя 1 час 9 минут; написано за 1 минуту 11 секунд)
   Post subject:
Reply with quote

Чтобы работать на связке MySQL 4.1.x / PHP 5.x
Back to top
View user's profile Send private message Send e-mail
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 413
   поощрить/наказать


PostPosted: Sun May 07, 2006 1:10 am (спустя 10 часов 10 минут; написано за 20 секунд)
   Post subject:
Reply with quote

На этой связке прекрасно можно работать и без mysqli.
Back to top
View user's profile Send private message Send e-mail
Andrei Solovjev
Участник форума



Joined: 06 Mar 2006
Posts: 21
Карма: 0
   поощрить/наказать


PostPosted: Sun May 07, 2006 4:12 pm (спустя 15 часов 2 минуты; написано за 20 секунд)
   Post subject:
Reply with quote

Rin wrote:
Хотелось бы увидеть в новой версии поддержку mysqli.
Дмитрий Котеров wrote:
А зачем?
"mysqli имеет несколько существенных преимуществ:
-Заметно большая скорость. Усовершенствования, как в расширении, так и в MySQL, ускорили большинство операций, иногда достигая 40-кратного увеличения производительности по сравнению с ext/mysql.
-Усиленная безопасность. В ранних версиях MySQL RDBMS (см. Словарь терминов в конце статьи - прим. переводчика), существовала возможность отловить хэш слабого пароля в сети и затем воссоздать пароль пользователя. Новая процедура аутентификации гораздо прочнее и повторяет устойчивые к атакам механизмы авторизации таких инструментов как SSH."
источник: phpclub.ru
Back to top
View user's profile Send private message Send e-mail
Rin
Участник форума



Joined: 01 Jun 2005
Posts: 515
Карма: 184
   поощрить/наказать

Location: Москва

PostPosted: Wed May 10, 2006 10:39 am (спустя 2 дня 18 часов 26 минут; написано за 1 минуту)
   Post subject:
Reply with quote

Дмитрий Котеров wrote:
На этой связке прекрасно можно работать и без mysqli.
У хостера может быть установлено только расширение mysqli
Back to top
View user's profile Send private message Send e-mail
mot
Участник форума



Joined: 16 Mar 2006
Posts: 37
Карма: 3
   поощрить/наказать


PostPosted: Fri May 12, 2006 2:16 pm (спустя 2 дня 3 часа 37 минут; написано за 1 минуту 49 секунд)
   Post subject:
Reply with quote

Вопрос - а как работать с генераторами Firebird'a, чтобы не было проблем? В php5 есть спец. функция ibase_gen_id().

P.S. Конечно кроме как:
Code (SQL): скопировать код в буфер обмена
SELECT GEN_ID(gen_name, incr) AS var FROM RDB$DATABASE
Back to top
View user's profile Send private message Send e-mail
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 413
   поощрить/наказать


PostPosted: Fri May 12, 2006 11:20 pm (спустя 9 часов 3 минуты; написано за 45 секунд)
   Post subject:
Reply with quote

Генераторы во всех СУБД по-разному работают, так что используйте именно тот запрос, который Вы указали. Все равно "спец-функция" именно его и запускает (насколько я понимаю).
Back to top
View user's profile Send private message Send e-mail
Иван Шумков
Участник форума



Joined: 30 Dec 2004
Posts: 229
Карма: 6
   поощрить/наказать

Location: Россия, Санкт-Петербург

PostPosted: Fri May 19, 2006 10:32 am (спустя 6 дней 11 часов 11 минут; написано за 41 секунду)
   Post subject:
Reply with quote

Дмитрий Котеров
Когда можно будет увидеть версию библиотеки с условиями ( ... [WHERE id = ?] )?
Back to top
View user's profile Send private message
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 413
   поощрить/наказать


PostPosted: Sat May 20, 2006 12:26 am (спустя 13 часов 54 минуты; написано за 58 секунд)
   Post subject:
Reply with quote

Да увидеть-то можно прямо сейчас (прикладываю), только вот пока что есть версия исключительно для MySQL. До релизного варианта доделать пока руки не дошли. По-хорошему надо писать систему автоматических тестов (phpUnit?), но нужно вначале со всем этим разобраться...


DbSimple.zip
 Description:
ВНИМАНИЕ! Неофициальная версия! Поддерживается только MySQL.

Download
 Filename:  DbSimple.zip
 Filesize:  10.57 KB
 Downloaded:  412 Time(s)

Back to top
View user's profile Send private message Send e-mail
Иван Шумков
Участник форума



Joined: 30 Dec 2004
Posts: 229
Карма: 6
   поощрить/наказать

Location: Россия, Санкт-Петербург

PostPosted: Sun May 21, 2006 6:25 pm (спустя 1 день 17 часов 59 минут; написано за 51 секунду)
   Post subject:
Reply with quote

Дмитрий Котеров
Идея с тестами отличная.
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   This topic is locked: you cannot edit posts or make replies. All times are GMT + 3 Hours
Goto page Previous  1, 2, 3, 4, 5, 6, 7, 8, 9, 10  Next
Page 4 of 10    Email to a Friend.
You cannot post new topics in this forum. You can reply to topics in this forum. You cannot edit your posts in this forum. You cannot delete your posts in this forum. You cannot vote in polls in this forum. You cannot attach files in this forum. You can download files in this forum.
XML