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

DbSimple v2.x: лаконичная работа с различными СУБД (Дмитрий Котеров, оценка: 10)
Goto page Previous  1, 2, 3, ... 13, 14, 15  Next
Author Message
Владимир Хоменко
Участник форума



Joined: 11 Jun 2004
Posts: 427
Карма: 42
   поощрить/наказать

Location: Николаев, Украина

PostPosted: Thu Jan 18, 2007 7:46 pm (написано за 39 секунд)
   Post subject:
Reply with quote

Дмитрий Котеров wrote:
Вообще, у меня есть такое убеждение, что необходимость получения метаданных базы свидетельствует об ошибке в архитектуре системы.
Если это только не PMA (-;

Off: Дмитрий, у Вас что-то с кармой случилось
Back to top
View user's profile Send private message Send e-mail
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 198
   поощрить/наказать

Location: 007 495

PostPosted: Thu Jan 18, 2007 8:51 pm (спустя 1 час 4 минуты; написано за 45 секунд)
   Post subject:
Reply with quote

Владимир Хоменко wrote:
что-то с кармой случилось
Это, вероятно, противоборство двух скриптов: тех горе-ламеров, которые флудят скрипт понижения кармы, и модераторов данного форума, которые флудят тот же скрипт, только в сторону повышения )
Back to top
View user's profile Send private message Send e-mail
Гриша
Заглянувший



Joined: 26 Oct 2006
Posts: 12
Карма: 0
   поощрить/наказать


PostPosted: Fri Jan 19, 2007 8:09 pm (спустя 23 часа 18 минут; написано за 7 минут 27 секунд)
   Post subject: кэш? или не кэш?
Reply with quote

Ковыряюсь со скриптом, приводить код не буду, но обновление делается этой конструкцией
Code (php): скопировать код в буфер обмена
'UPDATE ?_goods SET ?a WHERE id=?', $form_input, $id
Так вот загадка!
Если массив $form_input не изменялся, то повторно не обновляет, выдаёт ошибку, $DB->query('UPDATE ?_goods SET ?a WHERE id=?', $form_input, $id) возвращает ложь
а если изменить в той же форме хоть букву - обновляет! но опять же, только один раз

В логи сервера ничего не пишется, рекомендованный отладчик
Code (php): скопировать код в буфер обмена
$DB->setLogger('myLogger'); function myLogger($db, $sql)
ничего не показывает,
Code (php): скопировать код в буфер обмена
$DB->setErrorHandler('databaseErrorHandler');
тоже ничего не показывает...

По шагам.
1. Открываю в Опере форму, заполняю, сабмичу - ОК!, обновлено.
2. Нажимаю кнопку "назад", по идее получая в точности ту же форму с теми же значениями (Опера!)
3. Сабмичу - УПС! обламываюсь
4. Нажимаю кнопку "назад", изменяю данные (хоть один символ в любом поле)
5. Сабмичу - ОК! опять работает!
6. GOTO 2
и т.д.
форма генерируется динамически, но это не важно, думаю.

Никакое кэширование принудительно не включал.
Что бы это могло быть?
Back to top
View user's profile Send private message
Дмитрий Котеров
Администратор



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


PostPosted: Sat Jan 20, 2007 1:52 pm (спустя 17 часов 43 минуты; написано за 1 минуту 27 секунд)
   Post subject:
Reply with quote

Вы уверены, что дело вообще в библиотеке?
Используйте print_r, чтобы посмотреть, что реально обрабатывается на сервере.
Я оцениваю вероятность того, что проблема в DbSimple, как крайне низкую. Скорее всего, баг где-то уровнем выше.
Back to top
View user's profile Send private message Send e-mail
Гриша
Заглянувший



Joined: 26 Oct 2006
Posts: 12
Карма: 0
   поощрить/наказать


PostPosted: Sat Jan 20, 2007 3:32 pm (спустя 1 час 39 минут; написано за 1 минуту 38 секунд)
   Post subject:
Reply with quote

Дмитрий Котеров wrote:
Вы уверены, что дело вообще в библиотеке?
Используйте print_r, чтобы посмотреть, что реально обрабатывается на сервере.
Нет, пока не уверен. Пока что это просто какая-то мистика. :)
Я попробовал массив не принимать из формы, а объявит в скрипте - то же самое!

Вот скрипт целиком:
Code (php): скопировать код в буфер обмена
$id=1;

