-2

メソッドを使用して SQL クエリを作成し、それを返して使用します。

$query = $this->buildSearchQuery($searchParams);            
return $this->db->query($query);

残念ながら、これは私にエラーをスローします:

SQLSTATE[42000]: 構文エラーまたはアクセス違反: 1064 SQL 構文にエラーがあります。''SELECT * FROM 候補 WHERE 名 = ? AND surname = ?','Dante', 'Hickman' at line 1

これは、クエリを作成する以前のスクリプトの SQL 構文の失敗のように見えるため、検索していたので、使用する前にこの $query をダンプする簡単なことをしました。

これをダンプします:

"'SELECT * FROM candidates WHERE firstname = ? AND surname = ?','Dante', 'Hickman'" (81)

正しいのは、81 文字の文字列です。この後、これを変数の代わりに元のクエリに入れようとすると、次のようになります。

return $this->db->query('SELECT * FROM candidates WHERE firstname = ? AND surname = ?','Dante', 'Hickman'); 

この secod スクリプトは正しく実行されるため、クエリは正しく構築されているように見えますが、それでもエラーが発生します。何か不足していますか?

この問題の解決に役立つアドバイスがあれば幸いです。

ps そのクエリの構文は nette フレームワークのものですが、システムは同じである必要があります。

編集: buildSearchQuery() の追加

function buildSearchQuery($searchParams)
    {
        $column = "";
        $values = "";
        $col = "";
        $i=0;
        // Trim to make sure user doesn't enter space there
        if((trim($searchParams->firstname)))
        {
            $column .= "firstname,";
            $i++;
        }
        if((trim($searchParams->surname)))
        {
            $column .= "surname,";  
            $i++;
        }

        if((trim($searchParams->specialization)))
        {
            $column .= "specialization,";   
            $i++;
        }           
        if($searchParams->english !== NULL)
        {
            $column .= "english,";
            $i++;
        }           
        if($searchParams->german !== NULL)
        {
            $column .= "german,";
            $i++;
        }           
        if($searchParams->russian !== NULL)
        {
            $column .= "russian,";
            $i++;
        }           
        if($searchParams->french !== NULL)
        {
            $column .= "french,";
            $i++;
        }           
        if($searchParams->school !== NULL)
        {
            $column .= "school,";
            $i++;
        }

        if((trim($searchParams->registrationDate)))
        {
            $column .= "registrationDate";
            $i++;
        }
        if($i > 0)
        {
            // If number of columns is bigger then 0 (if user fill atleast one input)                   
            $columns = explode(",", $column);       
            // Create list of values for query (name of columns and values)
            foreach($columns as $c)
            {                                                   
                if (isset($searchParams->$c)) {     
                    $values .= "'".$searchParams->{$c}."', ";               
                    $col .= $c." = ? AND ";                 
                }                       
            }
            // Remove last "," and space
            $values = substr_replace($values, "", -2);          
            $col = substr_replace($col, "", -5);    
            $query = $col."',".$values;
            $query = "'SELECT * FROM candidates WHERE ".$query;         
            //$query = substr($query, 0, -1); //remove last char ( ' in this case)
            return $query;
        }
        else
        {
            $query = "SELECT * FROM candidates";
            return $query;
        }
    }
4

1 に答える 1