GM2mars
@GM2mars

Условие выборки PDO MySQL из $.ajax?

Столкнулся с такой странной проблемой. В стандартной ситуации, когда я делаю запрос с клиента посредством $.ajax() на сервер, что бы получить данные, происходит ошибка из-за условия WHERE.

Теперь по порядку:
Получаю запрос, если $config не указан, то беру дефолтный.
Если в конфиге категория больше нуля (то есть указана определенная категория), то создаю условие 'WHERE id_category='.$config["category"]; Иначе условие пусто.
Делаю выборку данных, передав соединение с БД, массив конфига и условие.
Если есть данные, то возвращаем json строку в виде массива [данные, количество].

Контроллер на сервере, в классе Articles (статьи):
private $default_config=[
	"start"=>0,
	"count"=>50,
	"order_by"=>'id',
	"category"=>0,
	"ajax"=>false,
];

public function getArticles($config) {
	if (!$config) $config=$this->default_config;
	if ($config["category"]>0) $where='WHERE id_category='.$config["category"];
	else $where="";
	$data=Article\Model::getArticleData($this->db, $config, $where);
	if (empty($data[1])) {echo json_encode(["", 0]); return;}
	else echo json_encode($data);
}


Делаем обычный запрос, вставляем условие, сортировку и лимит, получившийся результат отдаем.
Модель на сервере Article\Model:
public function getArticleData($db, $config, $where) {
	$query=$db->query('SELECT * FROM articles '.$where.' ORDER BY '.$config["order_by"].' DESC LIMIT '.$config["start"].', '.$config["count"]);
	while ($row=$query->fetch()) {
		$result[$row['id']]=$row;
	}
	$count=count($result);
	return [$result, $count];
}


Передаем массив параметров config на сервер.
Код запроса на клиенте (важные части класса):
"config": {
	"start" : 0,
	"count" : 50,
	"order_by" : 'id',
	"category" : 9,
	"ajax": true,
	"action": "getArticles"
},
"get_Articles": function() {
	var self=this;
	$.ajax({
		type: 'POST',
		url: 'actions.php',
		data: self.config,
		dataType: 'json',
		success: function(res) {
			console.log(res);
		},
		error: function(res) {
			console.log(res);
		}
	})
},

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

Если мы на сервере поставим в $default_config->category=9, то все заработает, данные буду получены из базы данных. Причем условие что от сервера что от клиента будет 'WHERE id_category=9'.

Конфигурация PDO:
return new PDO('mysql:host='.$host.';dbname='.$dbname, $user, $pass, array(
	PDO::MYSQL_ATTR_INIT_COMMAND=>"SET NAMES utf8",
	PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC)
);

Подскажите в чем проблема?

p.s. Подготовленные запросы с $query=$db->prepare(SELECT ... LIMIT :start) $query->bindParam(':start', $config["start"]) тоже не работают.
  • Вопрос задан
  • 3157 просмотров
Решения вопроса 1
@victimofbrainlessness
Для начала убедитесь что конечный SQL запрос правильный
Проверьте PDO::errorInfo после выполнения
сто к одному виноват [start] => 50, у вас есть больше 50 записей с категорией 1?
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
metamorph
@metamorph
Это фреймворк какой-то?

Полагаю, проблема вот тут:
public function getArticles($config)

Вы изначально предполагаете, что в метод будет передан массив, что же там на самом деле - из Вашего кода непонятно. Проверьте, что обработчик запроса (actions.php) действительно передает туда что надо (в чем лично я сильно сомневаюсь)
Ответ написан
GM2mars
@GM2mars Автор вопроса
Это самописный движок.
В $config приходит все правильные значения.
Это от сервера: Array ( [start] => 0 [count] => 50 [order_by] => id [category] => 0 [ajax] => )
Это от клиента: Array ( [start] => 50 [count] => 50 [order_by] => id [category] => 1 [ajax] => true [action] => getArticles )
При:
public function getLinks($json, $config) {
	if (!$config) $config=$this->default_config;
	print_r($config);
	...
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы