【问题标题】:Server error MySQL Error - 1064 [closed]服务器错误 MySQL 错误 - 1064 [关闭]
【发布时间】:2012-01-05 16:42:36
【问题描述】:

好吧,我不是最好的程序员,我想我会问这个问题,希望有人能发现错误,或者只是告诉我我走错了路。

我有一个 Flash Builder 网站,它正在尝试创建一个搜索函数来搜索我的 MYSQL 数据库,然后返回结果。

我已经包含了非空部分,以防用户没有在相关变量中输入任何数据。

但是我收到了这个错误 原因:服务器错误 MySQL Error - 1064: You have an error in your SQL syntax;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行 #0 的“wells AND sex LIKE female”附近使用正确的语法

这里是代码

public function searchClients($fname, $lname, $country, $town, $sex) {

$SQLStatment = "SELECT id, fname, lname, sex, country, town, dateofbirth, monthofbirth, yearofbirth FROM $this->tablename";
$WhereClause = "";
$where =" Where ";

if($fname != "NULL") {
            $WhereClause.= 'Fname LIKE '.$fname;
}         

if($lname != "NULL") {
 if($WhereClause != "") 
 {  
            $WhereClause.= ' AND lname LIKE ' .$lname;
 }
 else
 {
        $WhereClause = 'lname LIKE ' .$lname;
 }
}

if($country != "NULL") {     
if($WhereClause != "") 
 {  
            $WhereClause.= ' AND country LIKE ' .$country;
 }
 else 
 {
        $WhereClause = 'country LIKE ' .$country;
 }
}

if($town != "NULL") {
 if($WhereClause != "") 
 {  
            $WhereClause.= ' AND town LIKE ' .$town;
 }
 else
 {
        $WhereClause = 'town LIKE ' .$town;
 }
}    

if($sex != "NULL") {
 if($WhereClause != "")
 {  
            $WhereClause.= ' AND sex LIKE ' .$sex;
 }
 else
 {
        $WhereClause = 'sex LIKE ' .$sex;
 }
}    
$SQLStatment.= $where;
$SQLStatment.= $WhereClause;

    $stmt = mysqli_prepare($this->connection, $SQLStatment);
    $this->throwExceptionOnError();

     mysqli_stmt_execute($stmt);
    $this->throwExceptionOnError();

    $rows = array();

    mysqli_stmt_bind_result($stmt, $row->ID, $row->fname, $row->lname,  $row->sex, $row->country, $row->town, $row->dateofbirth, $row->monthofbirth, $row->yearofbirth);

    while (mysqli_stmt_fetch($stmt)) {
      $row->fname = ucfirst(substr($row->fname,0,1));
      $row->lname = ucfirst($row->lname);
       $row->town = ucfirst($row->town);
      $row->lname = (($row->fname) . " " . ($row->lname));
      $row->yearofbirth = GetAge($row->dateofbirth. '-' .$row->monthofbirth. '-' .$row->yearofbirth);
      $row->Pic_loc = "";
      $row->Pic_loc= "IMAGES/".($row->ID)."/image01.jpg";
      $rows[] = $row;
      $row = new stdClass();
      mysqli_stmt_bind_result($stmt, $row->ID, $row->fname, $row->lname,  $row->sex, $row->country, $row->town, $row->dateofbirth, $row->monthofbirth, $row->yearofbirth);
    }

    mysqli_stmt_free_result($stmt);
    mysqli_close($this->connection);

    return $rows;
}

对我来说看起来不错,但不起作用,有什么建议吗? 在代码中更准确地指出它的呻吟声是

if($town != "NULL") {
 if($WhereClause != "") 
 {  
            $WhereClause.= ' AND town LIKE ' .$town;
 }
 else
 {
        $WhereClause = 'town LIKE ' .$town;
 }
}    

if($sex != "NULL") {
 if($WhereClause != "")
 {  
            $WhereClause.= ' AND sex LIKE ' .$sex;
 }
 else
 {
        $WhereClause = 'sex LIKE ' .$sex;
 }
}    

只是觉得很奇怪,它并没有抱怨其他三个 if 子句,而是抱怨最后两个。

【问题讨论】:

    标签: php mysql flash-builder mysql-error-1064 amfphp


    【解决方案1】:

    where 子句应如下所示:

    $WhereClause .= ' AND sex LIKE "' . mysql_escape_string($sex).'"';
    

    您可以使用准备好的语句/PDO 来简化代码并保护应用程序免受 SQL 注入

    【讨论】:

    • 哇,它又快又正确,非常正确,因为我没有收到任何错误:) 谢谢伙计,希望我的测试能产生我想要的结果,再次感谢 :)
    【解决方案2】:

    你的字符串应该被引用。在 where 子句中进行以下更改:

    if($town != "NULL") {
         if($WhereClause != "") 
         {  
                    $WhereClause.= ' AND town LIKE "' .mysql_escape_string($town).'"';
         }
         else
         {
                $WhereClause = 'town LIKE "' .mysql_escape_string($town).'"';
         }
        }    
    
        if($sex != "NULL") {
         if($WhereClause != "")
         {  
                    $WhereClause.= ' AND sex LIKE "' .$sex.'"';
         }
         else
         {
                $WhereClause = ' sex LIKE "' .$sex.'"';
         }
        }  
    

    顺便说一句,你应该在你的价值观周围使用百分号和 Like

    【讨论】:

    • 我同意 Teez,给出第一个答案的人也是如此,但最终它解决了错误,但由于代码似乎忽略了我的 IF 并说我不能继续,因为变量为空!这就是我认为我正在删除空值的地方!
    【解决方案3】:

    首先,一个调试技巧——当您在运行中构建语句时,如果遇到无法立即发现的 SQL 错误,首先要做的是打印出构建的语句(并将其包含在你未来的 SO 帖子)。部分地,它看起来像:

    SELECT … lname LIKE wells AND sex LIKE female …
    

    从中,您可以看到值周围的引号丢失了——应该是:

    SELECT … lname LIKE 'wells' AND sex LIKE 'female' … -- quoting non-numeric is NOT optional in SQL
    

    因此,要让它运行,您只需添加单引号即可。但仍有两个问题,可能还有第三个问题。

    1. 这仍然行不通。我假设使用 LIKE 而不是 = 来进行子字符串匹配。因此,您需要在值周围添加百分号:lname LIKE '%wells%'
    2. 您已经在使用准备好的语句,您真的应该使用占位符(例如,lname LIKE ?)构建查询,然后以这种方式填写。这将为您处理转义,防止 SQL 注入。

    潜在的第三个问题是使用 LIKE 进行子字符串匹配的性能很糟糕。这种类型的匹配不能使用索引。您正在执行全表扫描。使用成熟的搜索解决方案(Sphinx、全文等)可以解决这个问题(但可能会增加更多工作)。

    【讨论】:

    • 感谢 derobert 的回复,我已经使用了 '%wells%' 部分,但由于我试图解决的错误而将其删除。如果所有部分都不为空,则该函数现在可以工作,但如果一个变量为 :( 所以回到我的绘图板上
    猜你喜欢
    • 2018-12-19
    • 1970-01-01
    • 1970-01-01
    • 2014-12-11
    • 2015-08-11
    • 2011-02-11
    • 2015-07-03
    • 1970-01-01
    • 2011-12-16
    相关资源
    最近更新 更多