我想知道在准备好的mysql语句中是否可以使用数学运算符作为变量?我已经写了下面的内容(尽管它不起作用,我得到"在非对象上调用成员函数bind_param()")。
$result = $mysqli->prepare("SELECT t.column FROM table t WHERE t.value ( ? ) ( ? );");
$result->bind_param('ss', $operator, $value);
$result->execute();
我正在使用它和if语句,根据是否在大于或小于值的情况下选中单选按钮来更改运算符值。如下所示。
if (isset($_POST["abovebelow"]) && $_POST["abovebelow"] == "Above"){
$operator = ">";
}
elseif (isset($_POST["abovebelow"]) && $_POST["abovebelow"] == "Below"){
$operator = "<";
}
elseif (!isset($_POST["abovebelow"])){
$operator = "=";
}
答案 0 :(得分:1)
您的查询字符串中只有2个变量但是您绑定了3个值,因此首先不是正确的。那么您不应该像这样添加运算符,最好这样做:< / p>
if (isset($_POST["abovebelow"]) && $_POST["abovebelow"] == "Above"){
$operator = ">";
}
elseif (isset($_POST["abovebelow"]) && $_POST["abovebelow"] == "Below"){
$operator = "<";
}
elseif (!isset($_POST["abovebelow"])){
$operator = "=";
}
$result = $mysqli->prepare("SELECT t.column FROM table t WHERE t.value".$operator." ? ;");
$result->bind_param($value);
$result->execute();
答案 1 :(得分:1)
简短的回答是,“不,你不能这样做。”
答案很长,“No, you can't do that.”除其他原因外,编译器必须能够解析完整的查询,这意味着它必须在解析时知道运算符。
Emil Borconi提出了一个很好的解决方法,您可以将操作符插入查询文本中,然后 进行准备。答案 2 :(得分:0)
不,这是不可能的。准备好的声明中的占位符仅允许在允许表达的位置。因此,您不能将占位符用于表名或列名,也不能将其用于运算符等语法元素。
如果需要动态替换这些内容,则需要在PHP中使用字符串操作,而不是使用预处理语句占位符。