Оператор 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);
А затем обновите ваш вопрос с выводом. Похоже, ваша база данных содержит не совсем то, что вы думаете.