$form_input = array (www.php.net/array)(
'name' => "товар2",
'specification' => "ssagf",
'description' => "пппgв",
'price' => 2,
'weight' => 0,
'priority' => 1,
'is_new' => "нет"
);

  if ($DB->query('UPDATE ?_goods SET ?a WHERE id=?', $form_input, $id)) {
        print (www.php.net/print) "ОК";
  } else {
        print (www.php.net/print) "ошибка";
  }
При первом запуске после изменения хоть одного элемента массива вручную пишет ОК, при всех остальных - ошибка. Потом опять добавляю буковку в какой-нибудь элемент - ОК!
Как я уже сказал, рекомендованный логгер почему то ничего связанного с этим запросом не выводит, вне зависимости от удачности или неудачности обновления данных, хотя прекрасно выводит два следующих за ним СЕЛЕКТа. Обработчик ошибок $DB->setErrorHandler прицеплен, и срабатывает если в запросе настоящая ошибка, но тут молчит...

Посоветуйте, к чему подцепить print_r чтобы "посмотреть, что реально обрабатывается на сервере". Сам массив уже выводил - массив как массив... :)

Индекс в таблице ?_goods пока один - тот самый id... В случае успешного обновления строка действительно замещается... мистика...
Back to top
View user's profile Send private message
Гриша
Заглянувший



Joined: 26 Oct 2006
Posts: 12
Карма: 0
   поощрить/наказать


PostPosted: Sat Jan 20, 2007 3:45 pm (спустя 13 минут; написано за 1 минуту 16 секунд)
   Post subject:
Reply with quote

Возникла идея - может это как-то связано в результатом, возвращаемом MySQL при полном совпадении обновляемой строки? Как проверить?
MySQL вроде 3.23.49...
Сейчас буду копать...
Back to top
View user's profile Send private message
Гриша
Заглянувший



Joined: 26 Oct 2006
Posts: 12
Карма: 0
   поощрить/наказать


PostPosted: Sat Jan 20, 2007 6:37 pm (спустя 2 часа 52 минуты; написано за 3 минуты 23 секунды)
   Post subject:
Reply with quote

Новые данные.
mysql_info() выдаёт: "Rows matched: 1 Changed: 0 Warnings: 1"
Как посмотреть это "Warning"?

MySQL у меня всё-таки 4.1.16-max, а 3.23.49 я взял из PHPINFO, а это был какой-то MySQL API...

В общем, интуитивно чувствую, что MySQL просто не хочет обновлять строку на полностью идентичную. Не ожидал.
В принципе, ничего страшного, строка в таблице нужная есть.
Но встаёт вопрос, как обрабатывать ошибки?
Как убедится что $DB->query('UPDATE ?_goods SET ?a WHERE id=?', $form_input, $id) вернул предупреждение, а не ошибку?
Back to top
View user's profile Send private message
Guest






Карма: 388
   поощрить/наказать


PostPosted: Sun Jan 21, 2007 5:48 am (спустя 11 часов 10 минут; написано за 5 минут 41 секунду)
   Post subject:
Reply with quote

Кстати, господа, я так и не понял...

DbSimple работает с SQLite или нет? В форуме где-то пролетало что вроде как работает, для этого используется PDO. Но ни в документации, ни в исходниках ничего по этому поводу не нашел.

Проясните пожалуйста ситуацию.
Back to top
Дмитрий Котеров
Администратор



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


PostPosted: Sun Jan 21, 2007 8:35 pm (спустя 14 часов 46 минут; написано за 2 минуты 3 секунды)
   Post subject:
Reply with quote

Гриша wrote:
Возникла идея - может это как-то связано в результатом, возвращаемом MySQL при полном совпадении обновляемой строки?
Да, именно. MySQL возвращает число ФАКТИЧЕСКИ измененных строк, а оно в Вашем случае - 0.
Делайте так:
Code (php): скопировать код в буфер обмена
if (null !== $DB->query('UPDATE ?_goods SET ?a WHERE id=?', $form_input, $id)) {
    print (www.php.net/print) "ОК";
} else {
    print (www.php.net/print) "ошибка";
}
Обязательно именно !==, а не !=, чтобы проверялся еще и тип (0 !== null, но null == 0).
Гость wrote:
DbSimple работает с SQLite или нет?
Пока нет. Надо делать поддержку PDO, а она еще не готова. Сейчас поддерживаются только MySQL, PgSQL, FireBird.
Back to top
View user's profile Send private message Send e-mail
Satyrius
Участник форума



