我有这个sql语句,它返回来自customer表的行。用户可以选择搜索他们想要输入的内容。我有这个工作,直到我试图通过使用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;
}
在最后的准备行中,我传入了值。就像我说的那样,直到我尝试bindValue查询变量。
我很感激您的任何见解。提前谢谢!
此致
答案 0 :(得分:1)
我不知道它之前有什么用,但首先你需要改变
" WHERE '$field' LIKE :query"
到
" WHERE $field LIKE :query"
或
" WHERE `$field` LIKE :query"
您不能在列名称周围使用引号,因为它只是一个与:query
模式进行比较的文字字符串。查询将起作用,但您不会返回任何行。没有任何东西或后退。
其次$query
应该在准备之前包含所有必需的通配符。 E.g。
$query = "%new%";
目前尚不清楚您的代码是否属于