Mysql错误'无效使用组功能'

时间:2015-06-15 22:46:40

标签: php mysql prepared-statement

我正在尝试使用下面的代码检查ID_REF字段中的ID少于2次。它是一个推荐应用程序,其中ID只能引用2个指令。干杯

enter image description here

CODE

 $stmt = $conex->prepare("SELECT id FROM tb_modules WHERE count(id_ref) < ? ORDER BY id DESC LIMIT 1");



                        $stmt->bind_param("s", $n);
                        $n = 2;

                        $stmt->execute();

                        $stmt->store_result();
                        $numrows = $stmt->num_rows;


                         $stmt->bind_result($id);

                        //$stmt->fetch();

                        $stmt->close();

                        //echo $id.' '.'oi';
                        while ($stmt->fetch()) {
                        echo $id;
                        }


                    }

3 个答案:

答案 0 :(得分:1)

您没有检查任何错误,这是完全糟糕的开发。您应首先确保您的prepare()实际上正在准备查询而不是失败......

$stmt = $conex->prepare("SELECT id FROM tb_modules WHERE count(id_ref) < ? ORDER BY id DESC LIMIT 1");
// now check
if(!$stmt) {
    die($conex->error); // or mysqli_error($conex);
} else {
    $stmt->bind_param('s', $n);
}

回到其他事项。您似乎正在尝试比较count(id_ref)这是一个数字( int )与$n也是int )但你试图把它作为一个字符串传递.....?

您需要将您的绑定更改为:

$stmt->bind_param('i', $n);

另请注意,在调用它之后,您无法设置$n变量....这将导致错误。

答案 1 :(得分:0)

执行以下操作:

var_dump($conex);
$stmt = $conex->prepare("SELECT id FROM tb_modules WHERE count(id_ref) < ? ORDER BY id DESC LIMIT 1");

var_dump($stmt)

这应该可以解释这个问题。 我打赌$stmt变量是bool或null。

答案 2 :(得分:0)

您的代码未检查prepare是否成功返回。

如果prepare遇到错误,则返回FALSE。而不是陈述对象。

布尔值为FALSE(来自prepare的返回值)没有方法/函数bind_param

  $stmt = $conex->prepare("...");
  if(!$stmt) {
      echo "error in prepare ". mysqli_error($conex) ;
  } else {
      // prepare returned a statement object so we can do a bind_param
      $stmt->bind_param(...);

要修复在准备中导致错误的SQL语句中的语法问题,请将关键字 WHERE 替换为关键字 HAVING 。< / p>

访问行时,将评估WHERE子句中的谓词(条件)。因此,在检查COUNT()中的那些条件时,聚合函数(例如WHERE)的结果将不可用。在之后之后,无法评估该条件/ em>访问行,并计算聚合函数。HAVING子句中的谓词(条件)稍后进行评估,因此在HAVING子句中引用聚合是有效的。

只是对SQL语句进行更改不太可能获得您正在寻找的结果。没有规范,我们只是猜测你想要返回什么。