У меня есть два условия для моего предложения where, и я пишу его внутри массива. Ниже приведен мой код:
public function getRelatedNews($id, $news_id) {
$args = array(
'fields' => array(
'news.id',
'news.title',
'news.story',
'news.image',
'news.status',
'news.added_date',
'categories.title AS news_category',
'(SELECT users.full_name FROM users WHERE id = news.added_by) as author',
),
'where' => array(
'news_category' => $id
'news.id' !=> $news_id
),
'join' => 'LEFT JOIN categories on news.news_category = categories.id',
'limit' => array(0, 2)
);
return $this->select($args);
}
Поскольку я пишу условие внутри массива, я использую => для равенства, но для второго условия я не могу использовать !=>. Что я должен использовать для неравных условий, если они находятся внутри массива, как указано выше?
У меня есть такой запрос SELECT:
final protected function select($args = array(), $is_die = false){
try {
$this->sql = "SELECT ";
if (isset($args['fields'])) {
if (is_array($args['fields'])) {
$this->sql .= implode(', ', $args['fields']);
} else {
$this->sql .= $args['fields'];
}
} else {
$this->sql .= " * ";
}
$this->sql .= " FROM ";
if (!isset($this->table) || empty($this->table)) {
throw new Exception("Table not set");
}
$this->sql .= $this->table;
/*Join Query*/
if (isset($args['join']) && !empty($args['join'])) {
$this->sql .= " ".$args['join'];
}
/*Join Query*/
if (isset($args['where']) && !empty($args['where'])) {
if (is_array($args['where'])) {
$temp = array();
foreach ($args['where'] as $column_name => $value) {
$str = $column_name." = :".$column_name;
$temp[] = $str;
}
$this->sql .= " WHERE ".implode(' AND ', $temp);
} else {
$this->sql .= " WHERE ".$args['where'];
}
}
/*Group*/
if (isset($args['group_by']) && !empty($args['group_by'])) {
$this->sql .= " GROUP BY ".$args['group_by'];
}
/*Group*/
/*Order*/
if (isset($args['order_by']) && !empty($args['order_by'])) {
$this->sql .= " ORDER BY ".$args['order_by'];
} else {
$this->sql .= " ORDER BY ".$this->table.".id DESC";
}
/*Order*/
/*Limit*/
if (isset($args['limit']) && !empty($args['limit'])) {
if (is_array($args['limit'])) {
$this->sql .= " LIMIT ".$args['limit'][0].",".$args['limit'][1];
} else {
$this->sql .= " LIMIT ".$args['limit'];
}
}
/*Limit*/
$this->stmt = $this->conn->prepare($this->sql);
if (isset($args['where']) && !empty($args['where']) && is_array($args['where'])) {
foreach ($args['where'] as $column_name => $value) {
if (is_int($value)) {
$param = PDO::PARAM_INT;
} elseif (is_bool($value)) {
$param = PDO::PARAM_BOOL;
} elseif (is_null($value)) {
$param = PDO::PARAM_NULL;
} else {
$param = PDO::PARAM_STR;
}
if ($param) {
$this->stmt->bindValue(":".$column_name, $value, $param);
}
}
}
if ($is_die) {
echo $this->sql;
debugger($this->stmt);
}
$this->stmt->execute();
$data = $this->stmt->fetchAll(PDO::FETCH_OBJ);
return $data;
} catch (PDOException $e) {
error_log(
date('Y-m-d h:i:s A').", Select Query: ".$e->getMessage()."\r\n"
, 3, ERROR_PATH.'/error.log');
return false;
} catch (Exception $e) {
error_log(
date('Y-m-d h:i:s A').", General: ".$e->getMessage()."\r\n"
, 3, ERROR_PATH.'/error.log');
return false;
}
}
php-фреймворк?
установить 'news.id <>' => $news_id
Как выглядит $this->select()?
@Abutouq 'news.id <>' => $news_id не работает.
@DarkBee, можешь ответить?
@michalhosna У меня есть этот код в ООП, это просто функция выбора.
@Алиша, а можешь опубликовать здесь функцию? На ваш вопрос нельзя ответить должным образом, если мы не знаем, чего ожидает функция.
Вам нужно будет как минимум показать метод select().
@michalhosna Я обновил свой вопрос.
@Qirel Я обновил свой вопрос. Пожалуйста, посмотрите.