Joined: 28 Mar 2006
Posts: 110
Карма: 2
   поощрить/наказать

Location: Москва

PostPosted: Thu Jan 25, 2007 11:53 am (спустя 3 дня 15 часов 18 минут; написано за 31 секунду)
   Post subject:
Reply with quote

Дмитрий, а планируется поддержка MSSQL?
Back to top
View user's profile Send private message
Константин Жинько [tIT]
Сотрудник «Лаборатории»



Joined: 12 Jun 2004
Posts: 2264
Карма: 106
   поощрить/наказать

Location: Москва

PostPosted: Thu Jan 25, 2007 4:30 pm (спустя 4 часа 36 минут; написано за 21 секунду)
   Post subject:
Reply with quote

Satyrius
А надо?
Back to top
View user's profile Send private message
Satyrius
Участник форума



Joined: 28 Mar 2006
Posts: 110
Карма: 2
   поощрить/наказать

Location: Москва

PostPosted: Fri Jan 26, 2007 12:18 pm (спустя 19 часов 47 минут; написано за 3 минуты 45 секунд)
   Post subject:
Reply with quote

Константин Жинько [tIT]
Очень бы хотелось. У нас на работе практически все проекты используют MSSQL (так уж исторически сложилось). До этого (когда с MySQL работал) постоянно пользовался DBSimple. А вот сейчес лишен такой радости. Думаю не только мне приходится работать с MSSQL, да к тому же поддкржка этой СУБД поднимет рейтинг библиотеки.
Back to top
View user's profile Send private message
Дмитрий Котеров
Администратор



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


PostPosted: Wed Jan 31, 2007 12:27 am (спустя 4 дня 12 часов 9 минут)
   Post subject:
Reply with quote


М

Ветка выделена в отдельную тему «Нерелевантно.»,
расположенную в форуме Мусоропровод (31 Января 2007, 00:27).
Back to top
View user's profile Send private message Send e-mail
Дмитрий Котеров
Администратор



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


PostPosted: Mon Feb 05, 2007 12:36 am (спустя 5 дней 8 минут)
   Post subject:
Reply with quote


М

Ветка выделена в отдельную тему «DbSimple: мысли имеют право на существование, но нерелевантны»,
расположенную в форуме Конструктор (05 Февраля 2007, 00:36).
Back to top
View user's profile Send private message Send e-mail
slmark
Участник форума



Joined: 09 Aug 2006
Posts: 20
Карма: 0
   поощрить/наказать

Location: Минск, Беларусь

PostPosted: Thu Feb 22, 2007 9:55 am (спустя 17 дней 9 часов 19 минут; написано за 1 минуту 13 секунд)
   Post subject:
Reply with quote

Здравствуйте.
Столкнулся соследующей проблемой. Скрипт
Code (php): скопировать код в буфер обмена
if (!@$DB->query('INSERT INTO ?_users SET username=?', $name)) {
  echo (www.php.net/echo) 'Такой пользователь уже существует, попробуйте другое имя';
}
Работает некорректно, в любом случае выдается сообщение "Такой пользователь уже существует, попробуйте другое имя".
Подскажите, в чем проблема.
Спасибо.
Back to top
View user's profile Send private message
Дмитрий Котеров
Администратор



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


PostPosted: Thu Feb 22, 2007 12:55 pm (спустя 2 часа 59 минут; написано за 32 секунды)
   Post subject:
Reply with quote

1. Какая база?
2. Попробуйте var_dump($DB->query('INSERT INTO ?_users SET username=?', $name)) и без собаки (может, там ошибка какая-то).
Back to top
View user's profile Send private message Send e-mail
Struchalin
Заглянувший



Joined: 17 Nov 2005
Posts: 17
Карма: 2
   поощрить/наказать


PostPosted: Thu Feb 22, 2007 4:09 pm (спустя 3 часа 14 минут; написано за 1 минуту 42 секунды)
   Post subject:
Reply with quote

slmark wrote:
Здравствуйте.
Столкнулся соследующей проблемой. Скрипт
Code (php): скопировать код в буфер обмена
if (!@$DB->query('INSERT INTO ?_users SET username=?', $name)) {
  echo (www.php.net/echo) 'Такой пользователь уже существует, попробуйте другое имя';
}
Работает некорректно, в любом случае выдается сообщение "Такой пользователь уже существует, попробуйте другое имя".
Подскажите, в чем проблема.
Спасибо.
Может просто не определена константа TABLE_PREFIX...
Back to top
View user's profile Send private message
slmark
Участник форума



