A несколько замечаний, которые я замечаю:
implode()
принимает массив и превращается в строку. В зависимости от того, что $onlist
есть, вы, вероятно, захотите explode()
(если это строка) или просто используйте его как есть (если это массив). Я собираюсь предположить, что это строка, разделенная запятыми.
mysql_*
методы устарели. Вы должны использовать альтернативы, такие как mysqli_*
.
- Запрос MySQL получает все строки строк, где
id
- $newarray
. Он должен получать вместо этого все строки, где id
- $key
.
- Поскольку вас интересует только поле
id
из базы данных, вы должны запросить только этот столбец (в противном случае вы перемещаете все остальные столбцы без причины).
- Похоже, что в вашем столе
id
- уникальное значение. Вероятно, вы можете сохранить некоторую обработку и просто захватить первую возвращенную строку (если она есть).
- Вы пересылаете
$existing
каждый раз, когда вы проверяете новый id
. Вы только хотите сбросить его один раз в начале.
- Ваша функция
example
принимает $link
переменную, которая никогда не используется.
Таким образом, на основе всего этого, вот версия кода, который должен работать:
function example($link, $onlist)
{
// Convert the comma-separated string to an array
$newarray = explode(',', $onlist);
// Start an empty array
$existing = array();
// Collect all the ids that are found in the database
foreach ($newarray as $key)
{
$query = mysqli_query("SELECT `id` FROM `table` WHERE `id` = '" . $key . "';");
if($cz = mysqli_fetch_assoc($query))
{
$existing[] = $cz['id'];
}
}
// Get only the ids that were NOT found
$ex = array_diff($newarray, $existing);
return $ex;
}
Одна важная вещь, чтобы отметить с вашей стратегии является то, что вы будете делать один MySQL запрос для каждый идентификатор, который вы хотите сопоставить. Вы также можете сделать это в одном запросе, который часто будет гораздо лучше для работы, особенно если id
является индексом в таблицу:
function example($link, $onlist)
{
// Convert $onlist from "a,b,c,1,2,3" to "'a','b','c','1','2','3'"
$tmp_array = explode(',', $onlist);
$onlist = "'" . implode("','", $tmp_array) . "'";
// Start an empty array
$existing = array();
// Get *all* rows that have *any* of the IDs in $onlist
$query = mysqli_query("SELECT `id` FROM `table` WHERE `id` IN (" . $key . ");");
while($cz = mysqli_fetch_assoc($query))
{
$existing[] = $cz['id'];
}
// Keep only the ids that were NOT found
$ex = array_diff($newarray, $existing);
return $ex;
}
$ существующий массив должен быть объявлен вне цикла. и проверьте значения $ existing array, используя функции отладки, такие как print_r или var_dump. Используйте, как оно есть вместо implode – Sundar