我准备好这份准备工作
String [] selectionArgs = new String[]{level, col1, col1_value};
db.query(Table, null, //table & columns
level + " = ? AND " + //selection
"? != ? AND " +
"length(" + col1 + ") = " + col1.length, //**here is question point**
selectionArgs, // selectionArgs
null, null, "RANDOM()", // order by
Integer.toString(count)); // number of retrieve
请注意,长度为原始内联。不是用“?”它正在发挥作用。
但是当我将其更改为以下
时String [] selectionArgs = new String[]{level, col1, col1_value,
col1, Integer.toString(col1.length)}; //added for length
db.query(Table, null, //table & columns
level + " = ? AND " + //selection
"? != ? AND " +
"length(?) = ?", //**here is question point**
selectionArgs, // selectionArgs
null, null, "RANDOM()", // order by
Integer.toString(count)); // number of retrieve
它不再起作用了。
有没有人知道它为什么。如果你有,请给我一些解释。提前感谢你。
答案 0 :(得分:1)
您可以使用?
仅绑定文字值,而不是列名称等标识符。
因此? != ?
"col1", "col1_value"
args与'col1' != 'col1_value'
相同,且表达式始终为真。
length(?) = ?
"col1", "4"
与length('col1') = 4
相同,length(col1) = 4
也始终为真。但是在第一个表单中,您可以使用col1
来测试'col1'
列中值的长度,而不是文字$sql = "SELECT * FROM user where email = ? and password = ? LIMIT 1";
$result = $mysqli->prepare($sql);
$result->bind_param("ss", $email, $password);
/* execute query */
$result->execute();
//Now you can use $result variable like you used before
echo $result->num_rows;
,因此只有那些才有可能您感兴趣的行,以及它似乎有效的原因。
答案 1 :(得分:0)
正如我已经注意到您的查询,您使用 Integer.toString(col1)将您的Integer值转换为字符串,然后您尝试将此字符串值与Integer值lenght(? )。
您之前的查询正在运行,因为您没有在String中转换您的值。 length(col1)都将返回整数,col1.length也返回整数。
工作查询 - >“长度(”+ col1 +“)=”+ col1.length ,//这里是问题点
但在这种情况下,长度(?)返回整数,下一个“?”这是Integer.toString(col1)是字符串值,所以这里是比较情况下的类型不匹配。 不工作的查询 - > “长度(?)= ?”,//这里是问题点