【问题标题】:Number of variables doesn't match number of parameters - Yes they do变量数量与参数数量不匹配 - 是的
【发布时间】:2023-03-19 05:24:01
【问题描述】:

所以根据一个建议,我正在尝试包含准备好的语句。

但是 PHP 不接受我的代码。

$stmt = $link->prepare('SELECT COUNT(*) FROM `table` WHERE `company` = CONVERT( _utf8 \'?\' USING latin1 )  COLLATE latin1_german1_ci AND `password` = CONVERT( _utf8 \'?\' USING latin1 ) COLLATE latin1_german1_ci');
$stmt->bind_Param('ss',  $firmaP, $kennwP);
$firmaP = utf8_encode($_POST['company']);
$kennwP = utf8_encode($_POST['password']);
if ($stmt->execute()) {
  if($row = $stmt->fetch()) {
      echo "OK";
    }
    else
    {
      echo "NO";
    }
}

我明白了

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

而我在查询中有两个问号,在 bind_Param 中有两个变量。

如何解决?

编辑:用 ? 替换 \'?\'导致

致命错误:在非对象上调用成员函数 bind_param()

【问题讨论】:

  • 使用绑定参数时不要在查询中引用字符串参数;你离开绑定语句为你做这件事
  • 你没有引用参数。 db 引擎会这样做。
  • $firmaP$kennwP 绑定到语句时是否有值?
  • 我都试过了,结果一样。
  • convert 有可能根本不支持准备好的语句。也有一种严格的可能性,这里也不需要转换

标签: php mysqli


【解决方案1】:

不要引用你的?s如下:

$stmt = $link->prepare('SELECT COUNT(*) FROM `table` WHERE `company` = CONVERT( _utf8 ? USING latin1 )  COLLATE latin1_german1_ci AND `password` = CONVERT( _utf8 ? USING latin1 ) COLLATE latin1_german1_ci');
$firmaP = utf8_encode($_POST['company']);
$kennwP = utf8_encode($_POST['password']);
$stmt->bind_Param('ss',  $firmaP, $kennwP);
if ($stmt->execute()) {
  if($row = $stmt->fetch()) {
      echo "OK";
    }
    else
    {
      echo "NO";
    }
}

【讨论】:

  • 导致致命错误:在非对象上调用成员函数 bind_param()
  • +1。参数化查询的全部意义在于您不必引用字段。
  • @SDC 我被告知这是安全的。
  • @JackyRank 在尝试调用prepare() 后检查$link->error。这可能是一个奇怪的情况,CONVERT() 的语法会导致问题
  • @MichaelBerkowski 这是问号:“您的 SQL 语法有错误;请查看与您的 MySQL 服务器版本相对应的手册,以了解在 ' 附近使用的正确语法?使用 latin1 ) COLLATE latin1_german1_ci并且……”
猜你喜欢
  • 1970-01-01
  • 2020-10-27
  • 1970-01-01
  • 2016-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-20
相关资源
最近更新 更多