错误:mysqld_stmt_execute 的参数不正确

Posted

技术标签:

【中文标题】错误:mysqld_stmt_execute 的参数不正确【英文标题】:Error: Incorrect arguments to mysqld_stmt_execute 【发布时间】:2021-04-09 03:05:48 【问题描述】:

我正在做一个 nodeJs 项目,并为 mysql 数据库使用一个 npm 包 mysql2

MySql 配置:-

let mysql = MYSQL.createConnection(
  host: `$config.mysql.host`,
  user: `$config.mysql.user`,
  password: `$config.mysql.password`,
  database: `$config.mysql.db`,
);

当我使用查询时

async function getUsers (pageNumber)  // suppose pageNumber = 1
  const [result] = await mysql.execute(
   `SELECT * FROM user LIMIT ?,20;`,
    [pageNumber]
  );
  return result;

上面的代码工作正常。但是当我试图将任何数字与 pageNumber 相乘时,它会抛出错误 Error: Incorrect arguments to mysqld_stmt_execute

例如

async function getUsers (pageNumber)  // suppose pageNumber = 1
  pageNumber = pageNumber * 20; // here we multiply 20 with pageNumber (20 is the row limit)
  const [result] = await mysql.execute(
   `SELECT * FROM user LIMIT ?,20;`,
    [pageNumber]
  );
  return result;

上面的代码抛出错误。

注意:- pageNumber 的类型是数字而不是字符串。

请帮忙。

【问题讨论】:

你分享的第一个代码块适合你吗?因为我正在尝试重现该问题,但第一个问题对我产生了错误。 【参考方案1】:

这似乎是 MySQL 版本 8.0.22 中引入的错误,从 8.0.19 更新后我遇到了同样的错误。不确定原因或适当的解决方案,在此期间我将值映射到字符串,根据https://github.com/sidorares/node-mysql2/issues/1239#issuecomment-718471799,这似乎有效。

【讨论】:

【参考方案2】:

就像一辆越野车,像这样使用插值(是的,这是一种不好的做法,但你可以同时提出解决方案):

const [result] = await mysql.execute(
   `SELECT * 
    FROM user 
    LIMIT $pageNumber,20;` 
  );

并且,如果变量是字符串,则在插值周围放置 ' '

`SELECT * FROM user WHERE xname = '$x'  ;`

【讨论】:

这是一个糟糕的建议。使用插值完全消除了使用 execute 而不是 query 的好处。另外,在使用插值时,了解SQL injection 的危险非常重要。如果你走这条路,你应该知道如何减轻这种风险。

以上是关于错误:mysqld_stmt_execute 的参数不正确的主要内容,如果未能解决你的问题,请参考以下文章

php mysqi bind_param 变量数与准备好的语句中的参数数不匹配[重复]

正确的参数数

弧长的参方程表示形式

可以在C ++中使用动态分配的参数数创建函数吗?

python圆角三角形的参值

call_user_func_array() - 警告:mysqli_stmt::bind_param():变量数与准备语句中的参数数不匹配