Почему не идет выборка из базы?

292
09 февраля 2017, 02:49

Здравствуйте. Есть таблица 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 устарела - я в курсе, проект древний, вношу правки.

Буду очень благодарен за помощь.

Answer 1

Вот решение. Надеюсь.

<?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'";

Тут можно тогда не приводить к единому виду. Но лучше всё же привести.

READ ALSO
Инвертировать запрос

Инвертировать запрос

Есть регулярное выражение вида

280
Обновление текста при нажатии checkbox

Обновление текста при нажатии checkbox

Есть код обновления адресной ссылки по нажатию на checkbox

276
Крик отчаяния от беспомощности [требует правки]

Крик отчаяния от беспомощности [требует правки]

Народ, прошу вашей помощиЯ хочу стать веб-разработчиком

228