Joined: 09 Aug 2006
Posts: 20
Карма: 0
   поощрить/наказать

Location: Минск, Беларусь

PostPosted: Thu Feb 22, 2007 4:45 pm (спустя 35 минут; написано за 1 минуту 45 секунд)
   Post subject:
Reply with quote

Дмитрий Котеров wrote:
1. Какая база?
-> MySQL
Дмитрий Котеров wrote:
2. Попробуйте var_dump($DB->query('INSERT INTO ?_users SET username=?', $name)) и без собаки (может, там ошибка какая-то).
-> int(0)
А запись в базу успешно добавлена.
Back to top
View user's profile Send private message
Дмитрий Котеров
Администратор



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


PostPosted: Fri Feb 23, 2007 2:37 am (спустя 9 часов 52 минуты; написано за 42 секунды)
   Post subject:
Reply with quote

Версия библиотеки точно самая последняя? В одной из старых как раз был баг с INSERT-ами...
Back to top
View user's profile Send private message Send e-mail
slmark
Участник форума



Joined: 09 Aug 2006
Posts: 20
Карма: 0
   поощрить/наказать

Location: Минск, Беларусь

PostPosted: Fri Feb 23, 2007 9:42 am (спустя 7 часов 4 минуты; написано за 1 минуту 49 секунд)
   Post subject:
Reply with quote

Скачал последнюю версию с сайта - не помогло. Сейчас (как альтернатива) empty($DB->error), но хотелось бы разобраться, почему не работаетвариант выше ...
Спасибо

з.ы.: Всех с 23 февраля! :)
Back to top
View user's profile Send private message
Guest






Карма: 388
   поощрить/наказать


PostPosted: Wed Feb 28, 2007 12:19 am (спустя 4 дня 14 часов 37 минут; написано за 3 минуты 3 секунды)
   Post subject:
Reply with quote

Библиотека очень классная!

Нашел одну вещь в описании, в примере использования ошибок и исключений
Code (php): скопировать код в буфер обмена
// Обратите внимание на "@"!
if (!@$DB->query('UPDATE tbl SET field=? WHERE id=1', $field)) {
  // Здесь идет реакция на ошибку, если она возникла.
  // Контекст ошибки можно получить через $DB->error.
  $DB->query('INSERT INTO tbl(id, field) VALUES(1, ?)', $field)
}
в данном случае, если при редактировании не изменяются никакие данные, то происходит вставка еще одной строки (если разумеется нету уникальных индексов при вставке)
из-за того, что изменений не происходит и query возвращает 0
наверное стоит обратить на это внимание в документации
Back to top
Дмитрий Котеров
Администратор



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


PostPosted: Wed Feb 28, 2007 1:20 am (спустя 1 час 48 секунд; написано за 1 минуту 20 секунд)
   Post subject:
Reply with quote

М-да, это большой облом, на самом деле. Значит, надо делать вначале INSERT (при условии наличия уникального индекса по id), а если он не прошел, тогда UPDATE. Сейчас подправлю доку.
Back to top
View user's profile Send private message Send e-mail
Nadir
Guest





Карма: 388
   поощрить/наказать


PostPosted: Thu Mar 01, 2007 7:38 am (спустя 1 день 6 часов 18 минут; написано за 1 минуту 8 секунд)
   Post subject: Монстрообразные конструктиции
Reply with quote

Добрый день!

Может есть у кого решение как обходить подобные монстрообразные конструкции и повысить читабельность кода
Code (php): скопировать код в буфер обмена
$_id = $DbManager->selectcell(
                                        "SELECT " .
                                        "   txt.?# AS ?# " .
                                        "FROM " .
                                        "   ?# txt " .
                                        "   INNER JOIN ?# nt ON ( nt.?# = txt.?# ) " .
                                        "WHERE " .
                                        "   nt.?# < txt.?# " .
                                        " AND ?# IN (?a) " .
                                        "ORDER BY " .
                                        "   nt.?# ASC " .
                                                "LIMIT 1",
                                        'id',
                                        'id',
                                        'questid',
                                        'id',
                                        'hits',
                                        'weight',
                                        'id',
                                        $_banned,
                                        'hits',
                                        GRANAT_TEXT_VOTE_TABLE,
                                        GRANAT_INT_VOTE_TABLE
                                );
