【问题标题】:Php Syntax HelpPHP 语法帮助
【发布时间】:2009-10-22 15:16:32
【问题描述】:

我正在开发一个搜索功能,四天前它运行良好,现在它返回此错误

您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的“AND 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 .  " ' " ;

}

【问题讨论】:

    标签: php sql mysql


    【解决方案1】:

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

    【讨论】:

    • 他是对的 :-) 你也可能在 $query .="AND state = '" 中有一些虚假的空格(比如“'”)。 $search_state 。 "'" ;
    • 是的。那个更好,因为它不会导致查询抛出语法错误,它只会让它默默地不工作。
    • 你应该打破你的长行,这样你(和你要求阅读你的代码的人)可以避免不断滚动的干扰。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      试试这个:

      $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"  
      

      正如其他人所说,您的order by 声明必须放在最后。此外,您在查询的 city = 部分中的城市名称周围有空格。虽然这是有效的 SQL 语法,但它只会返回城市名称被空格包围的结果。我猜这不是你想要的。

      此外,您可能还想在order by 中添加更多字段。现在,它将按状态排序,但记录会按状态随机返回。也许像

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

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

      【讨论】:

        【解决方案4】:

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

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

        当然我不得不提一下,你应该清理你的输入以防止 SQL 注入。

        【讨论】:

          【解决方案5】:

          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%' ";
          

          因为你的字符串是双引号

          【讨论】:

            【解决方案6】:

            我认为这可能有效:

            $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";
            

            编辑:原始版本使用空,它应该是 !empty。现在已经修复了。

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

            注意 ORDER BY 必须在 WHERE 子句之后。

            implode 接受一个数组并将其转换为一个字符串,元素之间具有指定的字符串。所以,给定:

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

            你可以的

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

            这会将“A and B and C”放入$myString

            【讨论】:

            • 这是非常有用的建议。谢谢你。我在页面上使用了这个脚本。
            猜你喜欢
            • 1970-01-01
            • 2016-04-22
            • 1970-01-01
            • 2021-06-10
            • 2016-11-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多