SQL查询未正确完成 - 不确定原因

时间:2013-05-01 17:34:04

标签: php html mysql sql

好的, 我在一个名为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从多个选项中创建一个字符串。

3 个答案:

答案 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']);