Back to top
Константин Жинько [tIT]
Сотрудник «Лаборатории»



Joined: 12 Jun 2004
Posts: 2264
Карма: 106
   поощрить/наказать

Location: Москва

PostPosted: Thu Mar 01, 2007 1:27 pm (спустя 5 часов 48 минут; написано за 4 минуты 30 секунд)
   Post subject:
Reply with quote

Nadir wrote:
Code (php): скопировать код в буфер обмена
$_id = $DbManager->selectcell('
        SELECT txt.id
        FROM questid txt
          INNER JOIN id nt ON nt.hits = txt.weight
        WHERE nt.id < txt.?#
          AND hits IN (?a)
        ORDER BY nt.?# ASC
        LIMIT 1
        '
,
        $_banned,
        GRANAT_TEXT_VOTE_TABLE,
        GRANAT_INT_VOTE_TABLE
);
Как-то так.
Back to top
View user's profile Send private message
WingedFox
Профессионал



Joined: 29 Apr 2003
Posts: 4064
Карма: 269
   поощрить/наказать

Location: Питер

PostPosted: Thu Mar 01, 2007 2:39 pm (спустя 1 час 12 минут; написано за 1 минуту 35 секунд)
   Post subject:
Reply with quote

Я предпочитаю такой стиль:
Code (php): скопировать код в буфер обмена
$_id = $DbManager->selectcell(
       'SELECT txt.id
          FROM questid txt
    INNER JOIN id nt
            ON nt.hits = txt.weight
         WHERE nt.id < txt.?#
           AND hits IN (?a)
         ORDER BY nt.?# ASC
         LIMIT 1'

       ,$_banned,
       ,GRANAT_TEXT_VOTE_TABLE
       ,GRANAT_INT_VOTE_TABLE
);
Back to top
View user's profile Send private message
Никита Косолaпов
Участник форума



Joined: 08 Aug 2006
Posts: 172
Карма: 9
   поощрить/наказать

Location: Москва

PostPosted: Mon Mar 05, 2007 5:40 pm (спустя 4 дня 3 часа 7 секунд; написано за 20 минут 41 секунду)
   Post subject: DbSimple & SELECT со сложным WHERE
Reply with quote

Здравствуйте, уважаемые!
Возникла у меня такая проблема: необходимость формирования SQL-запросов вида:
Code (SQL): скопировать код в буфер обмена
SELECT field1, field2 FROM TABLE WHERE id=1 AND pid=2 AND gett=3
SELECT field1, field2 FROM TABLE WHERE id=1 AND gett=3
SELECT field1, field2 FROM TABLE WHERE pid=2 AND gett=3
то есть запросы разнятся только количеством условий в WHERE.
Есть ли возможность все эти запросы сделать через ОДИН шаблон в DbSimple?
т.е.
Code (php): скопировать код в буфер обмена
switch($sw){
case 1:
        $where = array (www.php.net/array)('id' => 1, 'pid' => 2, 'gett' => 3,);
break;
case 2:
        $where = array (www.php.net/array)('id' => 1, 'gett' => 3,);
break;
case 3:
        $where = array (www.php.net/array)('pid' => 2, 'gett' => 3,);
break;
}
$rows = $DB->select('
        SELECT field1, field2
        FROM table
        WHERE ?w
        '
, $where);
Основная проблема в том, что у меня нет поля, присутствующего во всех запросах, которое можно было бы поставить впереди всех, как в такой конструкции...
Code (php): скопировать код в буфер обмена
switch($sw){
case 1:
        $where = array (www.php.net/array)('id' => 1, 'pid' => 2, 'gett' => 3,);
break;
case 2:
        $where = array (www.php.net/array)('id' => 1, 'pid' => 2,);
break;
case 3:
        $where = array (www.php.net/array)('id' => 1, 'gett' => 3,);
break;
}
$rows = $DB->select('
        SELECT *
        FROM goods
        WHERE
                id = ?
          { AND pid = ? }
          { AND gett = ? }
    '
,
    $where['id'],
    (empty (www.php.net/empty)($where['pid'])? DBSIMPLE_SKIP : $where['pid']),
    (empty (www.php.net/empty)($where['gett'])? DBSIMPLE_SKIP : $where['gett']),
);
Впрочем, можно воспользоваться
Code (php): скопировать код в буфер обмена
$rows = $DB->select('
        SELECT *
        FROM goods
        WHERE
                1 = 1
          { AND id = ? }
          { AND pid = ? }
          { AND gett = ? }
    '
,
    (empty (www.php.net/empty)($where['id'])? DBSIMPLE_SKIP : $where['id']),
    (empty (www.php.net/empty)($where['pid'])? DBSIMPLE_SKIP : $where['pid']),
    (empty (www.php.net/empty)($where['gett'])? DBSIMPLE_SKIP : $where['gett']),
);
но так не очень удобно - лишний код...
Back to top
View user's profile Send private message Send e-mail
Дмитрий Котеров
Администратор



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