У вас есть !=> в настоящее время, если вы не хотите, чтобы было равно, должно быть !=
Мы не можем использовать != внутри массива.
Вы должны использовать свой cide вот так
public function getRelatedNews($id, $news_id) {
$args = array(
'fields' => array(
'news.id',
'news.title',
'news.story',
'news.image',
'news.status',
'news.added_date',
'categories.title AS news_category',
'(SELECT users.full_name FROM users WHERE id = news.added_by) as author',
),
'where' => array(
'news_category' => $id
'news.id !=' => $news_id
),
'join' => 'LEFT JOIN categories on news.news_category = categories.id',
'limit' => array(0, 2)
);
return $this->select($args);
}
Чтобы отразить мой комментарий, измените структуру данных на это:
public function getRelatedNews($id, $news_id) {
$args = array(
'fields' => array(
'news.id',
'news.title',
'news.story',
'news.image',
'news.status',
'news.added_date',
'categories.title AS news_category',
'(SELECT users.full_name FROM users WHERE id = news.added_by) as author',
),
'where' => array(
'news_category' => $id
'news.id' => array('value' => $news_id, 'operator' => '!=', ),
),
'join' => 'LEFT JOIN categories on news.news_category = categories.id',
'limit' => array(0, 2)
);
return $this->select($args);
}
Теперь вам все еще нужно изменить свой метод select на основе новых данных.
foreach ($args['where'] as $column_name => $data) {
/**
Transform to array when only value is passed
Use default operator = when this is the case
**/
if (!is_array($data)) {
$data = array(
'value' => $data,
'operator' => '=',
);
}
$str = $column_name.' '.$data['operator'].' :'.str_replace('.', '_', $column_name);
$temp[] = $str;
}
И измените привязки значений:
foreach ($args['where'] as $column_name => $data) {
$value = is_array($data) ? $data['value'] : $data; //check if passed where statement was an array, fetch value if so
if (is_int($value)) {
$param = PDO::PARAM_INT;
}elseif (is_bool($value)) {
$param = PDO::PARAM_BOOL;
}elseif (is_null($value)) {
$param = PDO::PARAM_NULL;
}else {
$param = PDO::PARAM_STR;
}
if ($param) {
$this->stmt->bindValue(":".str_replace('.', '_', $column_name), $value, $param);
}
}
Не повлияет ли это на мои предыдущие функции, написанные для запроса SELECT?
Нет, потому что код преобразует каждое переданное значение в where в массив, если нет, с = в качестве оператора
это не помогло, а также повлияло на мой предыдущий код, написанный для запроса SELECT.
Во-первых, если я использую предоставленный вами код, я не смогу попасть внутрь администратора, потому что я использовал запрос SELECT, а во-вторых, я получаю это SQL после использования кода SELECT news.id, news.title, news.story, news.image, news.status, news.added_date, categories.title AS news_category, (SELECT users.full_name FROM users WHERE id = news.added_by) as author FROM news LEFT JOIN categories on news.news_category = categories.id WHERE news_category = :news_category AND news.id = :news.id ORDER BY news.id DESC LIMIT 0,2, и, как вы можете видеть, запрос говорит news.id = :news.id
Тогда вы что-то делаете, посмотрите демо, которое я опубликовал с выводом SELECT news.id, news.title FROM news WHERE news.title = :news.title AND news.id != :news.id
Давайте продолжить обсуждение в чате.
Вам нужно будет разделить свое значение на подмассив, например.
'news.id' => [ 'value' => $news_id, 'operator' => '!=',],