1

while trying ATK4 I've found a problem:

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

This is not working. Then I looked a little bit deeper in ATK4 source and found in /opt/ipism/www/atk4/lib/DB/dsql.php the lines

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]',
);

After changing the 'replace'-line into

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

it worked for me (removing the options_replace and appending a 's' to set_value). I'm using latest version from git with a MySQL database connection.

But I'm not sure, if I'm using 'do-replace()' in the wrong way?

ByE...

By the way: Is there a way to send fixes, without creating an account on GitHub or somewhere?

Edit: Here is the output if the options_replace isn't removed from the template:

replace [options_replace] into `person` (`id`,`name`) values ("1","John Doe") [:a_2, :a]

Application Error: Database Query Failed

Exception_DB, code: 0

Additional information:

  • pdo_error: SQLSTATE[42000]: Syntax error or access violation: 1064 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 '[options_replace] into `person` (`id`,`name`) values ('1' at line 1
  • mode: replace
  • params:
    • :a: 1
    • :a_2: John Doe
  • query: replace [options_replace] into `person` (`id`,`name`) values (:a,:a_2)
  • template: replace [options_replace] into [table_noalias] ([set_fields]) values ([set_values])

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

Stack trace:
File Object NameStack 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("Database Query Failed", Null) /opt/ipism/www/atk4/lib/DB/dsql.php:1519 sample_project_db_db_dsql_mysqlDB_dsql_mysql->exception("Database Query Failed") /opt/ipism/www/atk4/lib/DB/dsql.php:1586 sample_project_db_db_dsql_mysqlDB_dsql_mysql->execute() /opt/ipism/www/atk4/lib/DB/dsql.php:1624 sample_project_db_db_dsql_mysqlDB_dsql_mysql->replace() /opt/ipism/www/page/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()

Note: To hide this information from your users, add $config['logger']['web_output']=false to your config.php file. Refer to documentation on 'Logger' for alternative logging options

ATL
  • 25
  • 5
  • Looks like Romans just fixed this https://github.com/atk4/atk4/commit/24b20865b9e3345a8e7504dfb68b7ef96335009e :) – DarkSide Aug 20 '14 at 16:36
  • It doesn't work as long as **[options_replace]** is contained in the template. Maybe it's because **[options_replace]** is not defined or handled (like **[options_insert]** for example). – ATL Aug 21 '14 at 14:20

1 Answers1

0

Replace is similar to "insert" by it's nature, but instead of failing when primary key is duplicated, it replaces the value.

  1. Please add ->debug() to your line before do_replace and give me the output, which would help me understand why that parameter needs removing.

  2. set_value seems to be a typo, I have changed and committed it into master: https://github.com/atk4/atk4/commit/24b20865b9e3345a8e7504dfb68b7ef96335009e

  3. the best way to submit changes is by creating a pull request. The best way to report issues is through "issues" in github currently.

romaninsh
  • 10,606
  • 4
  • 50
  • 70
  • to 1: I've inserted the error output at bottom of my question. If I remove the **replace_options** from the template it works. I think, either it should be handled (like **options_insert**) or it should removed from the template. – ATL Aug 26 '14 at 09:52