PostPosted: Tue Mar 06, 2007 1:51 am (спустя 8 часов 11 минут; написано за 1 минуту 6 секунд)
   Post subject:
Reply with quote

Никита Косолaпов wrote:
$rows = $DB->select('
        SELECT *
        FROM goods
        WHERE
                1 = 1
          { AND id = ? }
          { AND pid = ? }
          { AND gett = ? }
    ',
    (empty($where['id'])? DBSIMPLE_SKIP : $where['id']),
    (empty($where['pid'])? DBSIMPLE_SKIP : $where['pid']),
    (empty($where['gett'])? DBSIMPLE_SKIP : $where['gett']),
);
Это лучший вариант - вставка "1=1" в AND-условия (или "1=0" в OR-условия), чтобы следующий макроблок, начинающийся с AND, не вызывал синтаксическую ошибку. Более того, этот трюк приведен и в примерах статьи. К тому же это весьма читабельно - где Вы видите лишний код?
Back to top
View user's profile Send private message Send e-mail
Никита Косолaпов
Участник форума



Joined: 08 Aug 2006
Posts: 172
Карма: 9
   поощрить/наказать

Location: Москва

PostPosted: Tue Mar 06, 2007 12:15 pm (спустя 10 часов 24 минуты; написано за 6 минут 32 секунды)
   Post subject:
Reply with quote

Сравните
Code (php): скопировать код в буфер обмена
$rows = $DB->select('
        SELECT field1, field2
        FROM table
        WHERE ?w
        '
, $where);
и
Code (php): скопировать код в буфер обмена
$rows = $DB->select('
        SELECT *
        FROM goods
        WHERE
                1 = 1
          { AND id = ? }
          { AND pid = ? }
          { AND gett = ? }
    '
,
    (empty (www.php.net/empty)($where['id'])? DBSIMPLE_SKIP : $where['id']),
    (empty (www.php.net/empty)($where['pid'])? DBSIMPLE_SKIP : $where['pid']),
    (empty (www.php.net/empty)($where['gett'])? DBSIMPLE_SKIP : $where['gett']),
);
К тому же - если у меня общее количество полей, используемых в WHERE - десятка два-три, а в каждом варианте запроса используется от силы три-четыре поля?
И почему плейсхолдер ?a - разворачивающий ассоциативный массив в строку '`key1`="val1", `key2`="val2", `key3`="val3"' - существовать может, а плейсхолдеры, разворачивающие тот же ассоциативный массив в строку '`key1`="val1" AND `key2`="val2" AND `key3`="val3"' или '`key1`="val1" OR `key2`="val2" OR `key3`="val3"' - не существуют?
Back to top
View user's profile Send private message Send e-mail
Дмитрий Котеров
Администратор



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


PostPosted: Tue Mar 06, 2007 5:56 pm (спустя 5 часов 41 минуту; написано за 3 минуты 13 секунд)
   Post subject:
Reply with quote

Потому что:
1. AND или OR - как определить?
2. Почему именно =? Почему не LIKE или <=?
3. Второй вариант запроса более читабельный - сразу видно, во что он может потенциально развернуться.

Короче говоря, хотите, чтобы массив преобразовывался в серию AND-ов - напишите функцию для этого и конкатенируйте ее с WHERE. Это не задача библиотеки по любому. Более того, когда вы напишете эту функцию, вы с удивлением обнаружите, что в нее надо добавить также поддержку разных других операторов помимо "=", например: <=, IN(), NOT IN() и т.д. И получится у Вас уже целый фреймворк для динамического построения WHERE-условий (а в совокупности с функциями для построения еще и списка SELECT-колонок получите инструмент, похожий на ORM).
Back to top
View user's profile Send private message Send e-mail
Никита Косолaпов
Участник форума



