Здравствуйте. Есть таблица prod , в ней ячейка id_specz , в которой значение 3,2,1
Я делаю выборку из базы следующим запросом:
$vib = mysql_query("SELECT * FROM `prod` WHERE `id_specz` IN (".$numbers.") ORDER BY `id` DESC");
Если переменная $numbers = 3 - запись находит. А если переменная = 2 или 1 - запись не находит. Еще нужно учесть то, что переменная $numbers может иметь значения 2,3 или 1,3 и так далее.
Что я делаю не так? P.S. О том что MySQL устарела - я в курсе, проект древний, вношу правки.
Буду очень благодарен за помощь.
Вот решение. Надеюсь.
<?php
require_once 'ФАЙЛ_ПОДКЛЮЧЕНИЯ_К_БД.php'; //подключение к БД
//$connection - это переменная с подключением. У вас, возможно, другая.
//Получаем и упорядочиваем данные из БД
$query = "SELECT prod.id, prod.id_specz FROM prod";
$result = $connection->query($query);
if (!$result) {die($connection->error);};
$new_arr=[]; //массив с уже отстортированными данными
while ($myrow = $result->fetch_array(MYSQLI_ASSOC)) {
$id_specz=$myrow['id_specz'];
if (iconv_strlen($id_specz)>1) {
$d=explode(',', $id_specz); //режем строку по запятой
sort($d); //спортируем знаечения по возрастанию
$id_specz=implode(',', $d); //соединяем в строку
}
$new_arr[$myrow['id']]=$id_specz;
};
unset($result); //удаляем ненужное
//Теперь обновим БД. Используем транзакцию, чтобы гарантировать запись.
//Тут я использую одну для всей работы. Но если база большая, то лучше разбить на несколько частей и использовать подготовленные выражения (погуглите)
$connection->autocommit(false);
foreach ($new_arr as $key => $value) {
$query = "UPDATE prod SET id_specz = '$value' WHERE id = '$key' LIMIT 1";
$result = $connection->query($query);
if (!$result) {die($connection->error);};
}
if (!$connection->commit()) {die($connection->error);};
//Теперь у нас в БД всё упорядочено и приведено к единому виду. Можно с ними работать нормально.
$want_to_find='1,2'; //ищем такую строку
$query = "SELECT * FROM prod WHERE prod.id_specz = '$want_to_find'";
$result = $connection->query($query);
if (!$result) {die($connection->error);};
while ($myrow = $result->fetch_array(MYSQLI_ASSOC)) {
echo $myrow['id'].'<br>';
};
?>
Если нужно искать все варианты (т.е. если вы хотите найти все записи, где есть 2 - например 1,2,3 или 1,2), то используйте
$query = "SELECT * FROM prod WHERE prod.id_specz SOUNDS LIKE '$want_to_find'";
Тут можно тогда не приводить к единому виду. Но лучше всё же привести.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Есть код обновления адресной ссылки по нажатию на checkbox
Народ, прошу вашей помощиЯ хочу стать веб-разработчиком