do_replace() не работает?

При попытке ATK4 я обнаружил проблему:

$this->api->db->dsql()->table('person')->set('id', 1)->set('name', 'Test user')->do_replace();

Это не работает. Затем я посмотрел немного глубже в источнике ATK4 и нашел в /opt/ipism/www/atk4/lib/DB/dsql.php строки

public $sql_templates=array(
    'select'=>"select [options] [field] [from] [table] [join] [where] [group] [having] [order] [limit]",
    'insert'=>"insert [options_insert] into [table_noalias] ([set_fields]) values ([set_values])",
    'replace'=>"replace [options_replace] into [table_noalias] ([set_fields]) values ([set_values])",
    'update'=>"update [table_noalias] set [set] [where]",
    'delete'=>"delete from  [table_noalias] [where]",
    'truncate'=>'truncate table [table_noalias]',
    'describe'=>'desc [table_noalias]',
);

После изменения строки замены на

    'replace'=>"replace into [table_noalias] ([set_fields]) values ([set_values])",

это сработало для меня (удалив options_replace и добавив ' s ' к set_value). Я использую последнюю версию из git с подключением к базе данных MySQL.

Но я не уверен, неправильно ли я использую do-replace()?

До свидания...

Кстати: есть ли способ отправить исправления, не создавая учетную запись на GitHub или где-то еще?

Редактировать: Вот вывод, если options_replace не удален из шаблона:

замените [options_replace] на значения `person` (`id`,`name`) ("1","John Doe") [:a_2,:a]

Ошибка приложения: сбой запроса к базе данных

Exception_DB, код: 0

Дополнительная информация:

  • pdo_error: SQLSTATE [42000]: синтаксическая ошибка или нарушение прав доступа: 1064 В синтаксисе SQL есть ошибка; проверьте руководство, соответствующее вашей версии сервера MySQL, чтобы найти правильный синтаксис для использования рядом с '[options_replace] значениями `person` (`id`,`name`) ('1'в строке 1
  • режим: заменить
  • Титулы:
    • : a: 1
    • : a_2: Джон Доу
  • запрос: замените [options_replace] на значения `person` (`id`,`name`) (:a,:a_2)
  • шаблон: замените [options_replace] на значения [table_noalias] ([set_fields]) ([set_values])

/opt/ipism/www/atk4/lib/DB/dsql.php:1519

Трассировки стека:
File ObjectStack Trace / opt / ipism / www / atk4 / lib / BaseException.php: 63 Exception_DBException_DB-> collectBasicData (Null) / opt / ipism / www / atk4 / lib / AbstractObject.php: 545 Exception_DBException_DB-> __construct () Query Failed ", Null) / opt / ipism / www / atk4 / lib / DB / dsql.php: 1519 sample_project_db_db_dsql_mysqlDB_dsql_mysql-> исключение (" Ошибка запроса базы данных ") /opt/ipism/www/atk4sl / DB . PHP: 1586 sample_project_db_db_dsql_mysqlDB_dsql_mysql-> Execute () / Opt / ipism / WWW / atk4 / Библиотека / DB / dsql.php: 1624 sample_project_db_db_dsql_mysqlDB_dsql_mysql-> заменить () / Opt / ipism / WWW / страницы / test.php: 40 sample_project_db_db_dsql_mysqlDB_dsql_mysql-> do_replace () / opt / ipism / www / atk4 / lib / AbstractObject.php: 306 sample_project_testpage_test-> init () / opt / ipism / www / atk4 / lib / ApiFrontend.php: 130 sample_projectFrontend-> add ("page_test", "test", "Content") /opt/ipism/www/atk4 / lib / ApiWeb.php: 428 sample_projectFrontend-> layout_Content () / opt / ipism / www / atk4 / lib / ApiFrontend.php: 39 sample_ projectFrontend-> addLayout ("Content") /opt/ipism/www/atk4 / lib / ApiWeb.php: 275 sample_projectFrontend-> initLayout () / opt / ipism / www / index.php: 15 sample_projectFrontend-> main ()

Примечание. Чтобы скрыть эту информацию от своих пользователей, добавьте $config['logger']['web_output']=false в файл config.php. Обратитесь к документации на "Регистратор" для альтернативных вариантов регистрации

1 ответ

Replace по своей природе аналогичен "insert", но вместо сбоя, когда первичный ключ дублируется, он заменяет значение.

  1. Пожалуйста, добавьте ->debug() к вашей строке перед do_replace и дайте мне вывод, который поможет мне понять, почему этот параметр нужно удалить.

  2. set_value, похоже, опечатка, я изменил ее и превратил в master: https://github.com/atk4/atk4/commit/24b20865b9e3345a8e7504dfb68b7ef96335009e

  3. лучший способ отправить изменения - создать запрос на извлечение. Наилучший способ сообщить о проблемах - это "проблемы" в github.

Другие вопросы по тегам