Joined: 08 Aug 2006
Posts: 172
Карма: 9
   поощрить/наказать

Location: Москва

PostPosted: Tue Mar 06, 2007 6:15 pm (спустя 18 минут; написано за 14 секунд)
   Post subject:
Reply with quote

понял. Был не прав :)
Back to top
View user's profile Send private message Send e-mail
Гриша
Заглянувший



Joined: 26 Oct 2006
Posts: 12
Карма: 0
   поощрить/наказать


PostPosted: Wed Mar 21, 2007 3:22 pm (спустя 14 дней 21 час 6 минут; написано за 8 минут 10 секунд)
   Post subject:
Reply with quote

Добрый день.
Перешёл я тут на PHP5 и обновил денвер на последнюю пятую базу :)
Базы сайтов я через INSERT не переносил, просто скопировал папку MySQL/DATA (или как там она)

теперь при запуске ранее работавшего скрипта запросе выдаёт такую штуку

SELECT id AS ARRAY_KEY, field FROM table WHERE name LIKE '%имя%'
  -- error #1267: Illegal mix of collations (cp1251_general_ci,IMPLICIT) and (latin1_swedish_ci,COERCIBLE) for operation 'like' at ... line 28

простое гугление дало такой результат:
ru-mambo.ru/content/view/780/25/
там для Мамбы написано добавить строчку
$this->_cursor = mysql_query( "set names 'cp1251';", $this->_resource );

А русский вывод идёт весь из ????, хотя в бд на всех таблицах стоит cp1251_general_ci, и всё русское нормально в ней видно через phpMyAdmin и прочие менеджеры.
Но в настройках сервера через phpMyAdmin видно: character set system: utf8 - может в этом дело?

что можно сделать для DBSimple или с Денвером?

PHP Version 5.1.6
MySQL 4.1.16-max
Back to top
View user's profile Send private message
Гриша
Заглянувший



Joined: 26 Oct 2006
Posts: 12
Карма: 0
   поощрить/наказать


PostPosted: Wed Mar 21, 2007 3:59 pm (спустя 36 минут; написано за 2 минуты 26 секунд)
   Post subject:
Reply with quote

Временный ответ нашёл в соседней ветке -
forum.dklab.ru/viewtopic.php?p=131803#131803

Приведённые там варианты действительно помогают, но поставленный Юpием Насрeтдиновым вопрос остаётся.
Отправлять запрос вручную неинтересно :)
Может можно встроить что нибудь типа character set system = character set database
Back to top
View user's profile Send private message
Игорь Добрый
Guest





Карма: 388
   поощрить/наказать


PostPosted: Thu Mar 22, 2007 9:32 am (спустя 17 часов 32 минуты; написано за 2 минуты 44 секунды)
   Post subject: Пустой пароль
Reply with quote

Доброе утро, всем!
Дмитрий, при указании в DSN пустого пароля, в скрипте происходит генерация Notice по поводу отсутствия элемента массива $p['pass'] (файл Mysql.php) - нужно учитывать, что пароль может быть пустым.
Back to top
Дмитрий Котеров
Администратор



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


PostPosted: Fri Mar 23, 2007 7:12 pm (спустя 1 день 9 часов 40 минут; написано за 31 секунду)
   Post subject:
Reply with quote

Поставьте двоеточие после логина, не указывая пароль. А еще лучше - опубликуйте здесь патч, решающий проблему.
Back to top
View user's profile Send private message Send e-mail
Guest






Карма: 388
   поощрить/наказать


PostPosted: Mon Mar 26, 2007 4:41 pm (спустя 2 дня 21 час 28 минут; написано за 9 минут 48 секунд)
   Post subject:
Reply with quote

Code (php): скопировать код в буфер обмена
    (empty (www.php.net/empty)($where['id'])? DBSIMPLE_SKIP : $where['id']),
    (empty (www.php.net/empty)($where['pid'])? DBSIMPLE_SKIP : $where['pid']),
    (empty (www.php.net/empty)($where['gett'])? DBSIMPLE_SKIP : $where['gett']),
);
может написать так
Code (php): скопировать код в буфер обмена
        function dbw($val) { return (empty (www.php.net/empty)($val) ? DBSIMPLE_SKIP : $val); }

        //
        dbw($where['id']), dbw(where['pid']), dbw(where['gett']));
        //
 
