Извлечение идентификаторов из cookie, затем с помощью запроса NOT IN sql не работает с переменной

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

Например.

Первое изображение: Cookie = 0;

Для каждого после: Cookie = 0,3,4,6,1,44,2

и т.п.

Затем я проверяю этот файл cookie, получаю значение и пытаюсь вставить его в запрос:

$value = 0;
// check for cookie
if ( isset($_COOKIE['viewed']) ) {
$value = $_COOKIE['viewed'];
}

$stmt = $conn->prepare("SELECT * FROM images where id NOT IN (:viewed) ORDER BY rand() LIMIT 1");
$stmt->execute([':viewed' => $value]);

Но это не оказывает никакого влияния на возвращаемый результат.

Если я жестко закодирую NOT IN в (1,2,4), то это исключит эти результаты.

В моем возвращении JSON я проверяю, что это за строка:

$return['cookie'] = $value;

И значение показывает:

"cookie":"0,3,3,2,2,2,2,3,2,2,1,1,1,1,2,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,3,1,3,2,2,3,3,2,2,3,2,2,2,1"

Как я могу заставить это работать?

0

Решение

Попробуй это:

$value = 0;
// check for cookie
if ( isset($_COOKIE['viewed']) ) {
$value = $_COOKIE['viewed'];
}

$stmt = $conn->prepare("SELECT * FROM images where id NOT IN (:viewed) ORDER BY rand() LIMIT 1");
$stmt->execute(array(':viewed' => $value));

PDO :: execute () принимает значение только в массиве.
увидеть: http://php.net/manual/en/pdostatement.execute.php

1

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

Вероятно, это связано с самим параметром $ value. PHP является свободно типизированным языком

$stmt = $conn->prepare("SELECT * FROM images where id NOT IN (:viewed) ORDER BY rand() LIMIT 1");
$stmt->execute([':viewed' => $value]);
// Here $value is something not evaluated

Вместо этого сделайте это

$valueArr = $value.explode(",");
$notIn = "";

for($i=0; $i<$valueArr.count(); $i++){
$notIn .= $valueArr[$i]
}
$stmt = $conn->prepare("SELECT * FROM images where id NOT IN (:viewed) ORDER BY rand() LIMIT 1");
$stmt->execute([':viewed' => rtrim($notIn), ","]);
0

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