我正在尝试使用下面的代码检查ID_REF字段中的ID少于2次。它是一个推荐应用程序,其中ID只能引用2个指令。干杯
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;
}
}
答案 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语句进行更改不太可能获得您正在寻找的结果。没有规范,我们只是猜测你想要返回什么。