???
Back to top
Дмитрий Котеров
Администратор



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


PostPosted: Tue Mar 27, 2007 11:48 pm (спустя 1 день 7 часов 7 минут)
   Post subject:
Reply with quote


М

Ветка выделена в отдельную тему «Не относится к теме топика»,
расположенную в форуме Мусоропровод (27 Марта 2007, 23:48).
Back to top
View user's profile Send private message Send e-mail
Антон Макаренко
Участник форума



Joined: 05 Feb 2004
Posts: 374
Карма: 31
   поощрить/наказать

Location: Киев

PostPosted: Thu Mar 29, 2007 4:23 pm (спустя 1 день 16 часов 35 минут; написано за 6 минут 40 секунд)
   Post subject:
Reply with quote

При запросе не очищается контекст ошибки после предыдущих.
Code (php): скопировать код в буфер обмена
// ...
$DB->select('DESCRIBE ?#', 'test');
/*
запрос отработал, вернул ошибку
контекст ошибки записался $DB->errmsg, $DB->error
*/

// ...
$DB->query('REPLACE INTO some_table SET ?a', $row);
/*
Этот запрос отработал нормально, вернул количество затронутых строк
Однако, как показывает дебаг, контекст ошибки остался еще от прошлого запроса
*/
Возможно, это касается определенной последовательности запросов, поэтому приведу лог в моем случае.
Code (SQL): скопировать код в буфер обмена
DESCRIBE `test`
  -- error #1146: Table 'ait_common_web.test' doesn't exist at ... __meta.php line 136
  -- 3 ms; returned ''
SELECT f.field_id AS ARRAY_KEY, f.* FROM meta_fields f WHERE f.table_id<>11
  -- 1 ms; returned 39 row(s)
REPLACE INTO meta_vocabularies SET `field_id`='44', `field_id_pk`='28', `field_id_options`='29'
  -- 16 ms; returned '2'
 
Делаю проверку контекста ошибки после запроса REPLACE INTO, а возвращается еще старый от DESCRIBE.
Back to top
View user's profile Send private message Send e-mail
Дмитрий Котеров
Администратор



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


PostPosted: Thu Mar 29, 2007 11:22 pm (спустя 6 часов 58 минут; написано за 4 секунды)
   Post subject:
Reply with quote

Антон Макаренко wrote:
Делаю проверку контекста ошибки после запроса REPLACE INTO
Как именно?
Back to top
View user's profile Send private message Send e-mail
Дмитрий Котеров
Администратор



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


PostPosted: Thu Mar 29, 2007 11:31 pm (спустя 8 минут; написано за 32 секунды)
   Post subject:
Reply with quote

На самом деле, и правда, есть такая проблема. Я закоммитил в svn и выложил на dklab исправление, попробуйте его, пожалуйста.
Back to top
View user's profile Send private message Send e-mail
Антон Макаренко
Участник форума



Joined: 05 Feb 2004
Posts: 374
Карма: 31
   поощрить/наказать

Location: Киев

PostPosted: Fri Mar 30, 2007 9:36 am (спустя 10 часов 5 минут; написано за 3 минуты 16 секунд)
   Post subject:
Reply with quote

Спасибо, исправление помогло.

Проверяю я по errmsg:
Code (php): скопировать код в буфер обмена
$DB->query('...');
if ($DB->errmsg)
{
        // обрабатываем ошибку, используя $DB->error['message']
}
Расчитывая на то, что перед запросом $DB->errmsg присваивается NULL.
Back to top
View user's profile Send private message Send e-mail
Display posts from previous:   
Post new topic   Reply to topic All times are GMT + 3 Hours
Goto page Previous  1, 2, 3, ... 13, 14, 15  Next
Page 2 of 15    Email to a Friend.
Post a reply
Username
Subject
Господа спамеры и оптимизаторы!

Вы можете даже и не пытаться вставлять в текст поста ссылки - они все равно автоматически удаляются (вернее, тэги <a> заменяются на тэги <u>).

Но если не поверите и все же попытаетесь - как только увидите, что все безрезультатно, удалите свой пост, пожалуйста. Модераторы тоже люди, нехорошо, если они погрязнут в тоннах спама.
     

Disable BBCode in this post
Disable Smilies in this post
    HTML is OFF
BBCode is ON
Smilies are ON
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