メソッドを使用して 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;
}
}