Определить, существует ли значение в ассоциативном массиве

1

Попытка определить, существует ли в массиве значение:

$course_id = 1;

$sessions_query = $db->prepare("SELECT session_id FROM sessions WHERE course_id=:course_id");
$sessions_query ->bindValue(':course_id', $course_id, PDO::PARAM_INT);
$sessions_query ->execute();
$sessions = $sessions_query ->fetch(PDO::FETCH_ASSOC);

$session_id = 1;

if (in_array($session_id, $sessions['session_id'])) {
    echo "Valid session";
}
else {
    echo "Invalid session";
}

Я знаю, что значение 1 находится в массиве сессий ['session_id'], потому что, когда я эхо-массив, я вижу это значение. Однако функция по-прежнему возвращает "недействительный сеанс". Разве это не правильный способ использования функции in_array?

  • 3
    ->fetch() возвращает 1 строку. Вам нужно сделать это в цикле, чтобы создать массив, или использовать ->fetchAll() и проверить этот массив.
Теги:
arrays
pdo

2 ответа

2
Лучший ответ

->fetch() всегда возвращает одну строку, поэтому вам придется session_id каждый session_id. Вы бы сделали что-то вроде этого:

Отредактировано: эффективный подход

Предположим, что таблица ваших sessions имеет 1000 записей, а ваши $session_id соответствуют первой записи в таблице. В этом случае цикл while() не будет оцениваться 1000 раз, когда совпадение найдено, оно вырвется из цикла.

$course_id = 1;

$sessions_query = $db->prepare("SELECT session_id FROM sessions WHERE course_id=:course_id");
$sessions_query ->bindValue(':course_id', $course_id, PDO::PARAM_INT);
$sessions_query ->execute();

$session_id = 1;

$session_value_exists = false;
while($sessions = $sessions_query->fetch(PDO::FETCH_ASSOC)){
    if ($session_id == $sessions['session_id'])) {
        $session_value_exists = true;
        break;    
    }
}
if($session_value_exists){
    echo "valid session";
}else{
    echo "invalid session";
}
1

Поскольку PDOStatement::fetch() возвращает одну строку, вам необходимо выполнить цикл над возвращаемым набором, чтобы сначала создать массив.

$course_id = 1;

$sessions_query = $db->prepare("SELECT session_id FROM sessions WHERE course_id=:course_id");
$sessions_query ->bindValue(':course_id', $course_id, PDO::PARAM_INT);
$sessions_query ->execute();
$sessions = array();
while($row = $sessions_query ->fetch(PDO::FETCH_ASSOC)){
    $sessions[] = $row['session_id'];
}

$session_id = 1;

if (in_array($session_id, $sessions)) {
    echo "Valid session";
}
else {
    echo "Invalid session";
}
  • 0
    Это не эффективный метод поиска. Предположим, что таблица sessions имеет 1000 записей, а session_id пользователя соответствует 1-й записи, даже в этом случае цикл while() будет оцениваться 1000 раз. Скорее, когда совпадение найдено, оно должно выйти из цикла.
  • 1
    @RajdeepPaul вы правы. В этой ситуации это может быть незначительным, как будто в course было 1000 человек, я мог бы перейти в другой школьный класс.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню