好的, 我在一个名为week-select的页面上有一个多选下拉列表,它的选择通过ajax传递到我的php页面。
我可以很好地获取数据,但是当查询运行时,它无法正确完成。
我有这个:
//Deal with Week Array
$weekFilter = $_GET['week']; /*This is fine, if it's 1 week the query works great (weeks are numbered 12-15), but if it is 2 weeks the result is formatted like this 12-13 or 13-14-15 or whichever weeks are selected*/
$weekFilter = str_replace("-",",",$weekFilter); /*This works to make it a comma separated list*/
.../*I deal with other variables here, they work fine*/
if ($weekFilter) {
$sql[] = " WK IN ( ? ) ";
$sqlarr[] = $weekFilter;
}
$query = "SELECT * FROM $tableName";
if (!empty($sql)) {
$query .= ' WHERE ' . implode(' AND ', $sql);
}
$stmt = $DBH->prepare($query);
$stmt->execute($sqlarr);
$finalarray = array();
$count = $stmt->rowCount();
$finalarray['count'] = $count;
if ($count > 0) { //Check to make sure there are results
while ($result = $stmt->fetchAll()) { //If there are results - go through each one and add it to the json
$finalarray['rowdata'] = $result;
} //end While
}else if ($count == 0) { //if there are no results - set the json object to null
$emptyResult = array();
$emptyResult = "null";
$finalarray['rowdata'] = $emptyResult;
} //end if no results
如果我只选择一周,那么效果很好并显示相应的数据。
如果我选择多个选项(比如第12周期,第14周和第15周),它会运行查询,但只会显示第12周。
当我在SQL中手动输入查询时,我想象这个查询是如何进入的 - 它运行并显示相应的数据。因此,如果我将SELECT * FROM mytablename WHERE WK IN(12,14,15)放入其中,它就会得到我想要的。
我无法弄清楚为什么我的查询在这里没有正确执行。 有什么想法吗?
**编辑:在将数据传递给后端之前,我使用前端的javascript从多个选项中创建一个字符串。
答案 0 :(得分:1)
带有值的结果查询可能看起来像IN
中的单个值:
… WK IN ("12,14,15") …
为每个原子值使用一个占位符:
if ($weekFilter) {
$values = explode(",", $weekFilter);
$sql[] = " WK IN ( " . implode(",", array_fill(0, count($values), "?")) . " ) ";
$sqlarr = array_merge($sqlarr, $values);
}
或使用FIND_IN_SET
代替IN:
$sql[] = " FIND_IN_SET(WK, ?) ";
答案 1 :(得分:0)
我认为你不能将数组绑定到单个?
占位符。通常,您必须输入与数组中的元素一样多的?
值。
答案 2 :(得分:-1)
如果您的HTML正确并且您的周选择为name="week[]"
,那么您将获得一个带有$_GET['week'];
的数组,否则只有[]
它只会给您一个值。然后,你正在进行字符串替换,但它不是字符串。相反,试试这个:
$weekFilter = implode(',', $_GET['week']);