0

我有这个从客户表返回行的 sql 语句。用户可以选择搜索他们想要输入的任何内容。我有这个工作,直到我尝试通过使用 bindValue 来防止 sql 注入。现在,除非用户将文本框留空,否则我无法返回任何结果。下面是我的代码。

模型

function searchMyCusts($field, $query){          
    $data = null;
    $msg = null;
    $status = null;

    $sth = $this->db->prepare("SELECT ".CustomerFields::ID.",".CustomerFields::FirstName.",".CustomerFields::LastName.",".CustomerFields::PhoneNumber." FROM ".CustomerFields::TableName." WHERE '$field' LIKE :query");

    $sth->bindValue(':query', $query);

    if ($sth->execute()){
        $status = "success";
        $msg = "Customer entry successfully altered";            
        $data = $this->smartFetchAll($sth);


    }else{
        $status = "error";            
        $msg = "An error occurred. :".$sth->errorInfo()[2];
    }

    $jsonData = json_encode($this->buildResponseArray($status, $msg, $data));        
    return $jsonData;
}

在最后的准备行中,我有传入的值。就像我说的那样,这一直有效,直到我尝试绑定查询变量。

我将不胜感激您可能有的任何见解。提前致谢!

问候

4

1 回答 1

1

我不知道它以前如何工作,但首先你需要改变

" WHERE '$field' LIKE :query"

" WHERE $field LIKE :query"

或者

" WHERE `$field` LIKE :query"

您不能在列名周围使用引号,因为它只是一个与:query模式进行比较的文字字符串。查询将起作用,但您不会返回任何行。要么什么都没有,要么倒勾。

其次$query,在准备之前应该包含所有必要的通配符。例如

$query = "%new%";

目前尚不清楚您的代码是否是这种情况

于 2013-05-11T21:09:58.850 回答