mysql — SQLSTATE [42000]: синтаксическая ошибка или нарушение прав доступа [PHP]

Я строю SQL-запрос с помощью метода, а затем возвращаю его и использую.

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

К сожалению, это выдает мне ошибку:

SQLSTATE [42000]: синтаксическая ошибка или нарушение прав доступа: 1064
ошибка в вашем синтаксисе SQL; проверьте руководство, которое соответствует вашему
Версия сервера MySQL для правильного синтаксиса для использования рядом с » SELECT * FROM
Кандидаты ГДЕ имя =? И фамилия =? ‘,’ Данте ‘,’ Хикман ‘в
строка 1

Я искал его, потому что это похоже на сбой синтаксиса SQL предыдущего скрипта, который строит запрос, поэтому я сделал простую вещь, я сбросил этот $ запрос, прежде чем использовать его.

Дамп верни это:

"'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 корректно работает, поэтому выглядит, что запрос построен правильно, но все равно ошибка. Я что-то упустил?

Я надеюсь на любой совет, который может помочь мне решить эту проблему.

постскриптум Синтаксис этого запроса взят из Nette Framework, но система должна быть такой же.

РЕДАКТИРОВАТЬ:
добавление 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;
}
}

-2

Решение

Комментарии выше верны, вы передаете строку в качестве единственного аргумента вместо нескольких аргументов query надеется.

Одним из возможных решений является создание массива и вызов метода с элементами массива в качестве аргументов (например, используя call_user_func_array). Вы можете однако сделать лучше.

Нетт \ База данных есть довольно мощный и он может построить запрос для вас. Когда вы передаете ассоциативный массив, как ["column1" => "value1", "column2" => "value2"] как единственный аргумент where метод, он создаст соответствующий WHERE column1 = 'value1' AND column2 = 'value2' пункт. И, конечно, он будет безопасно экранировать значения, чтобы предотвратить внедрение SQL.

Следовательно, вы можете упростить ваш код до следующего вида:

$columns = ["firstname", "surname", "specialization", "english", "german", "russian", "french", "school", "registrationDate"];
$conditions = [];
foreach ($columns as $c) {
if (isset($searchParams->$c) && trim($searchParams->$c) !== "") {
$conditions[$c] = $searchParams->{$c};
}
}
return $this->db->table('candidates')->where($conditions);

Нет необходимости в операторе if-else, так как когда массив пуст, NDB правильно не добавляет предложение WHERE.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]