Оператор MASS WHERE/IN, как обрабатывать пустые / возвращенные данные, а также совпадения?

У меня есть вопрос, я надеюсь, что вы можете помочь мне с..

Я делаю большой оператор SELECT с использованием WHERE/IN и передаю массив $ для всех "поисковых терминов", которые будут использоваться.

быстрый пример.. (хотя в конце массив $ намного больше)

$harNumArray = (0100001943,0100001944,0100002392,0100007414,0100012110,0100015761,0100015835);
$harNumArray2 = implode(',', $harNumArray);
$results  = mysqli_query($mysqli, "SELECT har_id, guar_num FROM placements WHERE har_id IN ($harNumArray2)");

//**outputting the matches values/data from the search (select)**

while ($row = mysqli_fetch_assoc($results)) {
    //echo "HAR_ID: ". $row["har_id"]. "\tGUAR_NUM: " . $row["guar_num"] . "\r\n<BR>";
    echo $row["har_id"]. "\t" . $row["guar_num"] . "\r\n<BR>";
    fwrite($fh, $row["har_id"] . "\t" . $row["guar_num"] . "\r\n");
} 

и это работает отлично / отлично (* спасибо msturdy за подсказку)... 'когда' совпадение есть.. если совпадения нет.. ничего не возвращается.

Однако.. если, например, первое значение в $harNumArray (индекс 0) не было найдено в базе данных... ничего не возвращается в $row = mysqli_fetch_assoc(цикл результатов...

ТОЛЬКО найденные числа.. и их соответствующие / связанные данные, которые были извлечены из БД с ним..

Я хотел бы, чтобы это было так до сих пор:

  • 0100001943 ^ - // пропущенный / горячий найденный номер (запись) в БД, но все еще использующий исходный поисковый термин в первой позиции)
  • 0100001944 ^ 0123467894
  • 0100002392 ^ 0011122234
  • 0100007414 ^ 0002130567
  • 0100012110 ^ 0000045432
  • 0100015761 ^ 0001000045
  • 0100015835 ^ 0998775233

Или, как это было бы приемлемо (но выше макет будет лучше):

  • - ^ - // отсутствует / горячий найденный номер (запись) в БД
  • 0100001944 ^ 0123467894
  • 0100002392 ^ 0011122234
  • 0100007414 ^ 0002130567
  • 0100012110 ^ 0000045432
  • 0100015761 ^ 0001000045
  • 0100015835 ^ 0998775233

Если первое число в массиве $ harNumArray не найдено в WHERE/IN SELECT.., оно ничего не возвращает (что имеет смысл)..

однако... мне "нужно" учесть несоответствия.. и вставить пробел (или что-то).. чтобы сохранить интервал / порядок окончательного "списка" (текстовый файл)

Как я могу сделать это?

Спасибо!

РЕДАКТИРОВАТЬ::

здесь текущее состояние кода: (по-прежнему не найдено совпадений)

@Cal

//stack overflow approach:
    //format array data
    $harNumArray2 = "'" . implode("','", $harNumArray) . "'";    //single quotes
    //$harNumArray2 = implode(',', $harNumArray);  //no quotes
    //$harNumArray2 = '"' . implode('","', $harNumArray) . '"';  //double quotes
    //print_r("ARRAY CHECK: " . $harNumArray2);

    $results = mysqli_query($mysqli, "SELECT har_id, guar_num FROM placements WHERE har_id IN ($harNumArray2) ORDER BY har_id ASC") or die(mysql_error());
    //$results = mysqli_query($mysqli, "SELECT har_id, guar_num FROM placements WHERE har_id IN (" . $harNumArray2 . ") ORDER BY har_id ASC") or die(mysql_error());

    echo("<BR>");
    print_r("SELECT har_id, guar_num FROM placements WHERE har_id IN ($harNumArray2)");
    echo("<BR>");

    $rows = array();
    while($row = mysqli_fetch_assoc($results)) {
        $rows[$row['har_id']] = $row;
    }
    foreach ($harNumArray as $id){
        if (isset($rows[$id])){
            //... do something with $rows[$id]
            print_r($rows[$id] . "<BR>");

        }else{
            //... no match for $id
            print_r("....no match....");
            echo("<BR>");
        }
    }

все равно никакое совпадение не возвращается... неважно, одинарные кавычки, нет кавычек или двойные кавычки..

тупик?

Спасибо

ОБНОВЛЕНИЕ II:

@ кальцит

хорошо, я запустил код, который вы предоставили..

это был мой вывод:

Array ([har_id] => 000100007537 [guar_num] => 0000676798) Array ([har_id] => 000100007538 [guar_num] => 0000676798) Array ([har_id] => 000100007539 [guar_num] => 0000676798) Array (har_id) => 000100007768 [guar_num] => 0000675266) Array ([har_id] => 000100007769 [guar_num] => 0000675266)

HAR_ID в БД = varchar(12)

GUAR_NUM в БД = varchar(12)

если я оставлю OFF в кавычках в запросе #results.. я получу возврат данных.. (но не смотря ни на что.. совпадений не найдено)

1 ответ

Выполните ваш запрос:

$harNumArray = array(
    '0100001943',
    '0100001944',
    '0100002392',
    '0100007414',
    '0100012110',
);
$harNumArray2 = "'".implode("','", $harNumArray)."'";
$results = mysqli_query($mysqli, "SELECT har_id, guar_num FROM placements WHERE har_id IN ($harNumArray2)");

Затем постройте карту ваших результатов:

$rows = array();
while ($row = mysqli_fetch_assoc($results)) {
    $rows[$row['har_id']] = $row;
}

Затем вы можете просмотреть свои идентификаторы, проверяя совпадения:

foreach ($harNumArray as $id){

    if (isset($rows[$id])){
        ... do something with $rows[$id]
    }else{
        ... no match for $id
    }
}

ОБНОВЛЕНИЕ 1:

Похоже, ваш запрос ничего не возвращает. Запустите этот код:

$results = mysqli_query($mysqli, "SELECT har_id, guar_num FROM placements LIMIT 5");
while ($row = mysqli_fetch_assoc($results)) print_r($row);

А затем обновите ваш вопрос с выводом. Похоже, ваша база данных содержит не совсем то, что вы думаете.

Другие вопросы по тегам