Php语法帮助

Php语法帮助,php,sql,mysql,Php,Sql,Mysql,我正在开发一个搜索功能,四天前它还可以正常工作,现在它返回这个错误 您的SQL语法有错误;请查看与MySQL服务器版本对应的手册,以了解在第1行使用near'和state='AZ'的正确语法 这行的正确语法是什么 if($search_state !== "") { $query .="AND state = '" . $search_state . " ' " ; 整个部分是: $query = "SELECT id, name, contact, contact2, address1

我正在开发一个搜索功能,四天前它还可以正常工作,现在它返回这个错误

您的SQL语法有错误;请查看与MySQL服务器版本对应的手册,以了解在第1行使用near'和state='AZ'的正确语法

这行的正确语法是什么

if($search_state !== "") {

$query .="AND state =  '" . $search_state .  " ' " ;
整个部分是:

$query = "SELECT id, name, contact, contact2, address1, address2, city, state, postalcode, country, location, workphone, fax, email, webaddress, region, rail, food, forest, metal, bulk, chem, general, paper FROM companies_new WHERE dummy = '' ORDER BY state ASC ";

if($search_co !== "") {

$query .= "AND name LIKE '%" . $search_co ."%' ";

}


if($search_first !== "") {

$query .= "AND contact LIKE '%" .$search_first."%' ";

}

if($search_last !== "") {

$query .= "AND contact LIKE '%" .$search_last."%' ";

}

if($search_city !== "") {

$query .="AND city = ' " . $search_city . " ' ";

}

if($search_state !== "") {

$query .="AND state =  '" . $search_state .  " ' " ;

}

不能将
WHERE
子句的
连词放在
ORDER BY
之后。您的
ORDER BY
子句必须位于整个
WHERE
子句之后。

WHERE部分位于AND之前,这是错误的。这就是你想要的

$query = "SELECT id, name, contact, contact2, address1, address2, city, state, postalcode, country, location, workphone, fax, email, webaddress, region, rail, food, forest, metal, bulk, chem, general, paper FROM companies_new WHERE dummy = '' ";

if($search_co !== "") {

$query .= "AND name LIKE '%" . $search_co ."%' ";

}
...
$query .= " ORDER BY state ASC ";
此外,为了完整性起见,您可以使代码更易于阅读:

$query .= "AND name LIKE '%$search_co%' ";

因为字符串是双引号的

,所以需要将AND语句放在where之后,排序依据之前。 将sort_by移动到php的末尾(附加到查询字符串),它应该可以工作。

尝试以下操作:

$query = "SELECT id, name, contact, contact2, address1, address2, city, state, postalcode, country, location, workphone, fax, email, webaddress, region, rail, food, forest, metal, bulk, chem, general, paper FROM companies_new WHERE dummy = '' ";  

if($search_co !== "") {
    $query .= "AND name LIKE '%".$search_co."%' ";
}

if($search_first !== "") {
    $query .= "AND contact LIKE '%".$search_first."%' ";
}

if($search_last !== "") {
    $query .= "AND contact LIKE '%".$search_last."%' ";
}

if($search_city !== "") {
    $query .= "AND city = '".$search_city."' ";
}

if($search_state !== "") {
    $query .= "AND state = '". $search_state."' " ;
}

$query.= "ORDER BY state ASC"  
正如其他人所说,您的
orderby
语句必须排在最后。此外,在查询的
city=
部分中,城市名称周围有空格。虽然这是有效的SQL语法,但它只返回城市名称被空格包围的结果。我猜那不是你想要的

此外,您可能还需要在您的
订单中添加一些字段。现在,它将按州排序,但记录将按州随机返回。也许像

$query.= "ORDER BY state, city, name, id" 

最后,仅供参考,如果您没有仔细清理搜索输入,这种方法很容易受到SQL注入的影响

我认为这可能有效:

$query = "SELECT id, name, contact, contact2, address1, address2, city, state, postalcode, country, location, workphone, fax, email, webaddress, region, rail, food, forest, metal, bulk, chem, general, paper FROM companies_new ";

$conditions = array();

if(!empty($search_co)) {
    $conditions[] = "name LIKE '%" . $search_co ."%' ";
}

if(!empty($search_first)) {
    $conditions[] = "contact LIKE '%" .$search_first."%' ";
}

if(!empty($search_last)) {
    $conditions[] = "contact LIKE '%" .$search_last."%' ";
}

if(!empty($search_city)) {
    $conditions[] = "city = '" . $search_city . "' ";
}

if(!empty($search_state)) {
    $conditions[] = "state =  '" . $search_state .  "' " ;
}

if (count($conditions) > 0) {
    $query .= " WHERE " . implode(' AND ', $conditions);
}

$query .= " ORDER BY state ASC";
编辑:原来的版本用空了,应该已经过了!空的现在修好了

编辑2:这还假设您已经使用或类似的方法清理了变量

请注意,ORDER BY必须位于WHERE子句之后

获取数组并将其转换为元素之间具有指定字符串的字符串。因此,鉴于:

$myArray = array('A', 'B', 'C');
你能行

$myString = implode(' and ', $myArray);

这将把“A和B和C”放入
$myString

同样,单引号和双引号之间似乎有空格,这将使查询如下:state='AZ',这可能不是您想要的。您还可以使用以下语法避免PHP中的附加引号和连接:

$query .= " AND state = '$search_state' ";

当然,我必须提到,您应该清理输入以防止SQL注入。

他是对的:-)在$query中还可能有一些虚假的空格(如“”)。=“和state=”$搜索你的国家。" ' " ;是 啊这一条更好,因为它不会导致查询抛出语法错误,只会使它在静默中永远无法工作。而且你应该把你的长行分开,这样你(以及你要求阅读代码的人)就可以避免不断滚动的干扰。这是非常有用的建议。非常感谢。我在页面上使用了这个脚本。