Я пытаюсь заменить кусок кода с жестко закодированными именами полей на тот, который динамически получает имена полей из запроса и работает в основном, но только до определенного момента, затем я получаю сообщение об ошибке.Это код, который я пытаюсь заменить циклом foreach с именами полей, который создает предложение WHERE:
if (strlen($Where) == 0 ) $Where .= " WHERE (";
$Where .= "(" . $StorageArea . ")";
if (strlen($Where) > 0 ) $Where .= " AND ";
$Where .= " (" . $StorageArea . ")";
if (strlen($Location))
$Where .= " OR (". $Location .")";
if (strlen($Size))
$Where .= " OR (". $Size .")";
if (strlen($Winery))
$Where .= " OR (". $Winery .")";
if (strlen($Brand))
$Where .= " OR (". $Brand .")";
if (strlen($Appellation))
$Where .= " OR (". $Appellation .")";
if (strlen($ReleaseYear))
$Where .= " OR (". $ReleaseYear .")";
if (strlen($Varietal))
$Where .= " OR (". $Varietal .")";
if (strlen($Status))
$Where .= " OR (". $Status .")";
if (strlen($CountryName))
$Where .= " OR (". $CountryName .")";
$Where .= " ) ";
Если нет опечатки, которую я пропустил, я не вижу проблемыздесь, в этом (пока не проверенном) цикле foreach, так может кто-нибудь посоветовать?Чтобы сохранить это просто и избежать большого количества if if, он использует как однострочные условные выражения, так и более обычные операторы ififif с использованием: и endif вместо {и}.Есть ли какое-то ограничение этого типа условного?Я всегда думал, что они являются взаимозаменяемыми, но, видимо, нет.
$i = 1;
$len = count(array_keys($queryField));
foreach (array_keys($queryField) as $row) :
$i++:
if ($row === 'ID') continue;
if ($i == 1) :
if (strlen($Where) == 1) $Where .= " WHERE (";
$Where .= " (" . $$row . ") ";
if (strlen($Where) > 1) $Where .= " AND ";
elseif ($i > 1 && $i != $len) :
if (strlen($$row)) $Where .= " OR (". $$row .")";
elseif ($i == $len) :
if (strlen($$row)) $Where .= " OR (". $$row .")";
$Where .= ")";
endif;
endforeach;
Ошибка: Ошибка синтаксического анализа: синтаксическая ошибка, неожиданная ':' , которую он дает в elseif ($ i> 1 && $ i! = $ Len): строка.Я пока не уверен, что это будет делать то, что я хочу, но я не могу попробовать, пока не получу его работу.
$ queryField - это запрос с результатами, как показано ниже, и функция захватывает имена полей изit
Array
(
[ID] => 3
[StorageArea] => CAB-1
[Size] =>
[Winery] => Name
[Brand] => Fanciful Name
[Appellation] =>
[ReleaseYear] => 2008
[Varietal] => Cuvée
[Status] => Library
[CountryName] =>
)
Благодаря комментариям и ответам, полученным для того, чтобы вышеуказанное сработало, я понял, что это не работает, как я ожидал, поэтому я переосмыслил это и придумал что-то совершенно другое, что работает.Поскольку это не совсем ответ, я публикую его здесь как квази-ответ, и самое интересное было попытаться узнать, сколько раз внутренний цикл был зациклен.К этому есть и другие разделы для Все ключевые слова или Точная фраза , но этот бит очень похож на те, поэтому нет необходимости размещать их все.$ Где объявляется ранее в функции, из которой был извлечен этот код, поэтому здесь он не показан.
Для моего основного вопроса о смешивании условных типов, очевидно, смешивание if и endif с однострочными условными выражениями невозможно ичто {и} рекомендуются для программирования не на основе HTML, но я действительно хотел, чтобы все было одинаково, поэтому для этой версии все однострочные условные выражения внутри циклов foreach, поэтому ошибок нет.
$keywords = explode(" ", trim($keyword));
// Get number of passes for inner loop
// Subtract one because ID column is not being used
$len = ((count(array_keys($queryField))-1) * count($keywords));
$i = - (count($keywords)); // Subtract number of keywords
if (strlen($keyword)) :
// Any Keywords
foreach ($keywords as $keyword) :
$keyword = str_replace("'", "''", trim($keyword));
foreach (array_keys($queryField) as $column) :
$i++;
if ($column === 'ID') continue;
if (strlen($Where) == 0) $Where .= " WHERE (";
if ($i != $len) $Where .= "(`$column` LIKE '%" . $keyword . "%') OR ";
if ($i == $len) $Where .= "(`$column` LIKE '%" . $keyword . "%') ";
endforeach;
endforeach;
endif;