database.query准备语句绑定不起作用

时间:2015-12-11 05:19:01

标签: java android sqlite prepared-statement

我准备好这份准备工作

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

它不再起作用了。

有没有人知道它为什么。如果你有,请给我一些解释。提前感谢你。

2 个答案:

答案 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)是字符串值,所以这里是比较情况下的类型不匹配。 不工作的查询 - > “长度(?)= ”,//这里是问题点